Skip to content

Commit 9b7fe2b

Browse files
authored
Add pretty printer for Chapel's list type (#28319)
Adds a pretty printer for Chapel's list type Relies on features implemented in #28318 Tests added in #28318 [Reviewed by @dlongnecke-cray]
2 parents 9560887 + b4248d4 commit 9b7fe2b

File tree

1 file changed

+47
-1
lines changed

1 file changed

+47
-1
lines changed

runtime/etc/debug/chpl_lldb_pretty_print.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,6 +619,49 @@ def get_child_at_index(self, index):
619619
)
620620

621621

622+
list_regex_llvm = re.compile(r"^(List::list\((?P<eltType>[a-zA-Z0-9_()]+)(,(?P<parSafe>(true|false)))?\))$")
623+
624+
def ListRecognizer(sbtype, internal_dict):
625+
typename = sbtype.GetName()
626+
match = list_regex_llvm.match(typename)
627+
return match is not None
628+
629+
def ListSummary(valobj, internal_dict):
630+
size = valobj.GetNonSyntheticValue().GetChildMemberWithName("_size").GetValueAsUnsigned()
631+
return f"size = {size}"
632+
633+
class ListProvider:
634+
def __init__(self, valobj, internal_dict):
635+
self.valobj = valobj
636+
637+
self.synthetic_children = {}
638+
size = self.valobj.GetNonSyntheticValue().GetChildMemberWithName("_size").GetValueAsUnsigned()
639+
for i in range(size):
640+
element_name = f"[{i}]"
641+
element = self.valobj.CreateValueFromExpression(element_name, f"({self.valobj.GetName()})._getRef({i})")
642+
if element.IsValid():
643+
self.synthetic_children[f"[{i}]"] = element
644+
645+
def has_children(self):
646+
return self.num_children() > 0
647+
648+
def num_children(self):
649+
return len(self.synthetic_children)
650+
651+
def get_child_index(self, name):
652+
if name in self.synthetic_children:
653+
return list(self.synthetic_children.keys()).index(name)
654+
else:
655+
return -1
656+
657+
def get_child_at_index(self, index):
658+
if index < 0 or index >= self.num_children():
659+
return None
660+
key = list(self.synthetic_children.keys())[index]
661+
child_obj = self.synthetic_children[key]
662+
return child_obj
663+
664+
622665
def DebugFunc_ResolveWidePointer(debugger, command, result, internal_dict):
623666
"""Resolve a wide pointer manually.
624667
Usage: RWP <wide pointer variable> [size]
@@ -689,11 +732,14 @@ def recognizer(func_name):
689732
"ManagedObjectProvider",
690733
recognizer("ManagedObjectRecognizer"),
691734
)
735+
736+
register("ListSummary", "ListProvider", recognizer("ListRecognizer"))
737+
692738
# TODO: I can't decide if having a wide pointer summary/provider is useful
693739
# or just confusing
694740
# register("WidePointerSummary", "WidePointerProvider", regex("wide\\(.+\\)"))
695741
debugger.HandleCommand(
696-
"command script add -f chpl_lldb_pretty_print.DebugFunc_ResolveWidePointer RWP"
742+
"command script add --overwrite -f chpl_lldb_pretty_print.DebugFunc_ResolveWidePointer RWP"
697743
)
698744

699745
# make sure int(8) and uint(8) show up as numbers, not characters

0 commit comments

Comments
 (0)