60 lines
2 KiB
Python
60 lines
2 KiB
Python
from lldb import SBValue
|
|
|
|
# typedef struct {
|
|
# const TSParseAction *actions;
|
|
# uint32_t action_count;
|
|
# bool is_reusable;
|
|
# } TableEntry;
|
|
|
|
# TODO: Same inline issue as with `TSTreeSyntheticProvider`.
|
|
|
|
|
|
class TableEntrySyntheticProvider:
|
|
def __init__(self, valobj: SBValue, _dict):
|
|
self.valobj: SBValue = valobj
|
|
self.update()
|
|
|
|
def num_children(self) -> int:
|
|
# is_reusable, action_count, actions
|
|
return 2 + max(1, self.action_count.GetValueAsUnsigned())
|
|
|
|
def get_child_index(self, name: str) -> int:
|
|
if name == "is_reusable":
|
|
return 0
|
|
elif name == "action_count":
|
|
return 1
|
|
else:
|
|
if self.action_count.GetValueAsUnsigned() == 0:
|
|
return 2
|
|
index = name.lstrip("actions[").rstrip("]")
|
|
if index.isdigit():
|
|
return int(index)
|
|
else:
|
|
return -1
|
|
|
|
def get_child_at_index(self, index: int) -> SBValue:
|
|
if index == 0:
|
|
return self.is_reusable
|
|
elif index == 1:
|
|
return self.action_count
|
|
else:
|
|
if self.action_count.GetValueAsUnsigned() == 0:
|
|
return self.actions
|
|
offset: int = index - 3
|
|
start: int = self.actions.GetValueAsUnsigned()
|
|
address: int = start + offset * self.element_type_size
|
|
element: SBValue = self.actions.CreateValueFromAddress(
|
|
"action[%s]" % (offset), address, self.element_type
|
|
)
|
|
return element
|
|
|
|
def update(self):
|
|
self.is_reusable: SBValue = self.valobj.GetChildMemberWithName("is_reusable")
|
|
self.action_count: SBValue = self.valobj.GetChildMemberWithName("action_count")
|
|
self.actions: SBValue = self.valobj.GetChildMemberWithName("actions")
|
|
|
|
self.element_type: SBType = self.actions.GetType().GetPointeeType()
|
|
self.element_type_size: int = self.element_type.GetByteSize()
|
|
|
|
def has_children(self) -> bool:
|
|
return True
|