diff options
author | hjk <hjk121@nokiamail.com> | 2014-02-25 15:52:22 +0100 |
---|---|---|
committer | hjk <hjk121@nokiamail.com> | 2014-02-27 12:56:15 +0100 |
commit | 9e3005ee951f81ef6e49b6c4e1191db8918f8db9 (patch) | |
tree | cbeeaeab14333e13047ef4cb348f663d854c0880 /share/qtcreator/debugger/gdbbridge.py | |
parent | bc4532194922dc6f5ccb021cc1b637323aa5e396 (diff) | |
download | qt-creator-9e3005ee951f81ef6e49b6c4e1191db8918f8db9.tar.gz |
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/qtcreator/debugger/gdbbridge.py')
-rw-r--r-- | share/qtcreator/debugger/gdbbridge.py | 59 |
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): |