60 lines · python
1import lldb2 3 4class PythonObjectSyntheticChildProvider(object):5 def __init__(self, value, internal_dict):6 self.value = value7 self.values = self.make_children()8 self.built_values = {}9 self.bo = self.value.target.byte_order10 self.ps = self.value.target.addr_size11 12 def make_children(self):13 pass14 15 def num_children(self):16 return len(self.values)17 18 def get_child_index(self, name):19 i = 020 for N, value in self.values:21 if N == name:22 return i23 i += 124 return None25 26 def update(self):27 pass28 29 def has_children(self):30 return len(self.values) > 031 32 def gen_child(self, name, value):33 data = None34 type = None35 if isinstance(value, int):36 data = lldb.SBData.CreateDataFromUInt64Array(self.bo, self.ps, [value])37 type = self.value.target.GetBasicType(lldb.eBasicTypeLong)38 elif isinstance(value, float):39 data = lldb.SBData.CreateDataFromDoubleArray(self.bo, self.ps, [value])40 type = self.value.target.GetBasicType(lldb.eBasicTypeDouble)41 elif isinstance(value, str):42 data = lldb.SBData.CreateDataFromCString(self.bo, self.ps, value)43 type = self.value.target.GetBasicType(lldb.eBasicTypeChar).GetArrayType(44 len(value)45 )46 if (data is not None) and (type is not None):47 return self.value.CreateValueFromData(name, data, type)48 return None49 50 def get_child_at_index(self, index):51 if index in self.built_values:52 return self.built_values[index]53 54 bv = None55 56 name, value = self.values[index]57 bv = self.gen_child(name, value)58 self.built_values[index] = bv59 return bv60