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