forked from qt-creator/qt-creator
Debugger: Simplify TypeData setup and registration
Change-Id: Ib23249eae63901d614cbe33fe184f174a10efbe4 Reviewed-by: hjk <hjk@qt.io> Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -162,13 +162,11 @@ class Dumper(DumperBase):
|
|||||||
return self.createArrayType(targetType, nativeType.arrayElements())
|
return self.createArrayType(targetType, nativeType.arrayElements())
|
||||||
code = TypeCode.Struct
|
code = TypeCode.Struct
|
||||||
|
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, typeId)
|
||||||
tdata.name = nativeType.name()
|
tdata.name = nativeType.name()
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.lbitsize = nativeType.bitsize()
|
tdata.lbitsize = nativeType.bitsize()
|
||||||
tdata.code = code
|
tdata.code = code
|
||||||
tdata.moduleName = nativeType.module()
|
tdata.moduleName = nativeType.module()
|
||||||
self.registerType(typeId, tdata) # Prevent recursion in fields.
|
|
||||||
if code == TypeCode.Struct:
|
if code == TypeCode.Struct:
|
||||||
tdata.lfields = lambda value: \
|
tdata.lfields = lambda value: \
|
||||||
self.listFields(nativeType, value)
|
self.listFields(nativeType, value)
|
||||||
@@ -179,7 +177,6 @@ class Dumper(DumperBase):
|
|||||||
self.nativeTypeEnumDisplay(nativeType, intval, form)
|
self.nativeTypeEnumDisplay(nativeType, intval, form)
|
||||||
tdata.templateArguments = lambda: \
|
tdata.templateArguments = lambda: \
|
||||||
self.listTemplateParameters(nativeType.name())
|
self.listTemplateParameters(nativeType.name())
|
||||||
self.registerType(typeId, tdata) # Fix up fields and template args
|
|
||||||
return self.Type(self, typeId)
|
return self.Type(self, typeId)
|
||||||
|
|
||||||
def listFields(self, nativeType, value):
|
def listFields(self, nativeType, value):
|
||||||
@@ -388,8 +385,8 @@ class Dumper(DumperBase):
|
|||||||
if nativeType is None:
|
if nativeType is None:
|
||||||
return None
|
return None
|
||||||
_type = self.fromNativeType(nativeType)
|
_type = self.fromNativeType(nativeType)
|
||||||
if _type.name != typeName:
|
if _type.typeId != typeName:
|
||||||
self.registerType(typeName, _type.tdata)
|
self.registerTypeAlias(_type.typeId, typeName)
|
||||||
return _type
|
return _type
|
||||||
return self.Type(self, typeName)
|
return self.Type(self, typeName)
|
||||||
|
|
||||||
|
@@ -422,24 +422,18 @@ class DumperBase():
|
|||||||
return None if nativeType is None else self.fromNativeType(nativeType)
|
return None if nativeType is None else self.fromNativeType(nativeType)
|
||||||
|
|
||||||
def registerKnownTypes(self):
|
def registerKnownTypes(self):
|
||||||
typeId = 'unsigned short'
|
tdata = self.TypeData(self, 'unsigned short')
|
||||||
tdata = self.TypeData(self)
|
|
||||||
tdata.name = typeId
|
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.lbitsize = 16
|
tdata.lbitsize = 16
|
||||||
|
tdata.lalignment = 2
|
||||||
tdata.code = TypeCode.Integral
|
tdata.code = TypeCode.Integral
|
||||||
self.registerType(typeId, tdata)
|
|
||||||
|
|
||||||
typeId = 'QChar'
|
tdata = self.TypeData(self, 'QChar')
|
||||||
tdata = self.TypeData(self)
|
|
||||||
tdata.name = typeId
|
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.lbitsize = 16
|
tdata.lbitsize = 16
|
||||||
|
tdata.lalignment = 2
|
||||||
tdata.code = TypeCode.Struct
|
tdata.code = TypeCode.Struct
|
||||||
tdata.lfields = [self.Field(dumper=self, name='ucs',
|
tdata.lfields = [self.Field(dumper=self, name='ucs',
|
||||||
type='unsigned short', bitsize=16, bitpos=0)]
|
type='unsigned short', bitsize=16, bitpos=0)]
|
||||||
tdata.lalignment = 2
|
tdata.templateArguments = lambda: []
|
||||||
self.registerType(typeId, tdata)
|
|
||||||
|
|
||||||
def nativeDynamicType(self, address, baseType):
|
def nativeDynamicType(self, address, baseType):
|
||||||
return baseType # Override in backends.
|
return baseType # Override in backends.
|
||||||
@@ -3462,19 +3456,12 @@ class DumperBase():
|
|||||||
item_count = type_name[pos1 + 1:pos2]
|
item_count = type_name[pos1 + 1:pos2]
|
||||||
return (type_name[0:pos1].strip(), type_name[pos2 + 1:].strip(), int(item_count))
|
return (type_name[0:pos1].strip(), type_name[pos2 + 1:].strip(), int(item_count))
|
||||||
|
|
||||||
def registerType(self, typeId, tdata):
|
|
||||||
#DumperBase.warn('REGISTER TYPE: %s' % typeId)
|
|
||||||
self.typeData[typeId] = tdata
|
|
||||||
#typeId = typeId.replace(' ', '')
|
|
||||||
#self.typeData[typeId] = tdata
|
|
||||||
#DumperBase.warn('REGISTERED: %s' % self.typeData)
|
|
||||||
|
|
||||||
def registerTypeAlias(self, existingTypeId, aliasId):
|
def registerTypeAlias(self, existingTypeId, aliasId):
|
||||||
#DumperBase.warn('REGISTER ALIAS %s FOR %s' % (aliasId, existingTypeId))
|
#DumperBase.warn('REGISTER ALIAS %s FOR %s' % (aliasId, existingTypeId))
|
||||||
self.typeData[aliasId] = self.typeData[existingTypeId]
|
self.typeData[aliasId] = self.typeData[existingTypeId]
|
||||||
|
|
||||||
class TypeData():
|
class TypeData():
|
||||||
def __init__(self, dumper):
|
def __init__(self, dumper, type_id):
|
||||||
self.dumper = dumper
|
self.dumper = dumper
|
||||||
self.lfields = None # None or Value -> list of member Values
|
self.lfields = None # None or Value -> list of member Values
|
||||||
self.lalignment = None # Function returning alignment of this struct
|
self.lalignment = None # Function returning alignment of this struct
|
||||||
@@ -3482,13 +3469,15 @@ class DumperBase():
|
|||||||
self.ltarget = None # Inner type for arrays
|
self.ltarget = None # Inner type for arrays
|
||||||
self.templateArguments = None
|
self.templateArguments = None
|
||||||
self.code = None
|
self.code = None
|
||||||
self.name = None
|
self.name = type_id
|
||||||
self.typeId = None
|
self.typeId = type_id
|
||||||
self.enumDisplay = None
|
self.enumDisplay = None
|
||||||
self.moduleName = None
|
self.moduleName = None
|
||||||
|
#DumperBase.warn('REGISTER TYPE: %s' % type_id)
|
||||||
|
dumper.typeData[type_id] = self
|
||||||
|
|
||||||
def copy(self):
|
def copy(self):
|
||||||
tdata = self.dumper.TypeData(self.dumper)
|
tdata = self.dumper.TypeData(self.dumper, self.typeId)
|
||||||
tdata.dumper = self.dumper
|
tdata.dumper = self.dumper
|
||||||
tdata.lfields = self.lfields
|
tdata.lfields = self.lfields
|
||||||
tdata.lalignment = self.lalignment
|
tdata.lalignment = self.lalignment
|
||||||
@@ -3791,13 +3780,11 @@ class DumperBase():
|
|||||||
raise RuntimeError('Expected type in createPointerType(), got %s'
|
raise RuntimeError('Expected type in createPointerType(), got %s'
|
||||||
% type(targetType))
|
% type(targetType))
|
||||||
typeId = targetType.typeId + ' *'
|
typeId = targetType.typeId + ' *'
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, typeId)
|
||||||
tdata.name = targetType.name + '*'
|
tdata.name = targetType.name + '*'
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.lbitsize = 8 * self.ptrSize()
|
tdata.lbitsize = 8 * self.ptrSize()
|
||||||
tdata.code = TypeCode.Pointer
|
tdata.code = TypeCode.Pointer
|
||||||
tdata.ltarget = targetType
|
tdata.ltarget = targetType
|
||||||
self.registerType(typeId, tdata)
|
|
||||||
return self.Type(self, typeId)
|
return self.Type(self, typeId)
|
||||||
|
|
||||||
def createReferenceType(self, targetType):
|
def createReferenceType(self, targetType):
|
||||||
@@ -3805,14 +3792,12 @@ class DumperBase():
|
|||||||
raise RuntimeError('Expected type in createReferenceType(), got %s'
|
raise RuntimeError('Expected type in createReferenceType(), got %s'
|
||||||
% type(targetType))
|
% type(targetType))
|
||||||
typeId = targetType.typeId + ' &'
|
typeId = targetType.typeId + ' &'
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, typeId)
|
||||||
tdata.name = targetType.name + ' &'
|
tdata.name = targetType.name + ' &'
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.code = TypeCode.Reference
|
tdata.code = TypeCode.Reference
|
||||||
tdata.ltarget = targetType
|
tdata.ltarget = targetType
|
||||||
tdata.lbitsize = 8 * self.ptrSize() # Needed for Gdb13393 test.
|
tdata.lbitsize = 8 * self.ptrSize() # Needed for Gdb13393 test.
|
||||||
#tdata.lbitsize = None
|
#tdata.lbitsize = None
|
||||||
self.registerType(typeId, tdata)
|
|
||||||
return self.Type(self, typeId)
|
return self.Type(self, typeId)
|
||||||
|
|
||||||
def createRValueReferenceType(self, targetType):
|
def createRValueReferenceType(self, targetType):
|
||||||
@@ -3820,13 +3805,11 @@ class DumperBase():
|
|||||||
raise RuntimeError('Expected type in createRValueReferenceType(), got %s'
|
raise RuntimeError('Expected type in createRValueReferenceType(), got %s'
|
||||||
% type(targetType))
|
% type(targetType))
|
||||||
typeId = targetType.typeId + ' &&'
|
typeId = targetType.typeId + ' &&'
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, typeId)
|
||||||
tdata.name = targetType.name + ' &&'
|
tdata.name = targetType.name + ' &&'
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.code = TypeCode.RValueReference
|
tdata.code = TypeCode.RValueReference
|
||||||
tdata.ltarget = targetType
|
tdata.ltarget = targetType
|
||||||
tdata.lbitsize = None
|
tdata.lbitsize = None
|
||||||
self.registerType(typeId, tdata)
|
|
||||||
return self.Type(self, typeId)
|
return self.Type(self, typeId)
|
||||||
|
|
||||||
def createArrayType(self, targetType, count):
|
def createArrayType(self, targetType, count):
|
||||||
@@ -3843,13 +3826,11 @@ class DumperBase():
|
|||||||
type_id = '%s[%d]' % (targetTypeId, count)
|
type_id = '%s[%d]' % (targetTypeId, count)
|
||||||
type_name = '%s[%d]' % (targetType.name, count)
|
type_name = '%s[%d]' % (targetType.name, count)
|
||||||
|
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, type_id)
|
||||||
tdata.name = type_name
|
tdata.name = type_name
|
||||||
tdata.typeId = type_id
|
|
||||||
tdata.code = TypeCode.Array
|
tdata.code = TypeCode.Array
|
||||||
tdata.ltarget = targetType
|
tdata.ltarget = targetType
|
||||||
tdata.lbitsize = targetType.lbitsize * count
|
tdata.lbitsize = targetType.lbitsize * count
|
||||||
self.registerType(type_id, tdata)
|
|
||||||
return self.Type(self, type_id)
|
return self.Type(self, type_id)
|
||||||
|
|
||||||
def createBitfieldType(self, targetType, bitsize):
|
def createBitfieldType(self, targetType, bitsize):
|
||||||
@@ -3857,13 +3838,11 @@ class DumperBase():
|
|||||||
raise RuntimeError('Expected type in createBitfieldType(), got %s'
|
raise RuntimeError('Expected type in createBitfieldType(), got %s'
|
||||||
% type(targetType))
|
% type(targetType))
|
||||||
typeId = '%s:%d' % (targetType.typeId, bitsize)
|
typeId = '%s:%d' % (targetType.typeId, bitsize)
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, typeId)
|
||||||
tdata.name = '%s : %d' % (targetType.typeId, bitsize)
|
tdata.name = '%s : %d' % (targetType.typeId, bitsize)
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.code = TypeCode.Bitfield
|
tdata.code = TypeCode.Bitfield
|
||||||
tdata.ltarget = targetType
|
tdata.ltarget = targetType
|
||||||
tdata.lbitsize = bitsize
|
tdata.lbitsize = bitsize
|
||||||
self.registerType(typeId, tdata)
|
|
||||||
return self.Type(self, typeId)
|
return self.Type(self, typeId)
|
||||||
|
|
||||||
def createTypedefedType(self, targetType, typeName, typeId=None):
|
def createTypedefedType(self, targetType, typeName, typeId=None):
|
||||||
@@ -3875,15 +3854,13 @@ class DumperBase():
|
|||||||
# Happens for C-style struct in GDB: typedef { int x; } struct S1;
|
# Happens for C-style struct in GDB: typedef { int x; } struct S1;
|
||||||
if targetType.typeId == typeId:
|
if targetType.typeId == typeId:
|
||||||
return targetType
|
return targetType
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, typeId)
|
||||||
tdata.name = typeName
|
tdata.name = typeName
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.code = TypeCode.Typedef
|
tdata.code = TypeCode.Typedef
|
||||||
tdata.ltarget = targetType
|
tdata.ltarget = targetType
|
||||||
tdata.lbitsize = targetType.lbitsize
|
tdata.lbitsize = targetType.lbitsize
|
||||||
#tdata.lfields = targetType.lfields
|
#tdata.lfields = targetType.lfields
|
||||||
tdata.lbitsize = targetType.lbitsize
|
tdata.lbitsize = targetType.lbitsize
|
||||||
self.registerType(typeId, tdata)
|
|
||||||
return self.Type(self, typeId)
|
return self.Type(self, typeId)
|
||||||
|
|
||||||
def knownArrayTypeSize(self):
|
def knownArrayTypeSize(self):
|
||||||
@@ -3939,9 +3916,7 @@ class DumperBase():
|
|||||||
return knownType
|
return knownType
|
||||||
|
|
||||||
#DumperBase.warn('FAKING: %s SIZE: %s' % (typish, size))
|
#DumperBase.warn('FAKING: %s SIZE: %s' % (typish, size))
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, typish)
|
||||||
tdata.name = typish
|
|
||||||
tdata.typeId = typish
|
|
||||||
tdata.templateArguments = lambda: self.listTemplateParameters(typish)
|
tdata.templateArguments = lambda: self.listTemplateParameters(typish)
|
||||||
if size is not None:
|
if size is not None:
|
||||||
tdata.lbitsize = 8 * size
|
tdata.lbitsize = 8 * size
|
||||||
@@ -3950,8 +3925,7 @@ class DumperBase():
|
|||||||
tdata.lbitsize = 8 * self.ptrSize()
|
tdata.lbitsize = 8 * self.ptrSize()
|
||||||
tdata.ltarget = self.createType(typish[:-1].strip())
|
tdata.ltarget = self.createType(typish[:-1].strip())
|
||||||
|
|
||||||
self.registerType(typish, tdata)
|
typeobj = self.Type(self, tdata.typeId)
|
||||||
typeobj = self.Type(self, typish)
|
|
||||||
#DumperBase.warn('CREATE TYPE: %s' % typeobj.stringify())
|
#DumperBase.warn('CREATE TYPE: %s' % typeobj.stringify())
|
||||||
typeobj.check()
|
typeobj.check()
|
||||||
return typeobj
|
return typeobj
|
||||||
@@ -3979,11 +3953,8 @@ class DumperBase():
|
|||||||
raise RuntimeError('EXPECTING ADDRESS OR BYTES, GOT %s' % type(datish))
|
raise RuntimeError('EXPECTING ADDRESS OR BYTES, GOT %s' % type(datish))
|
||||||
|
|
||||||
def createProxyValue(self, proxy_data, type_name):
|
def createProxyValue(self, proxy_data, type_name):
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, type_name)
|
||||||
tdata.name = type_name
|
|
||||||
tdata.typeId = type_name
|
|
||||||
tdata.code = TypeCode.Struct
|
tdata.code = TypeCode.Struct
|
||||||
self.registerType(type_name, tdata)
|
|
||||||
val = self.Value(self)
|
val = self.Value(self)
|
||||||
val._type = self.Type(self, type_name)
|
val._type = self.Type(self, type_name)
|
||||||
val.ldata = proxy_data
|
val.ldata = proxy_data
|
||||||
|
@@ -367,9 +367,8 @@ class Dumper(DumperBase):
|
|||||||
typeId = self.nativeTypeId(nativeType)
|
typeId = self.nativeTypeId(nativeType)
|
||||||
res = self.typeData.get(typeId, None)
|
res = self.typeData.get(typeId, None)
|
||||||
if res is None:
|
if res is None:
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, typeId)
|
||||||
tdata.name = str(nativeType)
|
tdata.name = str(nativeType)
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.lbitsize = nativeType.sizeof * 8
|
tdata.lbitsize = nativeType.sizeof * 8
|
||||||
tdata.code = {
|
tdata.code = {
|
||||||
#gdb.TYPE_CODE_TYPEDEF : TypeCode.Typedef, # Handled above.
|
#gdb.TYPE_CODE_TYPEDEF : TypeCode.Typedef, # Handled above.
|
||||||
@@ -401,7 +400,6 @@ class Dumper(DumperBase):
|
|||||||
self.listMembers(value, nativeType)
|
self.listMembers(value, nativeType)
|
||||||
tdata.templateArguments = lambda: \
|
tdata.templateArguments = lambda: \
|
||||||
self.listTemplateParameters(nativeType)
|
self.listTemplateParameters(nativeType)
|
||||||
self.registerType(typeId, tdata) # Fix up fields and template args
|
|
||||||
# warn('CREATE TYPE: %s' % typeId)
|
# warn('CREATE TYPE: %s' % typeId)
|
||||||
#else:
|
#else:
|
||||||
# warn('REUSE TYPE: %s' % typeId)
|
# warn('REUSE TYPE: %s' % typeId)
|
||||||
|
@@ -434,8 +434,7 @@ class Dumper(DumperBase):
|
|||||||
if res is None:
|
if res is None:
|
||||||
# # This strips typedefs for pointers. We don't want that.
|
# # This strips typedefs for pointers. We don't want that.
|
||||||
# typeobj.nativeType = nativeType.GetUnqualifiedType()
|
# typeobj.nativeType = nativeType.GetUnqualifiedType()
|
||||||
tdata = self.TypeData(self)
|
tdata = self.TypeData(self, typeId)
|
||||||
tdata.typeId = typeId
|
|
||||||
tdata.name = typeName
|
tdata.name = typeName
|
||||||
tdata.lbitsize = nativeType.GetByteSize() * 8
|
tdata.lbitsize = nativeType.GetByteSize() * 8
|
||||||
if code == lldb.eTypeClassBuiltin:
|
if code == lldb.eTypeClassBuiltin:
|
||||||
@@ -471,8 +470,6 @@ class Dumper(DumperBase):
|
|||||||
tdata.code = TypeCode.Function
|
tdata.code = TypeCode.Function
|
||||||
elif code == lldb.eTypeClassMemberPointer:
|
elif code == lldb.eTypeClassMemberPointer:
|
||||||
tdata.code = TypeCode.MemberPointer
|
tdata.code = TypeCode.MemberPointer
|
||||||
|
|
||||||
self.registerType(typeId, tdata) # Fix up fields and template args
|
|
||||||
# warn('CREATE TYPE: %s' % typeId)
|
# warn('CREATE TYPE: %s' % typeId)
|
||||||
#else:
|
#else:
|
||||||
# warn('REUSE TYPE: %s' % typeId)
|
# warn('REUSE TYPE: %s' % typeId)
|
||||||
|
@@ -234,14 +234,14 @@ def qdump__QStandardItem(d, value):
|
|||||||
vtable, dptr = value.split('pp')
|
vtable, dptr = value.split('pp')
|
||||||
if d.qtVersion() >= 0x060000:
|
if d.qtVersion() >= 0x060000:
|
||||||
model, parent, values, children, rows, cols, item = \
|
model, parent, values, children, rows, cols, item = \
|
||||||
d.split('pp{@QList<@QStandardItemData>}{@QList<@QStandardItem*>}IIp', dptr)
|
d.split('pp{@QList<@QStandardItemData>}{@QList<@QStandardItem *>}IIp', dptr)
|
||||||
else:
|
else:
|
||||||
# There used to be a virtual destructor that got removed in
|
# There used to be a virtual destructor that got removed in
|
||||||
# 88b6abcebf29b455438 on Apr 18 17:01:22 2017
|
# 88b6abcebf29b455438 on Apr 18 17:01:22 2017
|
||||||
if d.qtVersion() < 0x050900 and not d.isMsvcTarget():
|
if d.qtVersion() < 0x050900 and not d.isMsvcTarget():
|
||||||
dptr += d.ptrSize();
|
dptr += d.ptrSize();
|
||||||
model, parent, values, children, rows, cols, item = \
|
model, parent, values, children, rows, cols, item = \
|
||||||
d.split('pp{@QVector<@QStandardItemData>}{@QVector<@QStandardItem*>}IIp', dptr)
|
d.split('pp{@QVector<@QStandardItemData>}{@QVector<@QStandardItem *>}IIp', dptr)
|
||||||
|
|
||||||
d.putEmptyValue()
|
d.putEmptyValue()
|
||||||
d.putExpandable()
|
d.putExpandable()
|
||||||
|
Reference in New Issue
Block a user