From 3d3a5ca79fa6bbc83ec73a90c9a4337630ff76b2 Mon Sep 17 00:00:00 2001 From: ortem Date: Tue, 6 Apr 2021 12:23:28 +0300 Subject: [PATCH] Fix HashMap/HashSet LLDB pretty-printer after hashbrown 0.11.0 The pretty-printer was broken in https://github.com/rust-lang/rust/pull/77566 after updating hashbrown to 0.11.0. Note that the corresponding GDB pretty-printer was updated properly. --- src/etc/lldb_providers.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/etc/lldb_providers.py b/src/etc/lldb_providers.py index 702f2e82e4e2c..86dcc335e3cbf 100644 --- a/src/etc/lldb_providers.py +++ b/src/etc/lldb_providers.py @@ -527,20 +527,22 @@ def get_child_at_index(self, index): def update(self): # type: () -> None table = self.table() - capacity = table.GetChildMemberWithName("bucket_mask").GetValueAsUnsigned() + 1 - ctrl = table.GetChildMemberWithName("ctrl").GetChildAtIndex(0) + inner_table = table.GetChildMemberWithName("table") - self.size = table.GetChildMemberWithName("items").GetValueAsUnsigned() + capacity = inner_table.GetChildMemberWithName("bucket_mask").GetValueAsUnsigned() + 1 + ctrl = inner_table.GetChildMemberWithName("ctrl").GetChildAtIndex(0) + + self.size = inner_table.GetChildMemberWithName("items").GetValueAsUnsigned() self.pair_type = table.type.template_args[0] if self.pair_type.IsTypedefType(): self.pair_type = self.pair_type.GetTypedefedType() self.pair_type_size = self.pair_type.GetByteSize() - self.new_layout = not table.GetChildMemberWithName("data").IsValid() + self.new_layout = not inner_table.GetChildMemberWithName("data").IsValid() if self.new_layout: self.data_ptr = ctrl.Cast(self.pair_type.GetPointerType()) else: - self.data_ptr = table.GetChildMemberWithName("data").GetChildAtIndex(0) + self.data_ptr = inner_table.GetChildMemberWithName("data").GetChildAtIndex(0) u8_type = self.valobj.GetTarget().GetBasicType(eBasicTypeUnsignedChar) u8_type_size = self.valobj.GetTarget().GetBasicType(eBasicTypeUnsignedChar).GetByteSize() @@ -563,7 +565,7 @@ def table(self): # HashSet wraps either std HashMap or hashbrown::HashSet, which both # wrap hashbrown::HashMap, so either way we "unwrap" twice. hashbrown_hashmap = self.valobj.GetChildAtIndex(0).GetChildAtIndex(0) - return hashbrown_hashmap.GetChildMemberWithName("table").GetChildMemberWithName("table") + return hashbrown_hashmap.GetChildMemberWithName("table") def has_children(self): # type: () -> bool