Skip to content

Commit e3283e0

Browse files
committed
Handle new HashMap layout in GDB and LLDB
1 parent d51b7b2 commit e3283e0

File tree

2 files changed

+18
-4
lines changed

2 files changed

+18
-4
lines changed

src/etc/gdb_providers.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,13 @@ def __init__(self, valobj, show_values=True):
352352
ctrl = table["ctrl"]["pointer"]
353353

354354
self.size = int(table["items"])
355-
self.data_ptr = table["data"]["pointer"]
356-
self.pair_type = self.data_ptr.dereference().type
355+
self.pair_type = table.type.template_argument(0)
356+
357+
self.new_layout = not table.type.has_key("data")
358+
if self.new_layout:
359+
self.data_ptr = ctrl.cast(self.pair_type.pointer())
360+
else:
361+
self.data_ptr = table["data"]["pointer"]
357362

358363
self.valid_indices = []
359364
for idx in range(capacity):
@@ -374,6 +379,8 @@ def children(self):
374379

375380
for index in range(self.size):
376381
idx = self.valid_indices[index]
382+
if self.new_layout:
383+
idx = -(idx + 1)
377384
element = (pairs_start + idx).dereference()
378385
if self.show_values:
379386
yield "key{}".format(index), element[ZERO_FIELD]

src/etc/lldb_providers.py

+9-2
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,8 @@ def get_child_at_index(self, index):
514514
# type: (int) -> SBValue
515515
pairs_start = self.data_ptr.GetValueAsUnsigned()
516516
idx = self.valid_indices[index]
517+
if self.new_layout:
518+
idx = -(idx + 1)
517519
address = pairs_start + idx * self.pair_type_size
518520
element = self.data_ptr.CreateValueFromAddress("[%s]" % index, address, self.pair_type)
519521
if self.show_values:
@@ -529,10 +531,15 @@ def update(self):
529531
ctrl = table.GetChildMemberWithName("ctrl").GetChildAtIndex(0)
530532

531533
self.size = table.GetChildMemberWithName("items").GetValueAsUnsigned()
532-
self.data_ptr = table.GetChildMemberWithName("data").GetChildAtIndex(0)
533-
self.pair_type = self.data_ptr.Dereference().GetType()
534+
self.pair_type = table.type.template_args[0]
534535
self.pair_type_size = self.pair_type.GetByteSize()
535536

537+
self.new_layout = not table.GetChildMemberWithName("data").IsValid()
538+
if self.new_layout:
539+
self.data_ptr = ctrl.Cast(self.pair_type.GetPointerType())
540+
else:
541+
self.data_ptr = table.GetChildMemberWithName("data").GetChildAtIndex(0)
542+
536543
u8_type = self.valobj.GetTarget().GetBasicType(eBasicTypeUnsignedChar)
537544
u8_type_size = self.valobj.GetTarget().GetBasicType(eBasicTypeUnsignedChar).GetByteSize()
538545

0 commit comments

Comments
 (0)