From e13794d0dcbc1d2d4d60d21722a0ea79981c4630 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Fri, 19 Nov 2010 15:01:03 +0100
Subject: [PATCH] debugger: make gdbmacros.py more generic

Mostly move parts of the gdb related quoting to dumper.py, also split
function calls in strings into separate arguments.
---
 share/qtcreator/gdbmacros/dumper.py    |  24 ++-
 share/qtcreator/gdbmacros/gdbmacros.py | 260 ++++++++++---------------
 2 files changed, 126 insertions(+), 158 deletions(-)

diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index bac079bd4d8..b652e0d0b01 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -688,13 +688,24 @@ def checkPointerRange(p, n):
         checkPointer(p)
         ++p
 
-def call(value, func):
-    #warn("CALL: %s -> %s" % (value, func))
+def call2(value, func, args):
+    # args is a tuple.
+    arg = ""
+    for i in range(len(args)):
+        if i:
+            arg += ','
+        a = args[i]
+        if (':' in a) and not ("'" in a):
+            arg = "'%s'" % a
+        else:
+            arg += a
+
+    #warn("CALL: %s -> %s(%s)" % (value, func, arg))
     type = stripClassTag(str(value.type))
     if type.find(":") >= 0:
         type = "'" + type + "'"
     # 'class' is needed, see http://sourceware.org/bugzilla/show_bug.cgi?id=11912
-    exp = "((class %s*)%s)->%s" % (type, value.address, func)
+    exp = "((class %s*)%s)->%s(%s)" % (type, value.address, func, arg)
     #warn("CALL: %s" % exp)
     result = None
     try:
@@ -704,6 +715,9 @@ def call(value, func):
     #warn("  -> %s" % result)
     return result
 
+def call(value, func, *args):
+    return call2(value, func, args)
+
 def makeValue(type, init):
     type = stripClassTag(type)
     if type.find(":") >= 0:
@@ -1427,8 +1441,8 @@ class Dumper:
         with SubItem(self):
             self.putItem(item)
 
-    def putCallItem(self, name, item, func):
-        result = call(item.value, func)
+    def putCallItem(self, name, item, func, *args):
+        result = call2(item.value, func, args)
         self.putSubItem(Item(result, item.iname, name, name))
 
     def putItem(self, item):
diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py
index 7552eaa588e..4d216069f3c 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.py
+++ b/share/qtcreator/gdbmacros/gdbmacros.py
@@ -42,40 +42,6 @@ def qdump__QChar(d, item):
     d.putNumChild(0)
 
 
-def qdump__QAbstractItem(d, item):
-    r = item.value["r"]
-    c = item.value["c"]
-    p = item.value["p"]
-    m = item.value["m"]
-    rowCount = call(m, "rowCount(mi)")
-    if rowCount < 0:
-        return
-    columnCount = call(m, "columnCount(mi)")
-    if columnCount < 0:
-        return
-    d.putStringValue(call(m, "data(mi, Qt::DisplayRole).toString()"))
-    d.putNumChild(rowCount * columnCount)
-    if d.isExpanded(item):
-        with Children(d):
-            innerType = lookupType(d.ns + "QAbstractItem")
-            for row in xrange(rowCount):
-                for column in xrange(columnCount):
-                    with SubItem(d):
-                        child = call(m, "index(row, column, mi)")
-                        d.putName("[%s,%s]" % (row, column))
-                        rr = call(m, "rowCount(child)")
-                        cc = call(m, "columnCount(child)")
-                        d.putNumChild(rr * cc)
-                        d.putValue(
-                            call(m, "data(child, Qt::DisplayRole).toString())"), 6)
-
-            #with SubItem(d):
-            #    d.putNumChild(1)
-            #    d.putName(d.ns + "QObject")
-            #    d.putStringValue(call(item.value, "objectName()"))
-            #    d.putType(d.ns + "QObject")
-            #    d.put('addr="%s",' % cleanAddress(item.value.address))
-
 
 def qdump__QAbstractItemModel(d, item):
     # Create a default-constructed QModelIndex on the stack.
@@ -151,7 +117,7 @@ def qdump__QModelIndex(d, item):
                                 % (mm_, row, column, mi_))
                             d.putItem(Item(mi2, item.iname, i))
                             i = i + 1
-                #d.putCallItem("parent", item, "parent()")
+                #d.putCallItem("parent", item, "parent")
                 #with SubItem(d):
                 #    d.putName("model")
                 #    d.putValue(m)
@@ -171,24 +137,17 @@ def qdump__QDate(d, item):
         d.putValue("(null)")
         d.putNumChild(0)
         return
-    d.putStringValue(call(item.value, "toString('%sQt::TextDate')" % d.ns))
+    qt = d.ns + "Qt::"
+    d.putStringValue(call(item.value, "toString", qt + "TextDate"))
     d.putNumChild(1)
     if d.isExpanded(item):
         # FIXME: This improperly uses complex return values.
-        with Children(d, 8):
-            d.putCallItem("toTime_t", item, "toTime_t()")
-            d.putCallItem("toString",
-                item, "toString('%sQt::TextDate')" % d.ns)
-            d.putCallItem("(ISO)",
-                item, "toString('%sQt::ISODate')" % d.ns)
-            d.putCallItem("(SystemLocale)",
-                item, "toString('%sQt::SystemLocaleDate')" % d.ns)
-            d.putCallItem("(Locale)",
-                item, "toString('%sQt::LocaleDate')" % d.ns)
-            d.putCallItem("toUTC",
-                item, "toTimeSpec('%sQt::UTC')" % d.ns)
-            d.putCallItem("toLocalTime",
-                item, "toTimeSpec('%sQt::LocalTime')" % d.ns)
+        with Children(d, 4):
+            d.putCallItem("toString", item, "toString", qt + "TextDate")
+            d.putCallItem("(ISO)", item, "toString", qt + "ISODate")
+            d.putCallItem("(SystemLocale)", item, "toString",
+                qt + "SystemLocaleDate")
+            d.putCallItem("(Locale)", item, "toString", qt + "LocaleDate")
 
 
 def qdump__QTime(d, item):
@@ -196,23 +155,18 @@ def qdump__QTime(d, item):
         d.putValue("(null)")
         d.putNumChild(0)
         return
-    d.putStringValue(call(item.value, "toString('%sQt::TextDate')" % d.ns))
+    qt = d.ns + "Qt::"
+    d.putStringValue(call(item.value, "toString", qt + "TextDate"))
     d.putNumChild(1)
     if d.isExpanded(item):
         # FIXME: This improperly uses complex return values.
         with Children(d, 8):
-            d.putCallItem("toString",
-                item, "toString('%sQt::TextDate')" % d.ns)
-            d.putCallItem("(ISO)",
-                item, "toString('%sQt::ISODate')" % d.ns)
-            d.putCallItem("(SystemLocale)",
-                item, "toString('%sQt::SystemLocaleDate')" % d.ns)
-            d.putCallItem("(Locale)",
-                item, "toString('%sQt::LocaleDate')" % d.ns)
-            d.putCallItem("toUTC",
-                item, "toTimeSpec('%sQt::UTC')" % d.ns)
-            #d.putCallItem("toLocalTime",
-            #    item, "toTimeSpec('%sQt::LocalTime')" % d.ns)
+            d.putCallItem("toString", item, "toString", qt + "TextDate")
+            d.putCallItem("(ISO)", item, "toString", qt + "ISODate")
+            d.putCallItem("(SystemLocale)", item, "toString",
+                 qt + "SystemLocaleDate")
+            d.putCallItem("(Locale)", item, "toString", qt + "LocaleDate")
+            d.putCallItem("toUTC", item, "toTimeSpec", qt + "UTC")
 
 
 def qdump__QDateTime(d, item):
@@ -225,25 +179,19 @@ def qdump__QDateTime(d, item):
     except:
         d.putPlainChildren(item)
         return
-
-    d.putStringValue(call(item.value, "toString('%sQt::TextDate')" % d.ns))
+    qt = d.ns + "Qt::"
+    d.putStringValue(call(item.value, "toString", qt + "TextDate"))
     d.putNumChild(1)
     if d.isExpanded(item):
         # FIXME: This improperly uses complex return values.
         with Children(d, 8):
-            d.putCallItem("toTime_t", item, "toTime_t()")
-            d.putCallItem("toString",
-                item, "toString('%sQt::TextDate')" % d.ns)
-            d.putCallItem("(ISO)",
-                item, "toString('%sQt::ISODate')" % d.ns)
-            d.putCallItem("(SystemLocale)",
-                item, "toString('%sQt::SystemLocaleDate')" % d.ns)
-            d.putCallItem("(Locale)",
-                item, "toString('%sQt::LocaleDate')" % d.ns)
-            d.putCallItem("toUTC",
-                item, "toTimeSpec('%sQt::UTC')" % d.ns)
-            #d.putCallItem("toLocalTime",
-            #    item, "toTimeSpec('%sQt::LocalTime')" % d.ns)
+            d.putCallItem("toTime_t", item, "toTime_t")
+            d.putCallItem("toString", item, "toString", qt + "TextDate")
+            d.putCallItem("(ISO)", item, "toString", qt + "ISODate")
+            d.putCallItem("(SystemLocale)", item, "toString", qt + "SystemLocaleDate")
+            d.putCallItem("(Locale)", item, "toString", qt + "LocaleDate")
+            d.putCallItem("toUTC", item, "toTimeSpec", qt + "UTC")
+            d.putCallItem("toLocalTime", item, "toTimeSpec", qt + "LocalTime")
 
 
 def qdump__QDir(d, item):
@@ -251,8 +199,8 @@ def qdump__QDir(d, item):
     d.putNumChild(2)
     if d.isExpanded(item):
         with Children(d, 2):
-            d.putCallItem("absolutePath", item, "absolutePath()")
-            d.putCallItem("canonicalPath", item, "canonicalPath()")
+            d.putCallItem("absolutePath", item, "absolutePath")
+            d.putCallItem("canonicalPath", item, "canonicalPath")
 
 
 def qdump__QFile(d, item):
@@ -274,29 +222,29 @@ def qdump__QFileInfo(d, item):
     d.putNumChild(3)
     if d.isExpanded(item):
         with Children(d, 10, lookupType(d.ns + "QString")):
-            d.putCallItem("absolutePath", item, "absolutePath()")
-            d.putCallItem("absoluteFilePath", item, "absoluteFilePath()")
-            d.putCallItem("canonicalPath", item, "canonicalPath()")
-            d.putCallItem("canonicalFilePath", item, "canonicalFilePath()")
-            d.putCallItem("completeBaseName", item, "completeBaseName()")
-            d.putCallItem("completeSuffix", item, "completeSuffix()")
-            d.putCallItem("baseName", item, "baseName()")
+            d.putCallItem("absolutePath", item, "absolutePath")
+            d.putCallItem("absoluteFilePath", item, "absoluteFilePath")
+            d.putCallItem("canonicalPath", item, "canonicalPath")
+            d.putCallItem("canonicalFilePath", item, "canonicalFilePath")
+            d.putCallItem("completeBaseName", item, "completeBaseName")
+            d.putCallItem("completeSuffix", item, "completeSuffix")
+            d.putCallItem("baseName", item, "baseName")
             if False:
                 #ifdef Q_OS_MACX
-                d.putCallItem("isBundle", item, "isBundle()")
-                d.putCallItem("bundleName", item, "bundleName()")
-            d.putCallItem("fileName", item, "fileName()")
-            d.putCallItem("filePath", item, "filePath()")
+                d.putCallItem("isBundle", item, "isBundle")
+                d.putCallItem("bundleName", item, "bundleName")
+            d.putCallItem("fileName", item, "fileName")
+            d.putCallItem("filePath", item, "filePath")
             # Crashes gdb (archer-tromey-python, at dad6b53fe)
-            #d.putCallItem("group", item, "group()")
-            #d.putCallItem("owner", item, "owner()")
-            d.putCallItem("path", item, "path()")
+            #d.putCallItem("group", item, "group")
+            #d.putCallItem("owner", item, "owner")
+            d.putCallItem("path", item, "path")
 
-            d.putCallItem("groupid", item, "groupId()")
-            d.putCallItem("ownerid", item, "ownerId()")
+            d.putCallItem("groupid", item, "groupId")
+            d.putCallItem("ownerid", item, "ownerId")
 
             #QFile::Permissions permissions () const
-            perms = call(item.value, "permissions()")
+            perms = call(item.value, "permissions")
             if perms is None:
                 d.putValue("<not available>")
             else:
@@ -323,21 +271,21 @@ def qdump__QFileInfo(d, item):
 
             #QDir absoluteDir () const
             #QDir dir () const
-            d.putCallItem("caching", item, "caching()")
-            d.putCallItem("exists", item, "exists()")
-            d.putCallItem("isAbsolute", item, "isAbsolute()")
-            d.putCallItem("isDir", item, "isDir()")
-            d.putCallItem("isExecutable", item, "isExecutable()")
-            d.putCallItem("isFile", item, "isFile()")
-            d.putCallItem("isHidden", item, "isHidden()")
-            d.putCallItem("isReadable", item, "isReadable()")
-            d.putCallItem("isRelative", item, "isRelative()")
-            d.putCallItem("isRoot", item, "isRoot()")
-            d.putCallItem("isSymLink", item, "isSymLink()")
-            d.putCallItem("isWritable", item, "isWritable()")
-            d.putCallItem("created", item, "created()")
-            d.putCallItem("lastModified", item, "lastModified()")
-            d.putCallItem("lastRead", item, "lastRead()")
+            d.putCallItem("caching", item, "caching")
+            d.putCallItem("exists", item, "exists")
+            d.putCallItem("isAbsolute", item, "isAbsolute")
+            d.putCallItem("isDir", item, "isDir")
+            d.putCallItem("isExecutable", item, "isExecutable")
+            d.putCallItem("isFile", item, "isFile")
+            d.putCallItem("isHidden", item, "isHidden")
+            d.putCallItem("isReadable", item, "isReadable")
+            d.putCallItem("isRelative", item, "isRelative")
+            d.putCallItem("isRoot", item, "isRoot")
+            d.putCallItem("isSymLink", item, "isSymLink")
+            d.putCallItem("isWritable", item, "isWritable")
+            d.putCallItem("created", item, "created")
+            d.putCallItem("lastModified", item, "lastModified")
+            d.putCallItem("lastRead", item, "lastRead")
 
 
 def qdump__QFixed(d, item):
@@ -595,26 +543,26 @@ def qdump__QLinkedList(d, item):
 
 
 def qdump__QLocale(d, item):
-    d.putStringValue(call(item.value, "name()"))
+    d.putStringValue(call(item.value, "name"))
     d.putNumChild(0)
     return
     # FIXME: Poke back for variants.
     if d.isExpanded(item):
         with Children(d, 1, lookupType(d.ns + "QChar"), 0):
-            d.putCallItem("country", item, "country()")
-            d.putCallItem("language", item, "language()")
-            d.putCallItem("measurementSystem", item, "measurementSystem()")
-            d.putCallItem("numberOptions", item, "numberOptions()")
+            d.putCallItem("country", item, "country")
+            d.putCallItem("language", item, "language")
+            d.putCallItem("measurementSystem", item, "measurementSystem")
+            d.putCallItem("numberOptions", item, "numberOptions")
             d.putCallItem("timeFormat_(short)", item,
-                "timeFormat('" + d.ns + "QLocale::ShortFormat')")
+                "timeFormat", d.ns + "QLocale::ShortFormat")
             d.putCallItem("timeFormat_(long)", item,
-                "timeFormat('" + d.ns + "QLocale::LongFormat')")
-            d.putCallItem("decimalPoint", item, "decimalPoint()")
-            d.putCallItem("exponential", item, "exponential()")
-            d.putCallItem("percent", item, "percent()")
-            d.putCallItem("zeroDigit", item, "zeroDigit()")
-            d.putCallItem("groupSeparator", item, "groupSeparator()")
-            d.putCallItem("negativeSign", item, "negativeSign()")
+                "timeFormat", d.ns + "QLocale::LongFormat")
+            d.putCallItem("decimalPoint", item, "decimalPoint")
+            d.putCallItem("exponential", item, "exponential")
+            d.putCallItem("percent", item, "percent")
+            d.putCallItem("zeroDigit", item, "zeroDigit")
+            d.putCallItem("groupSeparator", item, "groupSeparator")
+            d.putCallItem("negativeSign", item, "negativeSign")
 
 
 def qdump__QMapNode(d, item):
@@ -765,7 +713,7 @@ def qdump__QObject(d, item):
                 namesArray = names["d"]["array"]
                 dynamicPropertyCount = namesEnd - namesBegin
 
-            #staticPropertyCount = call(mo, "propertyCount()")
+            #staticPropertyCount = call(mo, "propertyCount")
             staticPropertyCount = metaData[6]
             #warn("PROPERTY COUNT: %s" % staticPropertyCount)
             propertyCount = staticPropertyCount + dynamicPropertyCount
@@ -825,8 +773,8 @@ def qdump__QObject(d, item):
                             #     % (d.ns, item.value.address, propertyName)
                             #exp = '"((\'%sQObject\'*)%s)"' % (d.ns, item.value.address,)
                             #warn("EXPRESSION:  %s" % exp)
-                            value = call(item.value, 'property(%s)'
-                                % cleanAddress(metaStringData + metaData[offset]))
+                            value = call(item.value, "property",
+                                str(cleanAddress(metaStringData + metaData[offset])))
                             value1 = value["d"]
                             #warn("   CODE: %s" % value1["type"])
                             # Type 1 and 2 are bool and int. Try to save a few cycles in this case:
@@ -850,7 +798,7 @@ def qdump__QObject(d, item):
                            #    type = str(call(item.value, func))
                            #    type = type[type.find('"') + 1 : type.rfind('"')]
                            #    type = type.replace("Q", d.ns + "Q") # HACK!
-                           #    data = call(item.value, "constData()")
+                           #    data = call(item.value, "constData")
                            #    tdata = data.cast(lookupType(type).pointer()).dereference()
                            #    d.putValue("(%s)" % tdata.type)
                            #    d.putType(tdata.type)
@@ -1720,13 +1668,13 @@ def qdump__QTemporaryFile(d, item):
 
 
 def qdump__QTextCodec(d, item):
-    value = call(item.value, "name()")
+    value = call(item.value, "name")
     d.putValue(encodeByteArray(value), 6)
     d.putNumChild(2)
     if d.isExpanded(item):
         with Children(d):
-            d.putCallItem("name", item, "name()")
-            d.putCallItem("mibEnum", item, "mibEnum()")
+            d.putCallItem("name", item, "name")
+            d.putCallItem("mibEnum", item, "mibEnum")
 
 
 def qdump__QTextCursor(d, item):
@@ -1746,7 +1694,7 @@ def qdump__QTextCursor(d, item):
             with Children(d):
                 d.putIntItem("position", p["position"])
                 d.putIntItem("anchor", p["anchor"])
-                d.putCallItem("selected", item, "selectedText()")
+                d.putCallItem("selected", item, "selectedText")
 
 
 def qdump__QTextDocument(d, item):
@@ -1754,11 +1702,11 @@ def qdump__QTextDocument(d, item):
     d.putNumChild(1)
     if d.isExpanded(item):
         with Children(d):
-            d.putCallItem("blockCount", item, "blockCount()")
-            d.putCallItem("characterCount", item, "characterCount()")
-            d.putCallItem("lineCount", item, "lineCount()")
-            d.putCallItem("revision", item, "revision()")
-            d.putCallItem("toPlainText", item, "toPlainText()")
+            d.putCallItem("blockCount", item, "blockCount")
+            d.putCallItem("characterCount", item, "characterCount")
+            d.putCallItem("lineCount", item, "lineCount")
+            d.putCallItem("revision", item, "revision")
+            d.putCallItem("toPlainText", item, "toPlainText")
 
 
 def qdump__QUrl(d, item):
@@ -1932,21 +1880,27 @@ def qdump__QVariant(d, item):
         d.putItem(Item(v, item.iname))
         d.putType("%sQVariant (%s)" % (d.ns, innert), d.currentTypePriority + 1)
         return innert
-    else:
-        # User types.
-        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!
-        data = call(item.value, "constData()")
-        tdata = data.cast(lookupType(type).pointer()).dereference()
-        d.putType("%sQVariant (%s)" % (d.ns, tdata.type))
-        d.putNumChild(1)
-        if d.isExpanded(item):
-            with Children(d):
-                d.putSubItem(Item(tdata, item.iname, "data", "data"))
-        return tdata.type
+
+    # User types.
+    d_member = item.value["d"]
+    type = str(call(item.value, "typeToName",
+        "('%sQVariant::Type')%d" % (d.ns, d_member["type"])))
+    type = type[type.find('"') + 1 : type.rfind('"')]
+    type = type.replace("Q", d.ns + "Q") # HACK!
+    type = type.replace("COMMA", ",") # HACK!
+    #warn("TYPE: %s" % type)
+    data = call(item.value, "constData")
+    #warn("DATA: %s" % data)
+    d.putValue(" ", None, -99)
+    d.putType("%sQVariant (%s)" % (d.ns, type))
+    d.putNumChild(1)
+    if d.isExpanded(item):
+        with Children(d):
+            # This fails for templated and namepspaced types.
+            tdata = data.cast(lookupType(type).pointer()).dereference()
+            #warn("TDATA: %s" % tdata)
+            d.putSubItem(Item(tdata, item.iname, "data", "data"))
+    return tdata.type
 
 
 def qdump__QVector(d, item):
-- 
GitLab