Debugger: Fix std::{unordered_,}{map,set} dumper for libc++

Task-number: QTCREATORBUG-18536
Change-Id: I2842a525e99e4fcd9544a1f15bd42fd5c8c0c16e
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Jeremy Barenholtz <jeremy@illiteratecoder.com>
This commit is contained in:
illiteratecoder
2019-03-05 16:07:16 -08:00
committed by Jeremy Barenholtz
parent 9686c85a46
commit 7b39db9e8a

View File

@@ -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<Foo, void *>::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<Foo, Bar>::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):