Debugger: Optimize QObject::staticMetaObject lookup

Change-Id: I8c06472ce4e33b7c4203934d93b9cc8c8ae95ce2
Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
David Schulz
2017-03-07 08:40:43 +01:00
parent 9d8c380b43
commit 530f7972eb
4 changed files with 16 additions and 6 deletions
+5 -1
View File
@@ -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
+7 -1
View File
@@ -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:
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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