diff options
author | fukatani <nannyakannya@gmail.com> | 2018-08-06 23:00:19 +0900 |
---|---|---|
committer | fukatani <nannyakannya@gmail.com> | 2018-08-06 23:00:19 +0900 |
commit | b6d4d403217d8ef7ff98f21924819880efed56f0 (patch) | |
tree | 76c2a18863b0300ef03bb0da905425ae4e36216c /src/etc | |
parent | b47c314c5652c8ecc3f086b0326f467b857b9d5b (diff) | |
download | rust-b6d4d403217d8ef7ff98f21924819880efed56f0.tar.gz |
pretty print BTreeSet
Diffstat (limited to 'src/etc')
-rw-r--r-- | src/etc/debugger_pretty_printers_common.py | 22 | ||||
-rwxr-xr-x | src/etc/gdb_rust_pretty_printing.py | 27 |
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 |