From 37db98db30564818c12323b5a7398d12c2d446f5 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 23 Aug 2022 17:49:31 +0200 Subject: [PATCH] Debugger: Simplify TypeData setup and registration Change-Id: Ib23249eae63901d614cbe33fe184f174a10efbe4 Reviewed-by: hjk Reviewed-by: Christian Stenger --- share/qtcreator/debugger/cdbbridge.py | 9 ++-- share/qtcreator/debugger/dumper.py | 69 ++++++++------------------ share/qtcreator/debugger/gdbbridge.py | 4 +- share/qtcreator/debugger/lldbbridge.py | 5 +- share/qtcreator/debugger/qttypes.py | 4 +- 5 files changed, 27 insertions(+), 64 deletions(-) diff --git a/share/qtcreator/debugger/cdbbridge.py b/share/qtcreator/debugger/cdbbridge.py index b791139199d..173b5a60111 100644 --- a/share/qtcreator/debugger/cdbbridge.py +++ b/share/qtcreator/debugger/cdbbridge.py @@ -162,13 +162,11 @@ class Dumper(DumperBase): return self.createArrayType(targetType, nativeType.arrayElements()) code = TypeCode.Struct - tdata = self.TypeData(self) + tdata = self.TypeData(self, typeId) tdata.name = nativeType.name() - tdata.typeId = typeId tdata.lbitsize = nativeType.bitsize() tdata.code = code tdata.moduleName = nativeType.module() - self.registerType(typeId, tdata) # Prevent recursion in fields. if code == TypeCode.Struct: tdata.lfields = lambda value: \ self.listFields(nativeType, value) @@ -179,7 +177,6 @@ class Dumper(DumperBase): self.nativeTypeEnumDisplay(nativeType, intval, form) tdata.templateArguments = lambda: \ self.listTemplateParameters(nativeType.name()) - self.registerType(typeId, tdata) # Fix up fields and template args return self.Type(self, typeId) def listFields(self, nativeType, value): @@ -388,8 +385,8 @@ class Dumper(DumperBase): if nativeType is None: return None _type = self.fromNativeType(nativeType) - if _type.name != typeName: - self.registerType(typeName, _type.tdata) + if _type.typeId != typeName: + self.registerTypeAlias(_type.typeId, typeName) return _type return self.Type(self, typeName) diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index ff3783f3c90..22f3f732d87 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -422,24 +422,18 @@ class DumperBase(): return None if nativeType is None else self.fromNativeType(nativeType) def registerKnownTypes(self): - typeId = 'unsigned short' - tdata = self.TypeData(self) - tdata.name = typeId - tdata.typeId = typeId + tdata = self.TypeData(self, 'unsigned short') tdata.lbitsize = 16 + tdata.lalignment = 2 tdata.code = TypeCode.Integral - self.registerType(typeId, tdata) - typeId = 'QChar' - tdata = self.TypeData(self) - tdata.name = typeId - tdata.typeId = typeId + tdata = self.TypeData(self, 'QChar') tdata.lbitsize = 16 + tdata.lalignment = 2 tdata.code = TypeCode.Struct tdata.lfields = [self.Field(dumper=self, name='ucs', type='unsigned short', bitsize=16, bitpos=0)] - tdata.lalignment = 2 - self.registerType(typeId, tdata) + tdata.templateArguments = lambda: [] def nativeDynamicType(self, address, baseType): return baseType # Override in backends. @@ -3462,19 +3456,12 @@ class DumperBase(): item_count = type_name[pos1 + 1:pos2] 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): #DumperBase.warn('REGISTER ALIAS %s FOR %s' % (aliasId, existingTypeId)) self.typeData[aliasId] = self.typeData[existingTypeId] class TypeData(): - def __init__(self, dumper): + def __init__(self, dumper, type_id): self.dumper = dumper self.lfields = None # None or Value -> list of member Values self.lalignment = None # Function returning alignment of this struct @@ -3482,13 +3469,15 @@ class DumperBase(): self.ltarget = None # Inner type for arrays self.templateArguments = None self.code = None - self.name = None - self.typeId = None + self.name = type_id + self.typeId = type_id self.enumDisplay = None self.moduleName = None + #DumperBase.warn('REGISTER TYPE: %s' % type_id) + dumper.typeData[type_id] = self def copy(self): - tdata = self.dumper.TypeData(self.dumper) + tdata = self.dumper.TypeData(self.dumper, self.typeId) tdata.dumper = self.dumper tdata.lfields = self.lfields tdata.lalignment = self.lalignment @@ -3791,13 +3780,11 @@ class DumperBase(): raise RuntimeError('Expected type in createPointerType(), got %s' % type(targetType)) typeId = targetType.typeId + ' *' - tdata = self.TypeData(self) + tdata = self.TypeData(self, typeId) tdata.name = targetType.name + '*' - tdata.typeId = typeId tdata.lbitsize = 8 * self.ptrSize() tdata.code = TypeCode.Pointer tdata.ltarget = targetType - self.registerType(typeId, tdata) return self.Type(self, typeId) def createReferenceType(self, targetType): @@ -3805,14 +3792,12 @@ class DumperBase(): raise RuntimeError('Expected type in createReferenceType(), got %s' % type(targetType)) typeId = targetType.typeId + ' &' - tdata = self.TypeData(self) + tdata = self.TypeData(self, typeId) tdata.name = targetType.name + ' &' - tdata.typeId = typeId tdata.code = TypeCode.Reference tdata.ltarget = targetType tdata.lbitsize = 8 * self.ptrSize() # Needed for Gdb13393 test. #tdata.lbitsize = None - self.registerType(typeId, tdata) return self.Type(self, typeId) def createRValueReferenceType(self, targetType): @@ -3820,13 +3805,11 @@ class DumperBase(): raise RuntimeError('Expected type in createRValueReferenceType(), got %s' % type(targetType)) typeId = targetType.typeId + ' &&' - tdata = self.TypeData(self) + tdata = self.TypeData(self, typeId) tdata.name = targetType.name + ' &&' - tdata.typeId = typeId tdata.code = TypeCode.RValueReference tdata.ltarget = targetType tdata.lbitsize = None - self.registerType(typeId, tdata) return self.Type(self, typeId) def createArrayType(self, targetType, count): @@ -3843,13 +3826,11 @@ class DumperBase(): type_id = '%s[%d]' % (targetTypeId, count) type_name = '%s[%d]' % (targetType.name, count) - tdata = self.TypeData(self) + tdata = self.TypeData(self, type_id) tdata.name = type_name - tdata.typeId = type_id tdata.code = TypeCode.Array tdata.ltarget = targetType tdata.lbitsize = targetType.lbitsize * count - self.registerType(type_id, tdata) return self.Type(self, type_id) def createBitfieldType(self, targetType, bitsize): @@ -3857,13 +3838,11 @@ class DumperBase(): raise RuntimeError('Expected type in createBitfieldType(), got %s' % type(targetType)) typeId = '%s:%d' % (targetType.typeId, bitsize) - tdata = self.TypeData(self) + tdata = self.TypeData(self, typeId) tdata.name = '%s : %d' % (targetType.typeId, bitsize) - tdata.typeId = typeId tdata.code = TypeCode.Bitfield tdata.ltarget = targetType tdata.lbitsize = bitsize - self.registerType(typeId, tdata) return self.Type(self, typeId) 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; if targetType.typeId == typeId: return targetType - tdata = self.TypeData(self) + tdata = self.TypeData(self, typeId) tdata.name = typeName - tdata.typeId = typeId tdata.code = TypeCode.Typedef tdata.ltarget = targetType tdata.lbitsize = targetType.lbitsize #tdata.lfields = targetType.lfields tdata.lbitsize = targetType.lbitsize - self.registerType(typeId, tdata) return self.Type(self, typeId) def knownArrayTypeSize(self): @@ -3939,9 +3916,7 @@ class DumperBase(): return knownType #DumperBase.warn('FAKING: %s SIZE: %s' % (typish, size)) - tdata = self.TypeData(self) - tdata.name = typish - tdata.typeId = typish + tdata = self.TypeData(self, typish) tdata.templateArguments = lambda: self.listTemplateParameters(typish) if size is not None: tdata.lbitsize = 8 * size @@ -3950,8 +3925,7 @@ class DumperBase(): tdata.lbitsize = 8 * self.ptrSize() tdata.ltarget = self.createType(typish[:-1].strip()) - self.registerType(typish, tdata) - typeobj = self.Type(self, typish) + typeobj = self.Type(self, tdata.typeId) #DumperBase.warn('CREATE TYPE: %s' % typeobj.stringify()) typeobj.check() return typeobj @@ -3979,11 +3953,8 @@ class DumperBase(): raise RuntimeError('EXPECTING ADDRESS OR BYTES, GOT %s' % type(datish)) def createProxyValue(self, proxy_data, type_name): - tdata = self.TypeData(self) - tdata.name = type_name - tdata.typeId = type_name + tdata = self.TypeData(self, type_name) tdata.code = TypeCode.Struct - self.registerType(type_name, tdata) val = self.Value(self) val._type = self.Type(self, type_name) val.ldata = proxy_data diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 1168bce81b8..f142a30fb4a 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -367,9 +367,8 @@ class Dumper(DumperBase): typeId = self.nativeTypeId(nativeType) res = self.typeData.get(typeId, None) if res is None: - tdata = self.TypeData(self) + tdata = self.TypeData(self, typeId) tdata.name = str(nativeType) - tdata.typeId = typeId tdata.lbitsize = nativeType.sizeof * 8 tdata.code = { #gdb.TYPE_CODE_TYPEDEF : TypeCode.Typedef, # Handled above. @@ -401,7 +400,6 @@ class Dumper(DumperBase): self.listMembers(value, nativeType) tdata.templateArguments = lambda: \ self.listTemplateParameters(nativeType) - self.registerType(typeId, tdata) # Fix up fields and template args # warn('CREATE TYPE: %s' % typeId) #else: # warn('REUSE TYPE: %s' % typeId) diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index 25e47688ecc..032b2242211 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -434,8 +434,7 @@ class Dumper(DumperBase): if res is None: # # This strips typedefs for pointers. We don't want that. # typeobj.nativeType = nativeType.GetUnqualifiedType() - tdata = self.TypeData(self) - tdata.typeId = typeId + tdata = self.TypeData(self, typeId) tdata.name = typeName tdata.lbitsize = nativeType.GetByteSize() * 8 if code == lldb.eTypeClassBuiltin: @@ -471,8 +470,6 @@ class Dumper(DumperBase): tdata.code = TypeCode.Function elif code == lldb.eTypeClassMemberPointer: tdata.code = TypeCode.MemberPointer - - self.registerType(typeId, tdata) # Fix up fields and template args # warn('CREATE TYPE: %s' % typeId) #else: # warn('REUSE TYPE: %s' % typeId) diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py index 39bb174f0d3..7ddd00d4ccd 100644 --- a/share/qtcreator/debugger/qttypes.py +++ b/share/qtcreator/debugger/qttypes.py @@ -234,14 +234,14 @@ def qdump__QStandardItem(d, value): vtable, dptr = value.split('pp') if d.qtVersion() >= 0x060000: 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: # There used to be a virtual destructor that got removed in # 88b6abcebf29b455438 on Apr 18 17:01:22 2017 if d.qtVersion() < 0x050900 and not d.isMsvcTarget(): dptr += d.ptrSize(); 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.putExpandable()