From 1731911c4029d1b51a226e91a702f21bd13f108a Mon Sep 17 00:00:00 2001
From: hjk <qthjk@ovi.com>
Date: Sat, 4 Feb 2012 00:59:31 +0100
Subject: [PATCH] debugger: implement gdb python dumper fuer std::array

Change-Id: I32d353ec332d39fa80fab9780a0b084156842666
Reviewed-by: hjk <qthjk@ovi.com>
---
 share/qtcreator/dumper/dumper.py              |  7 ++++-
 share/qtcreator/dumper/qttypes.py             | 13 +++++++++
 .../debugger/simple/simple_test_app.cpp       | 28 +++++++++++++++++--
 3 files changed, 45 insertions(+), 3 deletions(-)

diff --git a/share/qtcreator/dumper/dumper.py b/share/qtcreator/dumper/dumper.py
index bcb41a7e7f5..311f9634603 100644
--- a/share/qtcreator/dumper/dumper.py
+++ b/share/qtcreator/dumper/dumper.py
@@ -278,7 +278,12 @@ def numericTemplateArgument(type, position):
     except RuntimeError, error:
         # ": No type named 30."
         msg = str(error)
-        return int(msg[14:-1])
+        msg = msg[14:-1]
+        # gdb at least until 7.4 produces for std::array<int, 4u>
+        # for template_argument(1): RuntimeError: No type named 4u.
+        if msg[-1] == 'u':
+           msg = msg[0:-1]
+        return int(msg)
 
 
 def showException(msg, exType, exValue, exTraceback):
diff --git a/share/qtcreator/dumper/qttypes.py b/share/qtcreator/dumper/qttypes.py
index 69c100fb294..d5ea22fa07b 100644
--- a/share/qtcreator/dumper/qttypes.py
+++ b/share/qtcreator/dumper/qttypes.py
@@ -1699,6 +1699,19 @@ def qdump__QxXmlAttributes(d, value):
 #
 #######################################################################
 
+def qdump__std__array(d, value):
+    size = numericTemplateArgument(value.type, 1)
+    d.putItemCount(size)
+    d.putNumChild(size)
+    if d.isExpanded():
+        innerType = templateArgument(value.type, 0)
+        with Children(d, size, childType=innerType):
+            pcur = value.address.cast(innerType.pointer())
+            for i in d.childRange():
+                d.putSubItem(i, pcur.dereference())
+                pcur += 1
+
+
 def qdump__std__complex(d, value):
     innerType = templateArgument(value.type, 0)
     base = value.address.cast(innerType.pointer())
diff --git a/tests/manual/debugger/simple/simple_test_app.cpp b/tests/manual/debugger/simple/simple_test_app.cpp
index db14d2d5338..6c01c1c19c1 100644
--- a/tests/manual/debugger/simple/simple_test_app.cpp
+++ b/tests/manual/debugger/simple/simple_test_app.cpp
@@ -158,6 +158,9 @@ void dummyStatement(...) {}
 #include <QStandardItemModel>
 #include <QLabel>
 
+#if USE_CXX11
+#include <array>
+#endif
 #include <complex>
 #include <deque>
 #include <iostream>
@@ -2259,6 +2262,25 @@ namespace qxml {
 } // namespace qxml
 
 
+namespace stdarray {
+
+    void testStdArray()
+    {
+        #if USE_CXX11
+        std::array<int, 4> a = { 1, 2, 3, 4};
+        BREAK_HERE;
+        // Expand a.
+        // Check a <4 items> std::array<int>.
+        // Check [0] 1 int.
+        // Continue.
+        dummyStatement(&a);
+        #endif
+    }
+
+} // namespace stdcomplex
+
+
+
 namespace stdcomplex {
 
     void testStdComplex()
@@ -2266,12 +2288,13 @@ namespace stdcomplex {
         std::complex<double> c(1, 2);
         BREAK_HERE;
         // Expand c.
-        // Check c (1.000000, 2.000000) complex.
+        // Check c (1.000000, 2.000000) std::complex<double>.
         // Continue.
         dummyStatement(&c);
     }
 
-} // namespace stddeque
+} // namespace stdcomplex
+
 
 namespace stddeque {
 
@@ -5972,6 +5995,7 @@ int main(int argc, char *argv[])
     namespc::testNamespace();
     painting::testPainting();
 
+    stdarray::testStdArray();
     stdcomplex::testStdComplex();
     stddeque::testStdDeque();
     stdlist::testStdList();
-- 
GitLab