lldb: fix slice index expression
This commit is contained in:
@@ -20,6 +20,27 @@ def is_llgo_compiler(_target: lldb.SBTarget) -> bool:
|
|||||||
return True
|
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]:
|
def evaluate_expression(frame: lldb.SBFrame, expression: str) -> Optional[lldb.SBValue]:
|
||||||
parts = re.findall(r'\*|\w+|\(|\)|\[.*?\]|\.', expression)
|
parts = re.findall(r'\*|\w+|\(|\)|\[.*?\]|\.', expression)
|
||||||
|
|
||||||
@@ -56,7 +77,7 @@ def evaluate_expression(frame: lldb.SBFrame, expression: str) -> Optional[lldb.S
|
|||||||
i += 2
|
i += 2
|
||||||
elif part.startswith('['):
|
elif part.startswith('['):
|
||||||
index = int(part[1:-1])
|
index = int(part[1:-1])
|
||||||
value = value.GetChildAtIndex(index)
|
value = get_indexed_value(value, index)
|
||||||
i += 1
|
i += 1
|
||||||
else:
|
else:
|
||||||
if value is None:
|
if value is None:
|
||||||
|
|||||||
@@ -129,6 +129,15 @@ func FuncWithAllTypeParams(
|
|||||||
// slice: []int{21, 22, 23}
|
// slice: []int{21, 22, 23}
|
||||||
// arr: [3]int{24, 25, 26}
|
// arr: [3]int{24, 25, 26}
|
||||||
// arr2: [3]github.com/goplus/llgo/cl/_testdata/debug.E{{i = 27}, {i = 28}, {i = 29}}
|
// 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}
|
// e: github.com/goplus/llgo/cl/_testdata/debug.E{i = 30}
|
||||||
|
|
||||||
// Expected(skip):
|
// Expected(skip):
|
||||||
@@ -375,7 +384,7 @@ func ScopeIf(branch int) {
|
|||||||
// c: 3
|
// c: 3
|
||||||
// d: 4
|
// d: 4
|
||||||
// branch: 0
|
// branch: 0
|
||||||
println(c, d)
|
println(a, c, d)
|
||||||
}
|
}
|
||||||
// Expected:
|
// Expected:
|
||||||
// all variables: a branch
|
// all variables: a branch
|
||||||
|
|||||||
Reference in New Issue
Block a user