diff --git a/share/qtcreator/debugger/dumper.py b/share/qtcreator/debugger/dumper.py index ec7b83d3311..c2580880f55 100644 --- a/share/qtcreator/debugger/dumper.py +++ b/share/qtcreator/debugger/dumper.py @@ -491,7 +491,7 @@ class DumperBase(): self.type_alignment_cache[typeid] = self.type_alignment_cache[target_typeid] return typeid - def register_struct(self, name, p5=0, p6=0, s=0): + def register_struct(self, name, p5=0, p6=0, s=0, qobject_based=False): # p5 = n -> n * ptrsize for Qt 5 # p6 = n -> n * ptrsize for Qt 6 #if self.qtVersion() >= 0x060000: # FIXME: Qt 5, ptrSize() @@ -499,6 +499,7 @@ class DumperBase(): typeid = self.typeid_for_string(name) self.type_code_cache[typeid] = TypeCode.Struct self.type_size_cache[typeid] = size + self.type_qobject_based_cache[typeid] = qobject_based self.type_alignment_cache[typeid] = 8 return typeid @@ -562,7 +563,7 @@ class DumperBase(): self.register_enum('@Qt::ItemDataRole', 4) - self.register_struct('@QObject', p5=2, p6=2) + self.register_struct('@QObject', p5=2, p6=2, qobject_based=True) self.register_struct('@QObjectPrivate', p5=10, p6=10) # FIXME: Not exact self.register_struct('@QByteArray', p5=1, p6=3) @@ -1580,6 +1581,12 @@ class DumperBase(): pass def putQObjectNameValue(self, value): + is_qobject_based = self.type_qobject_based_cache.get(value.typeid, None) + if is_qobject_based == False: + #self.warn("SKIP TEST OBJNAME: %s" % self.type_name(value.typeid)) + return + + #self.warn("TEST OBJNAME: %s" % self.type_name(value.typeid)) self.fetchInternalFunctions() try: @@ -3253,6 +3260,7 @@ typename)) self.type_nativetype_cache = {} self.type_modulename_cache = {} self.type_encoding_cache = {} + self.type_qobject_based_cache = {} self.typeid_cache = {} # internal typename -> id self.typeid_current = 100 self.typeid_from_typekey = {} # typename -> id diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py index 941c9b83121..5e2957b1812 100644 --- a/share/qtcreator/debugger/gdbbridge.py +++ b/share/qtcreator/debugger/gdbbridge.py @@ -380,6 +380,18 @@ class Dumper(DumperBase): self.type_nativetype_cache[typeid] = nativeType + if code == gdb.TYPE_CODE_STRUCT: + self.type_qobject_based_cache[typeid] = self.is_qobject_based(nativeType) + #res = self.is_qobject_based(nativeType) + #if res == False: + # self.warn("RECOGNIZED AS NON-QOBJECT: %s" % nativeType) + #elif res == True: + # self.warn("RECOGNIZED AS QOBJECT: %s" % nativeType) + #else: + # self.warn("UNRECOGNIZED: %s" % nativeType) + elif code != gdb.TYPE_CODE_TYPEDEF: + self.type_qobject_based_cache[typeid] = False + # FIXME: Field offset caching (or later extraction?) broken # if code == gdb.TYPE_CODE_STRUCT: # field_type_name = self.type_name_cache.get(typeid, '') @@ -413,6 +425,16 @@ class Dumper(DumperBase): return typeid + def is_qobject_based(self, nativeType): + if str(nativeType) == self.qtNamespace() + 'QObject': + return True + fields = nativeType.fields() + if len(fields) == 0: + return None # No info, can't drill deeper + if not fields[0].is_base_class: + return False + return self.is_qobject_based(fields[0].type) + def nativeTemplateParameter(self, typeid, index, nativeType): try: targ = nativeType.template_argument(index) diff --git a/share/qtcreator/debugger/lldbbridge.py b/share/qtcreator/debugger/lldbbridge.py index d8c0ab6ca6f..7cd3bef77e0 100644 --- a/share/qtcreator/debugger/lldbbridge.py +++ b/share/qtcreator/debugger/lldbbridge.py @@ -338,6 +338,15 @@ class Dumper(DumperBase): self.ptrSize = lambda: result return result + def is_qobject_based(self, nativeType): + if nativeType.GetName() == self.qtNamespace() + 'QObject': + return True + if nativeType.GetNumberOfDirectBaseClasses() > 0: + return self.is_qobject_based(nativeType.GetDirectBaseClassAtIndex(0).GetType()) + if nativeType.GetNumberOfFields() > 0: + return False + return None # No info, can't drill deeper + def from_native_type(self, nativeType): self.check(isinstance(nativeType, lldb.SBType)) @@ -458,8 +467,12 @@ class Dumper(DumperBase): self.nativeTypeEnumDisplay(nativeType, intval, form) elif code in (lldb.eTypeClassComplexInteger, lldb.eTypeClassComplexFloat): type_code = TypeCode.Complex - elif code in (lldb.eTypeClassClass, lldb.eTypeClassStruct, lldb.eTypeClassUnion): + elif code in (lldb.eTypeClassClass, lldb.eTypeClassStruct): type_code = TypeCode.Struct + self.type_qobject_based_cache[typeid] = self.is_qobject_based(nativeType) + elif code == lldb.eTypeClassUnion: + type_code = TypeCode.Struct + self.type_qobject_based_cache[typeid] = False elif code == lldb.eTypeClassFunction: type_code = TypeCode.Function elif code == lldb.eTypeClassMemberPointer: