aboutsummaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorhjk <hjk121@nokiamail.com>2014-02-25 15:52:22 +0100
committerhjk <hjk121@nokiamail.com>2014-02-27 12:56:15 +0100
commit9e3005ee951f81ef6e49b6c4e1191db8918f8db9 (patch)
treecbeeaeab14333e13047ef4cb348f663d854c0880 /share
parentbc4532194922dc6f5ccb021cc1b637323aa5e396 (diff)
Debugger: Rework gdb Q_OBJECT detection (again)
We need to filter out Q_GADGETS Change-Id: Id0ec18188e5b40506d69908e7218e3971cbddad9 Reviewed-by: hjk <hjk121@nokiamail.com>
Diffstat (limited to 'share')
-rw-r--r--share/qtcreator/debugger/gdbbridge.py59
1 files changed, 33 insertions, 26 deletions
diff --git a/share/qtcreator/debugger/gdbbridge.py b/share/qtcreator/debugger/gdbbridge.py
index fb1c612d98..2bfa0f1f8f 100644
--- a/share/qtcreator/debugger/gdbbridge.py
+++ b/share/qtcreator/debugger/gdbbridge.py
@@ -833,47 +833,54 @@ class Dumper(DumperBase):
def extractByte(self, addr):
return struct.unpack("b", self.readRawMemory(addr, 1))[0]
- def extractStaticMetaObjectHelper(self, typeobj):
+
+ def extractStaticMetaObjectHelper(self, typeName):
"""
Checks whether type has a Q_OBJECT macro.
Returns the staticMetaObject, or 0.
"""
- typeName = str(typeobj)
- result = self.knownStaticMetaObjects.get(typeName, None)
- if result is not None: # Is 0 or the static metaobject.
- return result
+ # No templates for now.
+ if typeName.find('<') >= 0:
+ return 0
staticMetaObjectName = typeName + "::staticMetaObject"
- try:
+ if hasattr(gdb, 'lookup_global_symbol'):
result = gdb.lookup_global_symbol(staticMetaObjectName)
result = result.value() if result else 0
- self.knownStaticMetaObjects[typeName] = result
- return result
- except:
- pass
+ else:
+ # Older GDB...
+ try:
+ result = gdb.parse_and_eval(staticMetaObjectName)
+ except:
+ result = 0
- # Older GDB...
- try:
- result = gdb.parse_and_eval(staticMetaObjectName)
- self.knownStaticMetaObjects[typeName] = result
- return result
- except:
- self.knownStaticMetaObjects[typeName] = 0
- return 0
+ # We need to distinguish Q_OBJECT from Q_GADGET:
+ # a Q_OBJECT SMO has a non-null superdata (unless it's QObject itself),
+ # a Q_GADGET SMO has a null superdata (hopefully)
+ if result and typeName != self.qtNamespace() + "QObject":
+ if not self.extractPointer(result):
+ # This looks like a Q_GADGET
+ result = 0
+
+ return result
def extractStaticMetaObject(self, typeobj):
"""
Checks recursively whether a type derives from QObject.
"""
- result = self.extractStaticMetaObjectHelper(typeobj)
- if result:
+ typeName = str(typeobj)
+ result = self.knownStaticMetaObjects.get(typeName, None)
+ if result is not None: # Is 0 or the static metaobject.
return result
- fields = typeobj.fields()
- if not len(fields):
- return 0
- if not fields[0].is_base_class:
- return 0
- return self.extractStaticMetaObject(fields[0].type)
+
+ result = self.extractStaticMetaObjectHelper(typeName)
+ if not result:
+ fields = typeobj.fields()
+ if len(fields) and fields[0].is_base_class:
+ result = self.extractStaticMetaObject(fields[0].type)
+
+ self.knownStaticMetaObjects[typeName] = result
+ return result
def put(self, value):