summaryrefslogtreecommitdiff
path: root/src/etc
diff options
context:
space:
mode:
authorfukatani <nannyakannya@gmail.com>2018-08-06 23:00:19 +0900
committerfukatani <nannyakannya@gmail.com>2018-08-06 23:00:19 +0900
commitb6d4d403217d8ef7ff98f21924819880efed56f0 (patch)
tree76c2a18863b0300ef03bb0da905425ae4e36216c /src/etc
parentb47c314c5652c8ecc3f086b0326f467b857b9d5b (diff)
downloadrust-b6d4d403217d8ef7ff98f21924819880efed56f0.tar.gz
pretty print BTreeSet
Diffstat (limited to 'src/etc')
-rw-r--r--src/etc/debugger_pretty_printers_common.py22
-rwxr-xr-xsrc/etc/gdb_rust_pretty_printing.py27
2 files changed, 49 insertions, 0 deletions
diff --git a/src/etc/debugger_pretty_printers_common.py b/src/etc/debugger_pretty_printers_common.py
index 87c7b21bb8a..e64d863717d 100644
--- a/src/etc/debugger_pretty_printers_common.py
+++ b/src/etc/debugger_pretty_printers_common.py
@@ -48,6 +48,7 @@ TYPE_KIND_FIXED_SIZE_VEC = 16
TYPE_KIND_REGULAR_UNION = 17
TYPE_KIND_OS_STRING = 18
TYPE_KIND_STD_VECDEQUE = 19
+TYPE_KIND_STD_BTREESET = 20
ENCODED_ENUM_PREFIX = "RUST$ENCODED$ENUM$"
ENUM_DISR_FIELD_NAME = "RUST$ENUM$DISR"
@@ -71,6 +72,9 @@ STD_VECDEQUE_FIELD_NAMES = [STD_VECDEQUE_FIELD_NAME_TAIL,
STD_VECDEQUE_FIELD_NAME_HEAD,
STD_VECDEQUE_FIELD_NAME_BUF]
+# std::collections::BTreeSet<> related constants
+STD_BTREESET_FIELD_NAMES = ["map"]
+
# std::String related constants
STD_STRING_FIELD_NAMES = ["vec"]
@@ -175,6 +179,11 @@ class Type(object):
self.__conforms_to_field_layout(STD_VECDEQUE_FIELD_NAMES)):
return TYPE_KIND_STD_VECDEQUE
+ # STD COLLECTION BTREESET
+ if (unqualified_type_name.startswith("BTreeSet<") and
+ self.__conforms_to_field_layout(STD_BTREESET_FIELD_NAMES)):
+ return TYPE_KIND_STD_BTREESET
+
# STD STRING
if (unqualified_type_name.startswith("String") and
self.__conforms_to_field_layout(STD_STRING_FIELD_NAMES)):
@@ -358,6 +367,19 @@ def extract_tail_head_ptr_and_cap_from_std_vecdeque(vec_val):
return (tail, head, data_ptr, capacity)
+def extract_length_and_ptr_from_std_btreeset(vec_val):
+ assert vec_val.type.get_type_kind() == TYPE_KIND_STD_BTREESET
+ map = vec_val.get_child_at_index(0)
+ root = map.get_child_at_index(0)
+ length = map.get_child_at_index(1).as_integer()
+ node = root.get_child_at_index(0)
+ ptr = node.get_child_at_index(0)
+ unique_ptr_val = ptr.get_child_at_index(0)
+ data_ptr = unique_ptr_val.get_child_at_index(0)
+ assert data_ptr.type.get_dwarf_type_kind() == DWARF_TYPE_CODE_PTR
+ return (length, data_ptr)
+
+
def extract_length_and_ptr_from_slice(slice_val):
assert (slice_val.type.get_type_kind() == TYPE_KIND_SLICE or
slice_val.type.get_type_kind() == TYPE_KIND_STR_SLICE)
diff --git a/src/etc/gdb_rust_pretty_printing.py b/src/etc/gdb_rust_pretty_printing.py
index b7de42a9384..8d9af89a743 100755
--- a/src/etc/gdb_rust_pretty_printing.py
+++ b/src/etc/gdb_rust_pretty_printing.py
@@ -127,6 +127,9 @@ def rust_pretty_printer_lookup_function(gdb_val):
if type_kind == rustpp.TYPE_KIND_STD_VECDEQUE:
return RustStdVecDequePrinter(val)
+ if type_kind == rustpp.TYPE_KIND_STD_BTREESET:
+ return RustStdBTreeSetPrinter(val)
+
if type_kind == rustpp.TYPE_KIND_STD_STRING:
return RustStdStringPrinter(val)
@@ -299,6 +302,30 @@ class RustStdVecDequePrinter(object):
yield (str(index), (gdb_ptr + index).dereference())
+class RustStdBTreeSetPrinter(object):
+ def __init__(self, val):
+ self.__val = val
+
+ @staticmethod
+ def display_hint():
+ return "map"
+
+ def to_string(self):
+ (length, data_ptr) = \
+ rustpp.extract_length_and_ptr_from_std_btreeset(self.__val)
+ return (self.__val.type.get_unqualified_type_name() +
+ (" with %i elements" % length))
+
+ def children(self):
+ (length, data_ptr) = \
+ rustpp.extract_length_and_ptr_from_std_btreeset(self.__val)
+ val = GdbValue(data_ptr.get_wrapped_value().dereference()).get_child_at_index(0)
+ gdb_ptr = val.get_wrapped_value()
+ for index in xrange(length):
+ yield (str(index), str(index))
+ yield (str(index), gdb_ptr[index])
+
+
class RustStdStringPrinter(object):
def __init__(self, val):
self.__val = val