From c726f3c47ed3b0cc8d882919a29a620767347604 Mon Sep 17 00:00:00 2001
From: Christian Stenger <christian.stenger@digia.com>
Date: Mon, 28 Oct 2013 12:07:51 +0100
Subject: [PATCH] Dumpers: Fix standard types (C++11) for old gcc

Change-Id: Ic208a45f6d0c7419d83dccd78b552c734421c953
Reviewed-by: hjk <hjk121@nokiamail.com>
---
 share/qtcreator/debugger/stdtypes.py | 51 +++++++++++++++++++++-------
 1 file changed, 38 insertions(+), 13 deletions(-)

diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py
index 4ca65badb0f..c29cbfed11a 100644
--- a/share/qtcreator/debugger/stdtypes.py
+++ b/share/qtcreator/debugger/stdtypes.py
@@ -442,21 +442,36 @@ def qform__std____debug__unordered_map():
     return mapForms()
 
 def qdump__std__unordered_map(d, value):
+    keyType = d.templateArgument(value.type, 0)
+    valueType = d.templateArgument(value.type, 1)
+    allocatorType = d.templateArgument(value.type, 4)
+    pairType = d.templateArgument(allocatorType, 0)
+    ptrSize = d.ptrSize()
     try:
+    # gcc >= 4.7
         size = value["_M_element_count"]
         start = value["_M_before_begin"]["_M_nxt"]
+        offset = 0
     except:
-        size = value["_M_h"]["_M_element_count"]
-        start = value["_M_h"]["_M_bbegin"]["_M_node"]["_M_nxt"]
+            try:
+                # libc++ (Mac)
+                size = value["_M_h"]["_M_element_count"]
+                start = value["_M_h"]["_M_bbegin"]["_M_node"]["_M_nxt"]
+                offset = 0
+            except:
+                # gcc 4.6.2
+                size = value["_M_element_count"]
+                start = value["_M_buckets"].dereference()
+                # FIXME: Pointer-aligned?
+                offset = pairType.sizeof
+                d.putItemCount(size)
+                # We don't know where the data is
+                d.putNumChild(0)
+                return
     d.putItemCount(size)
     d.putNumChild(size)
     if d.isExpanded():
         p = d.pointerValue(start)
-        keyType = d.templateArgument(value.type, 0)
-        valueType = d.templateArgument(value.type, 1)
-        allocatorType = d.templateArgument(value.type, 4)
-        pairType = d.templateArgument(allocatorType, 0)
-        ptrSize = d.ptrSize()
         if d.isMapCompact(keyType, valueType):
             with Children(d, size, childType=valueType):
                 for i in d.childRange():
@@ -469,19 +484,29 @@ def qdump__std__unordered_map(d, value):
         else:
             with Children(d, size, childType=pairType):
                 for i in d.childRange():
-                    d.putSubItem(i, d.createValue(p + ptrSize, pairType))
-                    p = d.dereference(p)
+                    d.putSubItem(i, d.createValue(p + ptrSize - offset, pairType))
+                    p = d.dereference(p + offset)
 
 def qdump__std____debug__unordered_map(d, value):
     qdump__std__unordered_map(d, value)
 
 def qdump__std__unordered_set(d, value):
     try:
+        # gcc >= 4.7
         size = value["_M_element_count"]
         start = value["_M_before_begin"]["_M_nxt"]
+        offset = 0
     except:
-        size = value["_M_h"]["_M_element_count"]
-        start = value["_M_h"]["_M_bbegin"]["_M_node"]["_M_nxt"]
+            try:
+                # libc++ (Mac)
+                size = value["_M_h"]["_M_element_count"]
+                start = value["_M_h"]["_M_bbegin"]["_M_node"]["_M_nxt"]
+                offset = 0
+            except:
+                # gcc 4.6.2
+                size = value["_M_element_count"]
+                start = value["_M_buckets"].dereference()
+                offset = d.ptrSize()
     d.putItemCount(size)
     d.putNumChild(size)
     if d.isExpanded():
@@ -490,8 +515,8 @@ def qdump__std__unordered_set(d, value):
         with Children(d, size, childType=valueType):
             ptrSize = d.ptrSize()
             for i in d.childRange():
-                d.putSubItem(i, d.createValue(p + ptrSize, valueType))
-                p = d.dereference(p)
+                d.putSubItem(i, d.createValue(p + ptrSize - offset, valueType))
+                p = d.dereference(p + offset)
 
 def qform__std____1__unordered_map():
     return mapForms()
-- 
GitLab