From 227dda38a218e28ec2b5600599e1fcaf39cfd327 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Sat, 5 Oct 2024 17:46:54 +0800 Subject: [PATCH] lldb: fix slice index expression --- _lldb/llgo_plugin.py | 23 ++++++++++++++++++++++- cl/_testdata/debug/in.go | 11 ++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/_lldb/llgo_plugin.py b/_lldb/llgo_plugin.py index 27ae8ad9..4643fe76 100644 --- a/_lldb/llgo_plugin.py +++ b/_lldb/llgo_plugin.py @@ -20,6 +20,27 @@ def is_llgo_compiler(_target: lldb.SBTarget) -> bool: return True +def get_indexed_value(value: lldb.SBValue, index: int) -> Optional[lldb.SBValue]: + if not value or not value.IsValid(): + return None + + type_name = value.GetType().GetName() + + if type_name.startswith('[]'): # Slice + data_ptr = value.GetChildMemberWithName('data') + element_type = data_ptr.GetType().GetPointeeType() + element_size = element_type.GetByteSize() + ptr_value = int(data_ptr.GetValue(), 16) + element_address = ptr_value + index * element_size + target = value.GetTarget() + return target.CreateValueFromAddress( + f"element_{index}", lldb.SBAddress(element_address, target), element_type) + elif value.GetType().IsArrayType(): # Array + return value.GetChildAtIndex(index) + else: + return None + + def evaluate_expression(frame: lldb.SBFrame, expression: str) -> Optional[lldb.SBValue]: parts = re.findall(r'\*|\w+|\(|\)|\[.*?\]|\.', expression) @@ -56,7 +77,7 @@ def evaluate_expression(frame: lldb.SBFrame, expression: str) -> Optional[lldb.S i += 2 elif part.startswith('['): index = int(part[1:-1]) - value = value.GetChildAtIndex(index) + value = get_indexed_value(value, index) i += 1 else: if value is None: diff --git a/cl/_testdata/debug/in.go b/cl/_testdata/debug/in.go index 06c686ee..5840a92e 100644 --- a/cl/_testdata/debug/in.go +++ b/cl/_testdata/debug/in.go @@ -129,6 +129,15 @@ func FuncWithAllTypeParams( // slice: []int{21, 22, 23} // arr: [3]int{24, 25, 26} // arr2: [3]github.com/goplus/llgo/cl/_testdata/debug.E{{i = 27}, {i = 28}, {i = 29}} + // slice[0]: 21 + // slice[1]: 22 + // slice[2]: 23 + // arr[0]: 24 + // arr[1]: 25 + // arr[2]: 26 + // arr2[0].i: 27 + // arr2[1].i: 28 + // arr2[2].i: 29 // e: github.com/goplus/llgo/cl/_testdata/debug.E{i = 30} // Expected(skip): @@ -375,7 +384,7 @@ func ScopeIf(branch int) { // c: 3 // d: 4 // branch: 0 - println(c, d) + println(a, c, d) } // Expected: // all variables: a branch