1061da546Spatrickimport lldb 2061da546Spatrick 3061da546Spatrick 4061da546Spatrickclass PythonObjectSyntheticChildProvider(object): 5061da546Spatrick 6061da546Spatrick def __init__(self, value, internal_dict): 7061da546Spatrick self.value = value 8061da546Spatrick self.values = self.make_children() 9061da546Spatrick self.built_values = {} 10061da546Spatrick self.bo = self.value.target.byte_order 11061da546Spatrick self.ps = self.value.target.addr_size 12061da546Spatrick 13061da546Spatrick def make_children(self): 14061da546Spatrick pass 15061da546Spatrick 16061da546Spatrick def num_children(self): 17061da546Spatrick return len(self.values) 18061da546Spatrick 19061da546Spatrick def get_child_index(self, name): 20061da546Spatrick i = 0 21061da546Spatrick for N, value in self.values: 22061da546Spatrick if N == name: 23061da546Spatrick return i 24061da546Spatrick i += 1 25061da546Spatrick return None 26061da546Spatrick 27061da546Spatrick def update(self): 28061da546Spatrick pass 29061da546Spatrick 30061da546Spatrick def has_children(self): 31061da546Spatrick return len(self.values) > 0 32061da546Spatrick 33061da546Spatrick def gen_child(self, name, value): 34061da546Spatrick data = None 35061da546Spatrick type = None 36*f6aab3d8Srobert if isinstance(value, int): 37061da546Spatrick data = lldb.SBData.CreateDataFromUInt64Array( 38061da546Spatrick self.bo, self.ps, [value]) 39061da546Spatrick type = self.value.target.GetBasicType(lldb.eBasicTypeLong) 40061da546Spatrick elif isinstance(value, float): 41061da546Spatrick data = lldb.SBData.CreateDataFromDoubleArray( 42061da546Spatrick self.bo, self.ps, [value]) 43061da546Spatrick type = self.value.target.GetBasicType(lldb.eBasicTypeDouble) 44061da546Spatrick elif isinstance(value, str): 45061da546Spatrick data = lldb.SBData.CreateDataFromCString(self.bo, self.ps, value) 46061da546Spatrick type = self.value.target.GetBasicType( 47061da546Spatrick lldb.eBasicTypeChar).GetArrayType( 48061da546Spatrick len(value)) 49061da546Spatrick if (data is not None) and (type is not None): 50061da546Spatrick return self.value.CreateValueFromData(name, data, type) 51061da546Spatrick return None 52061da546Spatrick 53061da546Spatrick def get_child_at_index(self, index): 54061da546Spatrick if index in self.built_values: 55061da546Spatrick return self.built_values[index] 56061da546Spatrick 57061da546Spatrick bv = None 58061da546Spatrick 59061da546Spatrick name, value = self.values[index] 60061da546Spatrick bv = self.gen_child(name, value) 61061da546Spatrick self.built_values[index] = bv 62061da546Spatrick return bv 63