From a3804bbfe3dbc15ba895b2a289163a7613019d8f Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 19 Aug 2010 14:05:50 +0200
Subject: [PATCH] debugger: fix QObject identification

---
 share/qtcreator/gdbmacros/dumper.py | 31 ++++++++++++++++++++++-------
 1 file changed, 24 insertions(+), 7 deletions(-)

diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index c4151d93ed9..11a7ced0473 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -1141,6 +1141,8 @@ SalCommand()
 #######################################################################
 
 
+qqQObjectCache = {}
+
 class Dumper:
     def __init__(self):
         self.output = ""
@@ -1154,6 +1156,25 @@ class Dumper:
         self.currentType = None
         self.currentTypePriority = -100
 
+    def checkForQObjectBase(self, type):
+        if type.code != gdb.TYPE_CODE_STRUCT:
+            return False
+        name = str(type)
+        if name in qqQObjectCache:
+            return qqQObjectCache[name]
+        if name == self.ns + "QObject":
+            qqQObjectCache[name] = True
+            return True
+        fields = type.strip_typedefs().fields()
+        if len(fields) == 0:
+            qqQObjectCache[name] = False
+            return False
+        base = fields[0].type.strip_typedefs()
+        result = self.checkForQObjectBase(base)
+        qqQObjectCache[name] = result
+        return result
+
+
     def put(self, value):
         self.output += value
 
@@ -1338,11 +1359,7 @@ class Dumper:
             return
 
         # Is this derived from QObject?
-        hasMetaObject = False
-        for field in typedefStrippedType.strip_typedefs().fields():
-            if field.name == "staticMetaObject":
-                hasMetaObject = True
-                break
+        isQObjectDerived = self.checkForQObjectBase(typedefStrippedType)
 
         nsStrippedType = self.stripNamespaceFromType(typedefStrippedType)\
             .replace("::", "__")
@@ -1354,10 +1371,10 @@ class Dumper:
 
         if self.useFancy \
                 and ((format is None) or (format >= 1)) \
-                and ((nsStrippedType in self.dumpers) or hasMetaObject):
+                and ((nsStrippedType in self.dumpers) or isQObjectDerived):
             #warn("IS DUMPABLE: %s " % type)
             self.putType(item.value.type)
-            if hasMetaObject:
+            if isQObjectDerived:
                 # value has references stripped off item.value.
                 item1 = Item(value, item.iname)
                 qdump__QObject(self, item1)
-- 
GitLab