diff --git a/share/qtcreator/debugger/stdtypes.py b/share/qtcreator/debugger/stdtypes.py index 8810e099127..cca73b7717a 100644 --- a/share/qtcreator/debugger/stdtypes.py +++ b/share/qtcreator/debugger/stdtypes.py @@ -507,23 +507,30 @@ def std1TreeNext(d, node): return node['__parent_'] def qdump__std____1__set(d, value): - tree = value["__tree_"] - base3 = tree["__pair3_"].address() - size = d.extractUInt(base3) - d.check(size <= 100*1000*1000) + (proxy, head, size) = value.split("ppp") + + d.check(0 <= size and size <= 100*1000*1000) d.putItemCount(size) + if d.isExpanded(): - # type of node is std::__1::__tree_node::value_type valueType = value.type[0] - d.putFields(tree) - node = tree["__begin_node_"] - nodeType = node.type - with Children(d, size): - for i in d.childRange(): - with SubItem(d, i): - d.putItem(node['__value_']) - d.putBetterType(valueType) - node = std1TreeNext(d, node).cast(nodeType) + + def in_order_traversal(node): + (left, right, parent, color, pad, data) = d.split("pppB@{%s}" % (valueType.name), node) + + if left: + for res in in_order_traversal(left): + yield res + + yield data + + if right: + for res in in_order_traversal(right): + yield res + + with Children(d, size, maxNumChild=1000): + for (i, data) in zip(d.childRange(), in_order_traversal(head)): + d.putSubItem(i, data) def qdump__std____1__multiset(d, value): qdump__std____1__set(d, value) @@ -532,24 +539,38 @@ def qform__std____1__map(): return mapForms() def qdump__std____1__map(d, value): - tree = value["__tree_"] - base3 = tree["__pair3_"].address() - size = d.extractUInt(base3) - d.check(size <= 100*1000*1000) + try: + (proxy, head, size) = value.split("ppp") + d.check(0 <= size and size <= 100*1000*1000) + + # Sometimes there is extra data at the front. Don't know why at the moment. + except RuntimeError: + (junk, proxy, head, size) = value.split("pppp") + d.check(0 <= size and size <= 100*1000*1000) + d.putItemCount(size) + if d.isExpanded(): - # type of node is std::__1::__tree_node::value_type - valueType = value.type[0] - node = tree["__begin_node_"] - nodeType = node.type + keyType = value.type[0] + valueType = value.type[1] + pairType = value.type[3][0] + + def in_order_traversal(node): + (left, right, parent, color, pad, pair) = d.split("pppB@{%s}" % (pairType.name), node) + + if left: + for res in in_order_traversal(left): + yield res + + yield pair.split("{%s}@{%s}" % (keyType.name, valueType.name))[::2] + + if right: + for res in in_order_traversal(right): + yield res + with Children(d, size, maxNumChild=1000): - node = tree["__begin_node_"] - for i in d.childRange(): - # There's possibly also: - #pair = node['__value_']['__nc'] - pair = node['__value_']['__cc'] - d.putPairItem(i, pair) - node = std1TreeNext(d, node).cast(nodeType) + for (i, pair) in zip(d.childRange(), in_order_traversal(head)): + d.putPairItem(i, pair, 'key', 'value') def qform__std____1__multimap(): return mapForms() @@ -833,32 +854,45 @@ def qform__std____1__unordered_map(): return mapForms() def qdump__std____1__unordered_map(d, value): - size = value["__table_"]["__p2_"]["__first_"].integer() + (size, _) = value["__table_"]["__p2_"].split("pp") d.putItemCount(size) - if d.isExpanded(): - # There seem to be several versions of the implementation. - def valueCCorNot(val): - try: - return val["__cc"] - except: - return val - node = value["__table_"]["__p1_"]["__first_"]["__next_"] - with Children(d, size): - for i in d.childRange(): - d.putPairItem(i, valueCCorNot(node["__value_"])) - node = node["__next_"] + keyType = value.type[0] + valueType = value.type[1] + pairType = value.type[4][0] + + if d.isExpanded(): + curr = value["__table_"]["__p1_"].split("pp")[0] + + def traverse_list(node): + while node: + (next_, _, pad, pair) = d.split("pp@{%s}" % (pairType.name), node) + yield pair.split("{%s}@{%s}" % (keyType.name, valueType.name))[::2] + node = next_ + + with Children(d, size, childType=value.type[0], maxNumChild=1000): + for (i, value) in zip(d.childRange(), traverse_list(curr)): + d.putPairItem(i, value, 'key', 'value') def qdump__std____1__unordered_set(d, value): - size = int(value["__table_"]["__p2_"]["__first_"]) + (size, _) = value["__table_"]["__p2_"].split("pp") d.putItemCount(size) + + valueType = value.type[0] + if d.isExpanded(): - node = value["__table_"]["__p1_"]["__first_"]["__next_"] + curr = value["__table_"]["__p1_"].split("pp")[0] + + def traverse_list(node): + while node: + (next_, _, pad, val) = d.split("pp@{%s}" % (valueType.name), node) + yield val + node = next_ + with Children(d, size, childType=value.type[0], maxNumChild=1000): - for i in d.childRange(): - d.putSubItem(i, node["__value_"]) - node = node["__next_"] + for (i, value) in zip(d.childRange(), traverse_list(curr)): + d.putSubItem(i, value) def qdump__std____debug__unordered_set(d, value):