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]
|
self.type_alignment_cache[typeid] = self.type_alignment_cache[target_typeid]
|
||||||
return 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
|
# p5 = n -> n * ptrsize for Qt 5
|
||||||
# p6 = n -> n * ptrsize for Qt 6
|
# p6 = n -> n * ptrsize for Qt 6
|
||||||
#if self.qtVersion() >= 0x060000: # FIXME: Qt 5, ptrSize()
|
#if self.qtVersion() >= 0x060000: # FIXME: Qt 5, ptrSize()
|
||||||
@@ -499,6 +499,7 @@ class DumperBase():
|
|||||||
typeid = self.typeid_for_string(name)
|
typeid = self.typeid_for_string(name)
|
||||||
self.type_code_cache[typeid] = TypeCode.Struct
|
self.type_code_cache[typeid] = TypeCode.Struct
|
||||||
self.type_size_cache[typeid] = size
|
self.type_size_cache[typeid] = size
|
||||||
|
self.type_qobject_based_cache[typeid] = qobject_based
|
||||||
self.type_alignment_cache[typeid] = 8
|
self.type_alignment_cache[typeid] = 8
|
||||||
return typeid
|
return typeid
|
||||||
|
|
||||||
@@ -562,7 +563,7 @@ class DumperBase():
|
|||||||
|
|
||||||
self.register_enum('@Qt::ItemDataRole', 4)
|
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('@QObjectPrivate', p5=10, p6=10) # FIXME: Not exact
|
||||||
|
|
||||||
self.register_struct('@QByteArray', p5=1, p6=3)
|
self.register_struct('@QByteArray', p5=1, p6=3)
|
||||||
@@ -1580,6 +1581,12 @@ class DumperBase():
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def putQObjectNameValue(self, value):
|
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()
|
self.fetchInternalFunctions()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -3253,6 +3260,7 @@ typename))
|
|||||||
self.type_nativetype_cache = {}
|
self.type_nativetype_cache = {}
|
||||||
self.type_modulename_cache = {}
|
self.type_modulename_cache = {}
|
||||||
self.type_encoding_cache = {}
|
self.type_encoding_cache = {}
|
||||||
|
self.type_qobject_based_cache = {}
|
||||||
self.typeid_cache = {} # internal typename -> id
|
self.typeid_cache = {} # internal typename -> id
|
||||||
self.typeid_current = 100
|
self.typeid_current = 100
|
||||||
self.typeid_from_typekey = {} # typename -> id
|
self.typeid_from_typekey = {} # typename -> id
|
||||||
|
@@ -380,6 +380,18 @@ class Dumper(DumperBase):
|
|||||||
|
|
||||||
self.type_nativetype_cache[typeid] = nativeType
|
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
|
# FIXME: Field offset caching (or later extraction?) broken
|
||||||
# if code == gdb.TYPE_CODE_STRUCT:
|
# if code == gdb.TYPE_CODE_STRUCT:
|
||||||
# field_type_name = self.type_name_cache.get(typeid, '')
|
# field_type_name = self.type_name_cache.get(typeid, '')
|
||||||
@@ -413,6 +425,16 @@ class Dumper(DumperBase):
|
|||||||
|
|
||||||
return typeid
|
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):
|
def nativeTemplateParameter(self, typeid, index, nativeType):
|
||||||
try:
|
try:
|
||||||
targ = nativeType.template_argument(index)
|
targ = nativeType.template_argument(index)
|
||||||
|
@@ -338,6 +338,15 @@ class Dumper(DumperBase):
|
|||||||
self.ptrSize = lambda: result
|
self.ptrSize = lambda: result
|
||||||
return 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):
|
def from_native_type(self, nativeType):
|
||||||
self.check(isinstance(nativeType, lldb.SBType))
|
self.check(isinstance(nativeType, lldb.SBType))
|
||||||
|
|
||||||
@@ -458,8 +467,12 @@ class Dumper(DumperBase):
|
|||||||
self.nativeTypeEnumDisplay(nativeType, intval, form)
|
self.nativeTypeEnumDisplay(nativeType, intval, form)
|
||||||
elif code in (lldb.eTypeClassComplexInteger, lldb.eTypeClassComplexFloat):
|
elif code in (lldb.eTypeClassComplexInteger, lldb.eTypeClassComplexFloat):
|
||||||
type_code = TypeCode.Complex
|
type_code = TypeCode.Complex
|
||||||
elif code in (lldb.eTypeClassClass, lldb.eTypeClassStruct, lldb.eTypeClassUnion):
|
elif code in (lldb.eTypeClassClass, lldb.eTypeClassStruct):
|
||||||
type_code = TypeCode.Struct
|
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:
|
elif code == lldb.eTypeClassFunction:
|
||||||
type_code = TypeCode.Function
|
type_code = TypeCode.Function
|
||||||
elif code == lldb.eTypeClassMemberPointer:
|
elif code == lldb.eTypeClassMemberPointer:
|
||||||
|
Reference in New Issue
Block a user