From 2bb121df6f0d6af31a96845fa2bba335028a03f2 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Tue, 8 Jun 2010 16:28:43 +0200
Subject: [PATCH] debugger: enhance QObject dumper by showing user defined
 properties

---
 share/qtcreator/gdbmacros/gdbmacros.py | 60 ++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py
index 08ca56484a4..b1a42e0d9a0 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.py
+++ b/share/qtcreator/gdbmacros/gdbmacros.py
@@ -615,6 +615,7 @@ def qdump__QObject(d, item):
     #warn("MO.D: %s " % mo["d"])
     metaData = mo["d"]["data"]
     metaStringData = mo["d"]["stringdata"]
+    #extradata = mo["d"]["extradata"]   # Capitalization!
     #warn("METADATA: %s " % metaData)
     #warn("STRINGDATA: %s " % metaStringData)
     #warn("TYPE: %s " % item.value.type)
@@ -630,6 +631,63 @@ def qdump__QObject(d, item):
         d.putItem(Item(d_ptr["parent"], item.iname, "parent", "parent"))
         d.putItem(Item(d_ptr["children"], item.iname, "children", "children"))
 
+        # User properties.
+        with SubItem(d):
+            d.putName("userprops")
+            d.putType(" ")
+            extraData = d_ptr["extraData"]   # Capitalization!
+            if isNull(extraData):
+                #warn("EXTRADATA Z: %s " % extraData)
+                d.putItemCount(0)
+                d.putNumChild(0)
+                if d.isExpandedIName(item.iname + ".userprops"):
+                    with Children(d):
+                        pass
+            else:
+                extraDataType = gdb.lookup_type(
+                    d.ns + "QObjectPrivate::ExtraData").pointer()
+                extraData = extraData.cast(extraDataType)
+                ed = extraData.dereference()
+                names = ed["propertyNames"]
+                values = ed["propertyValues"]
+                #userData = ed["userData"]
+                namesBegin = names["d"]["begin"]
+                namesEnd = names["d"]["end"]
+                namesArray = names["d"]["array"]
+                userPropertyCount = namesEnd - namesBegin
+                d.putItemCount(userPropertyCount)
+                d.putNumChild(userPropertyCount)
+                if d.isExpandedIName(item.iname + ".userprops"):
+                    dummyType = gdb.lookup_type("void").pointer().pointer()
+                    namesType = gdb.lookup_type(d.ns + "QByteArray")
+                    valuesBegin = values["d"]["begin"]
+                    valuesEnd = values["d"]["end"]
+                    valuesArray = values["d"]["array"]
+                    valuesType = gdb.lookup_type(d.ns + "QVariant")
+                    p = namesArray.cast(dummyType) + namesBegin
+                    q = valuesArray.cast(dummyType) + valuesBegin
+                    with Children(d, [userPropertyCount, 100]):
+                        for i in xrange(userPropertyCount):
+                            with SubItem(d):
+                                warn("Q: %s" % q)
+                                pp = p.cast(namesType.pointer()).dereference();
+                                d.putField("key", encodeByteArray(pp))
+                                d.putField("keyencoded", Hex2EncodedLatin1)
+                                qq = q.cast(valuesType.pointer().pointer())
+                                warn("QQ: %s" % qq)
+                                qq = qq.dereference();
+                                warn("QQ: %s" % q)
+                                d.putField("addr", cleanAddress(qq))
+                                d.putField("exp", "*('%sQVariant'*)%s"
+                                     % (d.ns, cleanAddress(qq)))
+                                name = "%s.userprops.%d" % (item.iname, i)
+                                t = qdump__QVariant(d, Item(qq, name))
+                                # Override the "QVariant (foo)" output
+                                d.putType(t, d.currentTypePriority + 1)
+                            p += 1
+                            q += 1
+
+
         # Properties.
         with SubItem(d):
             #propertyCount = metaData[6]
@@ -1626,6 +1684,7 @@ def qdump__QVariant(d, item):
             v = item.value["d"]["data"].cast(innerType)
         d.putItemHelper(Item(v, item.iname))
         d.putType("%sQVariant (%s)" % (d.ns, innert), d.currentTypePriority + 1)
+        return innert
     else:
         # User types.
         d_member = item.value["d"]
@@ -1640,6 +1699,7 @@ def qdump__QVariant(d, item):
         if d.isExpanded(item):
             with Children(d):
                 d.putItem(Item(tdata, item.iname, "data", "data"))
+        return tdata.type
 
 
 def qdump__QVector(d, item):
-- 
GitLab