Debugger: fix QJSValue dumper for Qt >= 6.5

and disable the QV4::Value dumper for that version.

Change-Id: I31a0ddba2bdab3b196e4fc5298fd8e7c10f9dc92
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2023-02-27 14:33:57 +01:00
parent 8288a4c563
commit fb8182ca7c
2 changed files with 69 additions and 30 deletions

View File

@@ -2854,43 +2854,82 @@ def qdump_32__QJSValue(d, value):
def qdump_64__QJSValue_6(d, value):
dd = value.split('Q')[0]
typ = dd >> 47
if dd == 0:
d.putValue('(undefined)')
d.putType(value.type.name + ' (undefined)')
elif typ == 5:
d.putValue('(null)')
d.putType(value.type.name + ' (null)')
elif typ == 6:
d.putValue('true' if dd & 1 else 'false')
d.putType(value.type.name + ' (bool)')
elif typ == 7:
d.putValue(dd & 0xfffffffff)
d.putType(value.type.name + ' (int)')
elif typ > 7:
val = d.Value(d)
val.ldata = struct.pack('q', dd ^ 0xfffc000000000000)
val._type = d.createType('double')
d.putItem(val)
d.putType(value.type.name + ' (double)')
elif typ <= 3: # Heap
if dd & 1: # String
if d.qtVersion() < 0x60500:
typ = dd >> 47
if typ == 5:
d.putValue('(null)')
d.putType(value.type.name + ' (null)')
elif typ == 6:
d.putValue('true' if dd & 1 else 'false')
d.putType(value.type.name + ' (bool)')
elif typ == 7:
d.putValue(dd & 0xfffffffff)
d.putType(value.type.name + ' (int)')
elif typ > 7:
val = d.Value(d)
val.ldata = struct.pack('q', dd & ~1)
val._type = d.createType('@QString*')
val.ldata = struct.pack('q', dd ^ 0xfffc000000000000)
val._type = d.createType('double')
d.putItem(val)
d.putType(value.type.name + ' (QString)')
d.putType(value.type.name + ' (double)')
elif typ <= 3: # Heap
if dd & 1: # String
val = d.Value(d)
val.ldata = struct.pack('q', dd & ~1)
val._type = d.createType('@QString*')
d.putItem(val)
d.putType(value.type.name + ' (QString)')
else:
# FIXME: Arrays, Objects missing.
val = d.split('{@QV4::Managed*}', value)[0]
d.putItem(val)
d.putItemCount(1)
else:
# FIXME: Arrays, Objects missing.
val = d.split('{@QV4::Managed*}', value)[0]
d.putItem(val)
d.putEmptyValue()
d.putItemCount(1)
d.putPlainChildren(value)
return
else:
d.putEmptyValue()
d.putItemCount(1)
d.putPlainChildren(value)
return
typ = dd & 7
isPointer = typ & 1
if typ == 0:
d.putValue('(undefined)')
d.putType(value.type.name + ' (undefined)')
elif typ == 2:
d.putValue('(null)')
d.putType(value.type.name + ' (null)')
elif typ == 4:
d.putValue(dd >> 32)
d.putType(value.type.name + ' (int)')
elif typ == 6:
d.putValue('true' if dd >> 32 & 1 else 'false')
d.putType(value.type.name + ' (bool)')
elif isPointer:
pointer = dd >> 3
pointer = pointer << 3
val = d.Value(d)
val.ldata = struct.pack('q', pointer)
if typ == 1:
val._type = d.createType('double*')
d.putItem(val)
d.putType(value.type.name + ' (double)')
elif typ == 3:
val._type = d.createType('@QV4::Value*')
d.putItem(val)
d.putType(value.type.name + ' (QV4::Value)')
elif typ == 5:
val._type = d.createType('@QString*')
d.putItem(val)
d.putType(value.type.name + ' (QString)')
else:
d.putEmptyValue()
d.putItemCount(1)
d.putPlainChildren(value)
return
if d.isExpanded():
with Children(d):

View File

@@ -7910,7 +7910,7 @@ void tst_Dumpers::dumper_data()
+ QmlPrivateProfile()
+ QtVersion(0x50000)
+ Check("q2", FloatValue("2.5"), "@QV4::Value (double)")
+ Check("q2", FloatValue("2.5"), "@QV4::Value (double)") % QtVersion(0, 0x604ff)
//+ Check("v10", "(null)", "@QJSValue (null)") # Works in GUI. Why?
+ Check("v11", "true", "@QJSValue (bool)")
+ Check("v12", "1", "@QJSValue (int)")