From b889bb1608badceed0dc1175f3322ea8015f8924 Mon Sep 17 00:00:00 2001
From: hjk <hjk121@nokiamail.com>
Date: Wed, 23 Oct 2013 19:12:00 +0200
Subject: [PATCH] Debugger: Make QRegion dumper more independent of debuginfo

Change-Id: I332e17cd4c6a167d273f31f4e7ff63c149a5d34b
Reviewed-by: hjk <hjk121@nokiamail.com>
---
 share/qtcreator/debugger/qttypes.py | 39 ++++++++++++++++++++---------
 tests/auto/debugger/tst_dumpers.cpp |  6 ++---
 2 files changed, 29 insertions(+), 16 deletions(-)

diff --git a/share/qtcreator/debugger/qttypes.py b/share/qtcreator/debugger/qttypes.py
index 723a0e35d6e..a80986ef744 100644
--- a/share/qtcreator/debugger/qttypes.py
+++ b/share/qtcreator/debugger/qttypes.py
@@ -1465,19 +1465,34 @@ def qdump__QRegion(d, value):
         d.putValue("<empty>")
         d.putNumChild(0)
     else:
-        try:
-            # Fails without debug info.
-            n = int(p.dereference()["numRects"])
-            d.putItemCount(n)
-            d.putNumChild(n)
-            d.putPlainChildren(p.dereference())
-        except:
-            warn("NO DEBUG INFO")
-            d.putValue(p)
-            d.putPlainChildren(value)
+        # struct QRegionPrivate:
+        # int numRects;
+        # QVector<QRect> rects;
+        # QRect extents;
+        # QRect innerRect;
+        # int innerArea;
+        pp = d.dereferenceValue(p)
+        n = d.extractInt(pp)
+        d.putItemCount(n)
+        d.putNumChild(n)
+        if d.isExpanded():
+            with Children(d):
+                v = d.ptrSize()
+                rectType = d.lookupType(d.ns + "QRect")
+                d.putIntItem("numRects", n)
+                d.putSubItem("extents", d.createValue(pp + 2 * v, rectType))
+                d.putSubItem("innerRect", d.createValue(pp + 2 * v + rectType.sizeof, rectType))
+                # FIXME
+                try:
+                    # Can fail if QVector<QRect> debuginfo is missing.
+                    vectType = d.lookupType("%sQVector<%sQRect>" % (d.ns, d.ns))
+                    d.putSubItem("rects", d.createValue(pp + v, vectType))
+                except:
+                    with SubItem(d, "rects"):
+                        d.putItemCount(n)
+                        d.putType("%sQVector<%sQRect>" % (d.ns, d.ns))
+                        d.putNumChild(0)
 
-# qt_rgn might be 0
-# gdb.parse_and_eval("region")["d"].dereference()["qt_rgn"].dereference()
 
 def qdump__QScopedPointer(d, value):
     d.putBetterType(d.currentType)
diff --git a/tests/auto/debugger/tst_dumpers.cpp b/tests/auto/debugger/tst_dumpers.cpp
index 1b5412d2bfe..0bcb04d4975 100644
--- a/tests/auto/debugger/tst_dumpers.cpp
+++ b/tests/auto/debugger/tst_dumpers.cpp
@@ -2244,9 +2244,7 @@ void tst_Dumpers::dumper_data()
                % Check("s", "(100.5, 200.5)", "@QSizeF");
 
     QTest::newRow("QRegion")
-            << Data("#include <QRegion>\n"
-                    "#include <QString> // Dummy for namespace\n",
-                    "QString dummy;\n"
+            << Data("#include <QRegion>\n",
                     "QRegion region, region0, region1, region2;\n"
                     "region0 = region;\n"
                     "region += QRect(100, 100, 200, 200);\n"
@@ -2262,7 +2260,7 @@ void tst_Dumpers::dumper_data()
                % Check("region1.innerArea", "40000", "int")
                % Check("region1.innerRect", "200x200+100+100", "@QRect")
                % Check("region1.numRects", "1", "int")
-               % Check("region1.rects", "<0 items>", "@QVector<@QRect>")
+               % Check("region1.rects", "<1 items>", "@QVector<@QRect>")
                % Check("region2", "<2 items>", "@QRegion")
                % Check("region2.extents", "600x700+100+100", "@QRect")
                % Check("region2.innerArea", "200000", "int")
-- 
GitLab