forked from qt-creator/qt-creator
Debugger: Speed up QObject recognition
Change-Id: Ib9847725c1e97ad774173ecb95094791ff5d1bbc Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -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:
|
||||
|
Reference in New Issue
Block a user