Skip to content

Commit d56d9e3

Browse files
committed
Update HashMap/HashSet pretty-printers to Rust 1.47
The corresponding PRs in rustc: rust-lang/rust#76458 rust-lang/rust#70052
1 parent 8e7a4e7 commit d56d9e3

File tree

5 files changed

+48
-12
lines changed

5 files changed

+48
-12
lines changed

prettyPrinters/gdb_lookup.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,9 @@ def lookup(valobj):
6565
else:
6666
return StdOldHashMapProvider(valobj)
6767
if rust_type == RustType.STD_HASH_SET:
68-
hash_map = valobj["map"]
68+
hash_map = valobj[valobj.type.fields()[0]]
6969
if is_hashbrown_hashmap(hash_map):
70-
return StdHashMapProvider(hash_map, show_values=False)
70+
return StdHashMapProvider(valobj, show_values=False)
7171
else:
7272
return StdOldHashMapProvider(hash_map, show_values=False)
7373

prettyPrinters/gdb_providers.py

+22-3
Original file line numberDiff line numberDiff line change
@@ -350,13 +350,18 @@ def __init__(self, valobj, show_values=True):
350350
self.valobj = valobj
351351
self.show_values = show_values
352352

353-
table = self.valobj["base"]["table"]
353+
table = self.table()
354354
capacity = int(table["bucket_mask"]) + 1
355355
ctrl = table["ctrl"]["pointer"]
356356

357357
self.size = int(table["items"])
358-
self.data_ptr = table["data"]["pointer"]
359-
self.pair_type = self.data_ptr.dereference().type
358+
self.pair_type = table.type.template_argument(0).strip_typedefs()
359+
360+
self.new_layout = not table.type.has_key("data")
361+
if self.new_layout:
362+
self.data_ptr = ctrl.cast(self.pair_type.pointer())
363+
else:
364+
self.data_ptr = table["data"]["pointer"]
360365

361366
self.valid_indices = []
362367
for idx in range(capacity):
@@ -366,6 +371,18 @@ def __init__(self, valobj, show_values=True):
366371
if is_presented:
367372
self.valid_indices.append(idx)
368373

374+
def table(self):
375+
if self.show_values:
376+
hashbrown_hashmap = self.valobj["base"]
377+
elif self.valobj.type.fields()[0].name == "map":
378+
# BACKCOMPAT: rust 1.47
379+
# HashSet wraps std::collections::HashMap, which wraps hashbrown::HashMap
380+
hashbrown_hashmap = self.valobj["map"]["base"]
381+
else:
382+
# HashSet wraps hashbrown::HashSet, which wraps hashbrown::HashMap
383+
hashbrown_hashmap = self.valobj["base"]["map"]
384+
return hashbrown_hashmap["table"]
385+
369386
def to_string(self):
370387
return "size={}".format(self.size)
371388

@@ -374,6 +391,8 @@ def children(self):
374391

375392
for index in range(self.size):
376393
idx = self.valid_indices[index]
394+
if self.new_layout:
395+
idx = -(idx + 1)
377396
element = (pairs_start + idx).dereference()
378397
if self.show_values:
379398
yield ("key{}".format(index), element[ZERO_FIELD])

prettyPrinters/lldb_lookup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ def synthetic_lookup(valobj, dict):
9393
if rust_type == RustType.STD_HASH_SET:
9494
hash_map = valobj.GetChildAtIndex(0)
9595
if is_hashbrown_hashmap(hash_map):
96-
return StdHashMapSyntheticProvider(hash_map, dict, show_values=False)
96+
return StdHashMapSyntheticProvider(valobj, dict, show_values=False)
9797
else:
9898
return StdOldHashMapSyntheticProvider(hash_map, dict, show_values=False)
9999

prettyPrinters/lldb_providers.py

+23-4
Original file line numberDiff line numberDiff line change
@@ -470,6 +470,8 @@ def get_child_at_index(self, index):
470470
# type: (int) -> SBValue
471471
pairs_start = self.data_ptr.GetValueAsUnsigned()
472472
idx = self.valid_indices[index]
473+
if self.new_layout:
474+
idx = -(idx + 1)
473475
address = pairs_start + idx * self.pair_type_size
474476
element = self.data_ptr.CreateValueFromAddress("[%s]" % index, address, self.pair_type)
475477
if self.show_values:
@@ -480,26 +482,43 @@ def get_child_at_index(self, index):
480482

481483
def update(self):
482484
# type: () -> None
483-
table = self.valobj.GetChildMemberWithName("base").GetChildMemberWithName("table")
485+
table = self.table()
484486
capacity = table.GetChildMemberWithName("bucket_mask").GetValueAsUnsigned() + 1
485487
ctrl = table.GetChildMemberWithName("ctrl").GetChildAtIndex(0)
486488

487489
self.size = table.GetChildMemberWithName("items").GetValueAsUnsigned()
488-
self.data_ptr = table.GetChildMemberWithName("data").GetChildAtIndex(0)
489-
self.pair_type = self.data_ptr.Dereference().GetType()
490+
self.pair_type = table.type.template_args[0].GetTypedefedType()
490491
self.pair_type_size = self.pair_type.GetByteSize()
491492

493+
self.new_layout = not table.GetChildMemberWithName("data").IsValid()
494+
if self.new_layout:
495+
self.data_ptr = ctrl.Cast(self.pair_type.GetPointerType())
496+
else:
497+
self.data_ptr = table.GetChildMemberWithName("data").GetChildAtIndex(0)
498+
492499
u8_type = self.valobj.GetTarget().GetBasicType(eBasicTypeUnsignedChar)
493500
u8_type_size = self.valobj.GetTarget().GetBasicType(eBasicTypeUnsignedChar).GetByteSize()
494501

495502
self.valid_indices = []
496503
for idx in range(capacity):
497504
address = ctrl.GetValueAsUnsigned() + idx * u8_type_size
498-
value = ctrl.CreateValueFromAddress("ctrl[%s]" % idx, address, u8_type).GetValueAsUnsigned()
505+
value = ctrl.CreateValueFromAddress("ctrl[%s]" % idx, address,
506+
u8_type).GetValueAsUnsigned()
499507
is_present = value & 128 == 0
500508
if is_present:
501509
self.valid_indices.append(idx)
502510

511+
def table(self):
512+
# type: () -> SBValue
513+
if self.show_values:
514+
hashbrown_hashmap = self.valobj.GetChildMemberWithName("base")
515+
else:
516+
# BACKCOMPAT: rust 1.47
517+
# HashSet wraps either std HashMap or hashbrown::HashSet, which both
518+
# wrap hashbrown::HashMap, so either way we "unwrap" twice.
519+
hashbrown_hashmap = self.valobj.GetChildAtIndex(0).GetChildAtIndex(0)
520+
return hashbrown_hashmap.GetChildMemberWithName("table")
521+
503522
def has_children(self):
504523
# type: () -> bool
505524
return True

pretty_printers_tests/tests/hash_map.rs

-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
// min-version: 1.33.0
2-
// https://github.com/intellij-rust/intellij-rust/issues/6198
3-
// max-version: 1.46.0
42

53
// === LLDB TESTS ==================================================================================
64

0 commit comments

Comments
 (0)