From a1e130471ea1527f6fbb55ab30b0f14b119c0457 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Fri, 27 Nov 2009 13:52:29 +0100
Subject: [PATCH] debugger: take care of antediluvian distributions

---
 share/qtcreator/gdbmacros/dumper.py    | 22 +++++---
 share/qtcreator/gdbmacros/gdbmacros.py | 75 +++++++++++++-------------
 2 files changed, 55 insertions(+), 42 deletions(-)

diff --git a/share/qtcreator/gdbmacros/dumper.py b/share/qtcreator/gdbmacros/dumper.py
index 1de98031574..b1392a42afa 100644
--- a/share/qtcreator/gdbmacros/dumper.py
+++ b/share/qtcreator/gdbmacros/dumper.py
@@ -13,6 +13,11 @@ import curses.ascii
 verbosity = 0
 verbosity = 1
 
+def select(condition, if_expr, else_expr):
+    if condition:
+        return if_expr
+    return else_expr
+
 def isSimpleType(typeobj):
     type = str(typeobj)
     return type == "bool" \
@@ -116,7 +121,10 @@ def call(value, func):
 class Item:
     def __init__(self, value, parentiname, iname, name):
         self.value = value
-        self.iname = parentiname if iname is None else "%s.%s" % (parentiname, iname)
+        if iname is None:
+            self.iname = parentiname
+        else:
+            self.iname = "%s.%s" % (parentiname, iname)
         self.name = name
 
 
@@ -174,7 +182,7 @@ class FrameCommand(gdb.Command):
 
         try:
             frame = gdb.selected_frame()
-        except RuntimeError as ex:
+        except RuntimeError:
             return ""
 
         d = Dumper()
@@ -277,9 +285,11 @@ class Dumper:
     def endItem(self):
         self.put('"')
 
-    def beginChildren(self, type = None, children = None):
+    def beginChildren(self, numChild = 1, type = None, children = None):
         childType = ""
         childNumChild = -1
+        if numChild == 0:
+            type = None
         if not type is None:
             childType = stripClassTag(str(type))
             self.putField("childtype", childType)
@@ -397,12 +407,12 @@ class Dumper:
             try:
                 self.putItemHelper(item)
 
-            except RuntimeError as ex:
+            except RuntimeError:
                 self.output = ""
                 # FIXME: Only catch debugger related exceptions
                 #exType, exValue, exTraceback = sys.exc_info()
                 #tb = traceback.format_exception(exType, exValue, exTraceback)
-                warn("Exception: %s" % ex.message)
+                #warn("Exception: %s" % ex.message)
                 # DeprecationWarning: BaseException.message
                 # has been deprecated
                 #warn("Exception.")
@@ -560,7 +570,7 @@ class Dumper:
                 innerType = None
                 if len(fields) == 1 and fields[0].name is None:
                     innerType = value.type.target()
-                self.beginChildren(innerType)
+                self.beginChildren(1, innerType)
 
                 for field in fields:
                     #warn("FIELD: %s" % field)
diff --git a/share/qtcreator/gdbmacros/gdbmacros.py b/share/qtcreator/gdbmacros/gdbmacros.py
index 23a8b1b8323..48357ad9db3 100644
--- a/share/qtcreator/gdbmacros/gdbmacros.py
+++ b/share/qtcreator/gdbmacros/gdbmacros.py
@@ -36,7 +36,7 @@ def qqDumpQByteArray(d, item):
     d.putNumChild(n)
 
     if d.isExpanded(item):
-        d.beginChildren(innerType if n > 0 else None)
+        d.beginChildren(n, innerType)
         p = gdb.Value(data.cast(innerType.pointer()))
         for i in xrange(0, n):
             d.putItem(Item(p.dereference(), item.iname, i, None))
@@ -48,7 +48,7 @@ def qqDumpQByteArray(d, item):
 
 def qqDumpQChar(d, item):
     ucs = int(item.value["ucs"])
-    c = ucs if curses.ascii.isprint(ucs) else '?'
+    c = select(curses.ascii.isprint(ucs), ucs, '?')
     d.putField("value", "'%c' (%d)" % (c, ucs))
     d.putNumChild(0)
 
@@ -103,7 +103,7 @@ def qqDumpQAbstractItemModel(d, item):
     d.putField("value", "(%s,%s)" % (rowCount, columnCount))
     d.putField("numchild", "1")
     if d.isExpanded(item):
-        d.beginChildren()
+        d.beginChildren(1)
         d.beginHash()
         d.putField("numchild", "1")
         d.putField("name", d.ns + "QObject")
@@ -132,7 +132,7 @@ def qqDumpQDateTime(d, item):
     d.putField("value", encodeString(date))
     d.putField("numchild", "3")
     if d.isExpanded(item):
-        d.beginChildren()
+        d.beginChildren(8)
         d.putCallItem("isNull", item, "isNull()")
         d.putCallItem("toTime_t", item, "toTime_t()")
         d.putCallItem("toString",
@@ -156,7 +156,7 @@ def qqDumpQDir(d, item):
     d.putField("value", encodeString(path))
     d.putField("numchild", "2")
     if d.isExpanded(item):
-        d.beginChildren()
+        d.beginChildren(2)
         d.putCallItem("absolutePath", item, "absolutePath()")
         d.putCallItem("canonicalPath", item, "canonicalPath()")
         d.endChildren()
@@ -168,7 +168,7 @@ def qqDumpQFile(d, item):
     d.putField("value", encodeString(fileName))
     d.putField("numchild", "2")
     if d.isExpanded(item):
-        d.beginChildren()
+        d.beginChildren(2)
         d.putCallItem("fileName", item, "fileName()")
         d.putCallItem("exists", item, "exists()")
         d.endChildren()
@@ -180,7 +180,7 @@ def qqDumpQFileInfo(d, item):
     d.putField("value", encodeString(filePath))
     d.putField("numchild", "3")
     if d.isExpanded(item):
-        d.beginChildren(gdb.lookup_type(d.ns + "QString"))
+        d.beginChildren(10, gdb.lookup_type(d.ns + "QString"))
         d.putCallItem("absolutePath", item, "absolutePath()")
         d.putCallItem("absoluteFilePath", item, "absoluteFilePath()")
         d.putCallItem("canonicalPath", item, "canonicalPath()")
@@ -210,7 +210,7 @@ def qqDumpQFileInfo(d, item):
         d.putField("type", d.ns + "QFile::Permissions")
         d.putField("numchild", 10)
         if d.isExpandedIName(item.iname + ".permissions"):
-            d.beginChildren()
+            d.beginChildren(10)
             d.putBoolItem("ReadOwner",  perms & 0x4000)
             d.putBoolItem("WriteOwner", perms & 0x2000)
             d.putBoolItem("ExeOwner",   perms & 0x1000)
@@ -308,8 +308,8 @@ def qqDumpQHash(d, item):
         node = hashDataFirstNode(item.value)
 
         innerType = e_ptr.dereference().type
-        inner = valueType if isSimpleKey and isSimpleValue else innerType
-        d.beginChildren(inner if n > 0 else None)
+        inner = select(isSimpleKey and isSimpleValue, valueType, innerType)
+        d.beginChildren(n, inner)
         for i in xrange(0, n):
             it = node.dereference().cast(innerType)
             d.beginHash()
@@ -371,7 +371,7 @@ def qqDumpQList(d, item):
         and str(innerType.target().unqualified()) != "char"
     if innerTypeIsPointer:
         p = gdb.Value(array).cast(innerType.pointer()) + begin
-        checkPointerRange(p, n if n < 100 else 100)
+        checkPointerRange(p, select(n < 100, n, 100))
 
     d.putItemCount(n)
     d.putField("numchild", n)
@@ -390,8 +390,11 @@ def qqDumpQList(d, item):
         #warn("INTERNAL: %d" % int(isInternal))
 
         p = gdb.Value(array).cast(innerType.pointer()) + begin
-        inner = innerType.target() if innerTypeIsPointer else innerType
-        d.beginChildren(inner if n > 0 else None)
+        if innerTypeIsPointer:
+            inner = innerType.target()
+        else:
+            inner = innerType
+        d.beginChildren(n, inner)
         for i in xrange(0, n):
             if innerTypeIsPointer:
                 if isNull(p.dereference()):
@@ -428,9 +431,9 @@ def qqDumpQImage(d, item):
     #    if d.isExpanded(item):
     #        d.beginChildren()
     #        d.beginHash()
-    #            d.putField("name", "data")
-    #            d.putField("type", d.ns +  "QImageData")
-    #            d.putField("addr", d.data)
+    #        d.putField("name", "data")
+    #        d.putField("type", d.ns +  "QImageData")
+    #        d.putField("addr", d.data)
     #        d.endHash()
     #        d.endChildren()
 
@@ -467,7 +470,7 @@ def qqDumpQLinkedList(d, item):
         innerType = item.value.type.template_argument(0)
         if n > 1000:
             n = 1000
-        d.beginChildren(innerType if n > 0 else None)
+        d.beginChildren(n, innerType)
         p = e_ptr["n"]
         for i in xrange(0, n):
             d.putItemOrPointer(Item(p["t"], None, None, None))
@@ -483,7 +486,7 @@ def qqDumpQLocale(d, item):
     d.putField("value", encodeString(name))
     d.putField("numchild", "8")
     if d.isExpanded(item):
-        d.beginChildren(gdb.lookup_type(d.ns + "QChar"), 0)
+        d.beginChildren(1, gdb.lookup_type(d.ns + "QChar"), 0)
         d.putCallItem("country", item, "country()")
         d.putCallItem("language", item, "language()")
         d.putCallItem("measurementSystem", item, "measurementSystem()")
@@ -505,7 +508,7 @@ def qqDumpQMapNode(d, item):
     d.putField("value", " ")
     d.putField("numchild", 2)
     if d.isExpanded(item):
-        d.beginChildren()
+        d.beginChildren(2)
         d.beginHash()
         d.putField("name", "key")
         d.putItemHelper(Item(item.value["key"], item.iname, "name", None))
@@ -545,9 +548,9 @@ def qqDumpQMap(d, item):
         payloadSize = nodeType.sizeof - 2 * gdb.lookup_type("void").pointer().sizeof
         charPtr = gdb.lookup_type("char").pointer()
 
-        innerType = valueType if isSimpleKey and isSimpleValue else nodeType
+        innerType = select(isSimpleKey and isSimpleValue, valueType, nodeType)
 
-        d.beginChildren(innerType if n > 0 else None)
+        d.beginChildren(n, innerType)
         for i in xrange(0, n):
             itd = it.dereference()
             base = it.cast(charPtr) - payloadSize
@@ -1392,7 +1395,7 @@ def qqDumpQPoint(d, item):
     d.putField("value", "(%s, %s)" % (x, y))
     d.putNumChild(2)
     if d.isExpanded(item):
-        d.beginChildren(x.type.strip_typedefs())
+        d.beginChildren(2, x.type.strip_typedefs())
         d.putItem(Item(x, None, None, "x"))
         d.putItem(Item(y, None, None, "y"))
         d.endChildren()
@@ -1408,7 +1411,7 @@ def qqDumpQSize(d, item):
     d.putField("value", "(%s, %s)" % (w, h))
     d.putNumChild(2)
     if d.isExpanded(item):
-        d.beginChildren(w.type)
+        d.beginChildren(2, w.type)
         d.putItem(Item(w, item.iname, "w", "w"))
         d.putItem(Item(h, item.iname, "h", "h"))
         d.endChildren()
@@ -1429,7 +1432,7 @@ def qqDumpQRect(d, item):
     d.putField("value", "%sx%s%s%s" % (w, h, pp(x1), pp(y1)))
     d.putNumChild(4)
     if d.isExpanded(item):
-        d.beginChildren(x1.type.strip_typedefs())
+        d.beginChildren(4, x1.type.strip_typedefs())
         d.putItem(Item(x1, None, None, "x1"))
         d.putItem(Item(y1, None, None, "y1"))
         d.putItem(Item(x2, None, None, "x2"))
@@ -1451,7 +1454,7 @@ def qqDumpQRectF(d, item):
     d.putField("value", "%sx%s%s%s" % (w, h, pp(x), pp(y)))
     d.putNumChild(4)
     if d.isExpanded(item):
-        d.beginChildren(x.type.strip_typedefs())
+        d.beginChildren(4, x.type.strip_typedefs())
         d.putItem(Item(x, None, None, "x"))
         d.putItem(Item(y, None, None, "y"))
         d.putItem(Item(w, None, None, "w"))
@@ -1503,7 +1506,7 @@ def qqDumpQStringList(d, item):
             n = 1000
         innerType = gdb.lookup_type(d.ns + "QString")
         ptr = gdb.Value(d_ptr["array"]).cast(innerType.pointer())
-        d.beginChildren(innerType if n > 0 else None)
+        d.beginChildren(n, innerType)
         for i in xrange(0, n):
             d.putItem(Item(ptr.dereference(), item.iname, i, None))
             ptr += 1
@@ -1564,7 +1567,7 @@ def qqDumpQSet(d, item):
         node = hashDataFirstNode(item.value)
 
         innerType = e_ptr.dereference().type
-        d.beginChildren(keyType if n > 0 else None)
+        d.beginChildren(n, keyType)
         for i in xrange(0, n):
             it = node.dereference().cast(innerType)
             d.beginHash()
@@ -1747,7 +1750,7 @@ def qqDumpQVector(d, item):
         if n > 10000:
             n = 10000
         p = gdb.Value(p_ptr["array"]).cast(innerType.pointer())
-        d.beginChildren(innerType if n > 0 else None)
+        d.beginChildren(n, innerType)
         for i in xrange(0, n):
             d.putItemOrPointer(Item(p.dereference(), item.iname, i, None))
             p += 1
@@ -1781,7 +1784,7 @@ def qqDumpQWeakPointer(d, item):
 
     d.putField("numchild", 3)
     if d.isExpanded(item):
-        d.beginChildren()
+        d.beginChildren(3)
         d.putItem(Item(value.dereference(), item.iname, "data", "data"))
         d.putIntItem("weakref", weakref)
         d.putIntItem("strongref", strongref)
@@ -1805,7 +1808,7 @@ def qqDumpStdDeque(d, item):
         innerType = item.value.type.template_argument(0)
         innerSize = innerType.sizeof
         bufsize = 512 / innerSize if innerSize < 512 else 1
-        d.beginChildren(innerType if n > 0 else None)
+        d.beginChildren(n, innerType)
         pcur = start["_M_cur"]
         pfirst = start["_M_first"]
         plast = start["_M_last"]
@@ -1841,7 +1844,7 @@ def qqDumpStdList(d, item):
     if d.isExpanded(item):
         p = node["_M_next"]
         innerType = item.value.type.template_argument(0)
-        d.beginChildren(innerType if n > 0 else None)
+        d.beginChildren(n, innerType)
         for i in xrange(0, n):
             innerPointer = innerType.pointer()
             value = (p + 1).cast(innerPointer).dereference()
@@ -1868,8 +1871,8 @@ def qqDumpStdMap(d, item):
         innerType = valueType if isSimpleKey and isSimpleValue else pairType
         pairPointer = pairType.pointer()
         node = impl["_M_header"]["_M_left"]
-        d.beginChildren(innerType if n > 0 else pairType,
-            None if isSimpleKey and isSimpleValue else 2)
+        d.beginChildren(n, select(n > 0, innerType, pairType),
+            select(isSimpleKey and isSimpleValue, None, 2))
         for i in xrange(0, n if n < 1000 else 1000):
             pair = (node + 1).cast(pairPointer).dereference()
 
@@ -1880,7 +1883,7 @@ def qqDumpStdMap(d, item):
             else:
                 d.putField("value", " ")
                 if d.isExpandedIName("%s.%d" % (item.iname, i)):
-                    d.beginChildren(None)
+                    d.beginChildren(2, None)
                     iname = "%s.%d." % (item.iname, i)
                     keyItem = Item(pair["first"], iname + "key", "key", "first")
                     valueItem = Item(pair["second"], iname + "value", "value", "second")
@@ -1915,7 +1918,7 @@ def qqDumpStdSet(d, item):
     if d.isExpanded(item):
         valueType = item.value.type.template_argument(0)
         node = impl["_M_header"]["_M_left"]
-        d.beginChildren(valueType if n > 0 else None)
+        d.beginChildren(n, valueType)
         for i in xrange(0, n if n < 1000 else 1000):
             element = (node + 1).cast(valueType.pointer()).dereference()
             d.putItem(Item(element, item.iname, i, None))
@@ -1986,7 +1989,7 @@ def qqDumpStdVector(d, item):
             n = 10000
         p = start
         innerType = item.value.type.template_argument(0)
-        d.beginChildren(innerType if n > 0 else None)
+        d.beginChildren(n, innerType)
         for i in xrange(0, n):
             d.putItemOrPointer(Item(p.dereference(), item.iname, i, None))
             p += 1
-- 
GitLab