From a2ad2bd5faae62b43bf43da2fb55cae77eedd3a6 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Thu, 18 Mar 2010 13:12:41 +0100
Subject: [PATCH] debugger: work on QVariant dumper

---
 share/qtcreator/gdbmacros/gdbmacros.py  | 50 +++++++++++++------------
 tests/manual/gdbdebugger/simple/app.cpp | 43 +++++----------------
 2 files changed, 36 insertions(+), 57 deletions(-)

diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py
index efc31431780..896d943093b 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.py
+++ b/share/qtcreator/gdbmacros/gdbmacros.py
@@ -649,18 +649,13 @@ def qdump__QObject(d, item):
                 #exp = '"((\'%sQObject\'*)%s)"' % (d.ns, item.value.address,)
                 #warn("EXPRESSION:  %s" % exp)
                 value = call(item.value, 'property("%s")' % propertyName)
-                #warn("VALUE:  %s" % value)
-
-                inner, innert = qdumpHelper__QVariant(d, value["d"])
+                val, inner, innert = qdumpHelper__QVariant(d, value)
                 if len(inner):
                     # Build-in types.
-                    if len(innert) == 0:
-                        innert = inner
                     d.putType(inner)
-                    innerType = gdb.lookup_type(inner)
-                    val = value["d"]["data"]["ptr"].cast(innerType)
                     d.putItemHelper(Item(val, item.iname + ".properties",
-                        propertyName, propertyName))
+                                        propertyName, propertyName))
+
                 else:
                     # User types.
                #    func = "typeToName(('%sQVariant::Type')%d)" % (d.ns, variantType)
@@ -1496,10 +1491,11 @@ def qdump__QTextCodec(d, item):
         d.putCallItem("mibEnum", item, "mibEnum()")
         d.endChildren()
 
-def qdumpHelper__QVariant(d, d_member):
+def qdumpHelper__QVariant(d, value):
     #warn("VARIANT TYPE: %s : " % variantType)
-    data = d_member["data"]
-    variantType = int(d_member["type"])
+    data = value["d"]["data"]
+    variantType = int(value["d"]["type"])
+    val = None
     inner = ""
     innert = ""
     if variantType == 0: # QVariant::Invalid
@@ -1621,30 +1617,38 @@ def qdumpHelper__QVariant(d, d_member):
         inner = d.ns + "QVector4D"
     elif variantType == 86: # QVariant::Quadernion
         inner = d.ns + "QQuadernion"
-    return inner, innert
+
+    if len(inner):
+        innerType = gdb.lookup_type(inner)
+        sizePD = gdb.lookup_type(d.ns + 'QVariant::Private::Data').sizeof
+        if innerType.sizeof > sizePD:
+            sizePS = gdb.lookup_type(d.ns + 'QVariant::PrivateShared').sizeof
+            val = (sizePS + data.cast(gdb.lookup_type('char').pointer())) \
+                .cast(innerType.pointer()).dereference()
+        else:
+            val = data.cast(innerType)
+
+    if len(innert) == 0:
+        innert = inner
+
+    return val, inner, innert
+
 
 def qdump__QVariant(d, item):
-    inner, innert = qdumpHelper__QVariant(d, item.value["d"])
+    val, inner, innert = qdumpHelper__QVariant(d, item.value)
 
     if len(inner):
         # Build-in types.
-        if len(innert) == 0:
-            innert = inner
         d.putValue("(%s)" % innert)
         d.putNumChild(1)
         if d.isExpanded(item):
-            innerType = gdb.lookup_type(inner)
             d.beginChildren()
-            d.beginHash()
-            #d.putName("data")
-            #d.putField("type", innert)
-            val = gdb.Value(data["ptr"]).cast(innerType)
-            d.putItemHelper(Item(val, item.iname, "data", "data"))
-            d.endHash()
+            d.putItem(Item(val, item.iname, "data", "data"))
             d.endChildren()
     else:
         # User types.
-        func = "typeToName(('%sQVariant::Type')%d)" % (d.ns, variantType)
+        d_member = item.value["d"]
+        func = "typeToName(('%sQVariant::Type')%d)" % (d.ns, d_member["type"])
         type = str(call(item.value, func))
         type = type[type.find('"') + 1 : type.rfind('"')]
         type = type.replace("Q", d.ns + "Q") # HACK!
diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp
index 5834b359a9a..de48922e251 100644
--- a/tests/manual/gdbdebugger/simple/app.cpp
+++ b/tests/manual/gdbdebugger/simple/app.cpp
@@ -1163,6 +1163,7 @@ void testQVariant1()
     v = 1;
     v = 1.0;
     v = "string";
+    v = QRect(100, 200, 300, 400);
     v = 1;
 }
 
@@ -1174,7 +1175,7 @@ void testQVariant2()
     *(QString*)value.data() = QString("XXX");
 
     int i = 1;
-#if 0
+#if 1
     QVariant var;
     var.setValue(1);
     var.setValue(2);
@@ -1187,10 +1188,10 @@ void testQVariant2()
     var.setValue(QStringList() << "Hello" << "Hello");
     var.setValue(QStringList() << "World" << "Hello" << "Hello");
 #endif
-#if 0
+#if 1
     QVariant var3;
     QHostAddress ha("127.0.0.1");
-    qVariantSetValue(var, ha);
+    var.setValue(ha);
     var3 = var;
     var3 = var;
     var3 = var;
@@ -1590,41 +1591,15 @@ int main(int argc, char *argv[])
     return 0;
 }
 
-//Q_DECLARE_METATYPE(QHostAddress)
+Q_DECLARE_METATYPE(QHostAddress)
 Q_DECLARE_METATYPE(QList<int>)
+Q_DECLARE_METATYPE(QStringList)
 
-//#define COMMA ,
-//Q_DECLARE_METATYPE(QMap<uint COMMA QStringList>)
+typedef QMap<uint, QStringList> MyType;
+#define COMMA ,
+Q_DECLARE_METATYPE(QMap<uint COMMA QStringList>)
 
 QT_BEGIN_NAMESPACE
-
-template <>
-struct QMetaTypeId<QHostAddress>
-{
-    enum { Defined = 1 };
-    static int qt_metatype_id()
-    {
-        static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
-        if (!metatype_id)
-             metatype_id = qRegisterMetaType<QHostAddress>
-                ("myns::QHostAddress");
-        return metatype_id;                                    \
-    }                                                           \
-};
-
-template <>
-struct QMetaTypeId< QMap<uint, QStringList> >
-{
-    enum { Defined = 1 };
-    static int qt_metatype_id()
-    {
-        static QBasicAtomicInt metatype_id = Q_BASIC_ATOMIC_INITIALIZER(0);
-        if (!metatype_id)
-             metatype_id = qRegisterMetaType< QMap<uint, QStringList> >
-                ("myns::QMap<uint, myns::QStringList>");
-        return metatype_id;                                    \
-    }                                                           \
-};
 QT_END_NAMESPACE
 
 #include "app.moc"
-- 
GitLab