xref: /openbsd-src/gnu/llvm/lldb/examples/summaries/synth.py (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
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