about summary refs log tree commit diff
path: root/src/etc/lldb_providers.py
diff options
context:
space:
mode:
authorWalnut <39544927+Walnut356@users.noreply.github.com>2025-01-11 03:33:41 -0600
committerWalnut <39544927+Walnut356@users.noreply.github.com>2025-01-11 03:33:41 -0600
commita3adcd24db6b25b1bf85ef8c3314ee9664c7228c (patch)
tree1f8a7c486b991d8ede1287e7a885b175d040ee55 /src/etc/lldb_providers.py
parent0bf0817dd50b2784c46660ce5778325053e2237d (diff)
downloadrust-a3adcd24db6b25b1bf85ef8c3314ee9664c7228c.tar.gz
rust-a3adcd24db6b25b1bf85ef8c3314ee9664c7228c.zip
add alternate inner type lookup for hashmap/set when template args missing
Diffstat (limited to 'src/etc/lldb_providers.py')
-rw-r--r--src/etc/lldb_providers.py28
1 files changed, 27 insertions, 1 deletions
diff --git a/src/etc/lldb_providers.py b/src/etc/lldb_providers.py
index a1470c4c1a4..b380db81eec 100644
--- a/src/etc/lldb_providers.py
+++ b/src/etc/lldb_providers.py
@@ -130,6 +130,23 @@ class EmptySyntheticProvider:
     def has_children(self) -> bool:
         return False
 
+def get_template_args(type_name: str) -> List[str]:
+    params = []
+    level = 0
+    start = 0
+    for i, c in enumerate(type_name):
+        if c == "<":
+            level += 1
+            if level == 1:
+                start = i + 1
+        elif c == ">":
+            level -= 1
+            if level == 0:
+                params.append(type_name[start:i].strip())
+        elif c == "," and level == 1:
+            params.append(type_name[start:i].strip())
+            start = i + 1
+    return params
 
 def SizeSummaryProvider(valobj: SBValue, _dict: LLDBOpaque) -> str:
     return "size=" + str(valobj.GetNumChildren())
@@ -1050,7 +1067,16 @@ class StdHashMapSyntheticProvider:
         ctrl = inner_table.GetChildMemberWithName("ctrl").GetChildAtIndex(0)
 
         self.size = inner_table.GetChildMemberWithName("items").GetValueAsUnsigned()
-        self.pair_type = table.type.template_args[0]
+
+        template_args = table.type.template_args
+
+        if template_args is None:
+            type_name = table.GetTypeName()
+            args = get_template_args(type_name)
+            self.pair_type = self.valobj.target.FindFirstType(args[0])
+        else:
+            self.pair_type = template_args[0]
+
         if self.pair_type.IsTypedefType():
             self.pair_type = self.pair_type.GetTypedefedType()
         self.pair_type_size = self.pair_type.GetByteSize()