forked from qt-creator/qt-creator
Debugger: Optimize QObject::staticMetaObject lookup
Change-Id: I8c06472ce4e33b7c4203934d93b9cc8c8ae95ce2 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
@@ -171,6 +171,7 @@ class Dumper(DumperBase):
|
||||
tdata.typeId = typeId
|
||||
tdata.lbitsize = nativeType.bitsize()
|
||||
tdata.code = code
|
||||
tdata.moduleName = nativeType.module()
|
||||
self.registerType(typeId, tdata) # Prevent recursion in fields.
|
||||
if code == TypeCodeStruct:
|
||||
tdata.lfields = lambda value : \
|
||||
@@ -431,7 +432,10 @@ class Dumper(DumperBase):
|
||||
raise Exception("Invalid memory request")
|
||||
return mem
|
||||
|
||||
def findStaticMetaObject(self, typeName):
|
||||
def findStaticMetaObject(self, type):
|
||||
typeName = type.name
|
||||
if type.moduleName is not None:
|
||||
typeName = type.moduleName + '!' + typeName
|
||||
ptr = cdbext.getAddressByName(typeName + '::staticMetaObject')
|
||||
return ptr
|
||||
|
||||
|
||||
@@ -1561,7 +1561,7 @@ class DumperBase:
|
||||
if typeName.find('<') >= 0:
|
||||
return 0
|
||||
|
||||
result = self.findStaticMetaObject(typeName)
|
||||
result = self.findStaticMetaObject(someTypeObj)
|
||||
|
||||
# We need to distinguish Q_OBJECT from Q_GADGET:
|
||||
# a Q_OBJECT SMO has a non-null superdata (unless it's QObject itself),
|
||||
@@ -3220,6 +3220,7 @@ class DumperBase:
|
||||
self.name = None
|
||||
self.typeId = None
|
||||
self.enumDisplay = str
|
||||
self.moduleName = None
|
||||
|
||||
def copy(self):
|
||||
tdata = self.dumper.TypeData(self.dumper)
|
||||
@@ -3233,6 +3234,7 @@ class DumperBase:
|
||||
tdata.name = self.name
|
||||
tdata.typeId = self.typeId
|
||||
tdata.enumDisplay = self.enumDisplay
|
||||
tdata.moduleName = self.moduleName
|
||||
return tdata
|
||||
|
||||
class Type:
|
||||
@@ -3280,6 +3282,10 @@ class DumperBase:
|
||||
def ltarget(self):
|
||||
return self.typeData().ltarget
|
||||
|
||||
@property
|
||||
def moduleName(self):
|
||||
return self.typeData().moduleName
|
||||
|
||||
def stringify(self):
|
||||
tdata = self.typeData()
|
||||
if tdata is None:
|
||||
|
||||
@@ -858,8 +858,8 @@ class Dumper(DumperBase):
|
||||
self.ping('readMem')
|
||||
return res
|
||||
|
||||
def findStaticMetaObject(self, typename):
|
||||
symbolName = typename + '::staticMetaObject'
|
||||
def findStaticMetaObject(self, type):
|
||||
symbolName = type.name + '::staticMetaObject'
|
||||
symbol = gdb.lookup_global_symbol(symbolName, gdb.SYMBOL_VAR_DOMAIN)
|
||||
if not symbol:
|
||||
return 0
|
||||
|
||||
@@ -1078,8 +1078,8 @@ class Dumper(DumperBase):
|
||||
raise RuntimeError("Unreadable %s bytes at 0x%x" % (size, address))
|
||||
return res
|
||||
|
||||
def findStaticMetaObject(self, typeName):
|
||||
symbolName = self.mangleName(typeName + '::staticMetaObject')
|
||||
def findStaticMetaObject(self, type):
|
||||
symbolName = self.mangleName(type.name + '::staticMetaObject')
|
||||
symbol = self.target.FindFirstGlobalVariable(symbolName)
|
||||
return symbol.AddressOf().GetValueAsUnsigned() if symbol.IsValid() else 0
|
||||
|
||||
|
||||
Reference in New Issue
Block a user