xref: /openbsd-src/gnu/llvm/lldb/bindings/interface/SBData.i (revision f6aab3d83b51b91c24247ad2c2573574de475a82)
1 //===-- SWIG Interface for SBData -------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 
10 namespace lldb {
11 
12 %feature("docstring",
13 "Represents a data buffer."
14 ) SBData;
15 class SBData
16 {
17 public:
18 
19     SBData ();
20 
21     SBData (const SBData &rhs);
22 
23     ~SBData ();
24 
25     uint8_t
26     GetAddressByteSize ();
27 
28     void
29     SetAddressByteSize (uint8_t addr_byte_size);
30 
31     void
32     Clear ();
33 
34     bool
35     IsValid();
36 
37     explicit operator bool() const;
38 
39     size_t
40     GetByteSize ();
41 
42     lldb::ByteOrder
43     GetByteOrder();
44 
45     void
46     SetByteOrder (lldb::ByteOrder endian);
47 
48     float
49     GetFloat (lldb::SBError& error, lldb::offset_t offset);
50 
51     double
52     GetDouble (lldb::SBError& error, lldb::offset_t offset);
53 
54     long double
55     GetLongDouble (lldb::SBError& error, lldb::offset_t offset);
56 
57     lldb::addr_t
58     GetAddress (lldb::SBError& error, lldb::offset_t offset);
59 
60     uint8_t
61     GetUnsignedInt8 (lldb::SBError& error, lldb::offset_t offset);
62 
63     uint16_t
64     GetUnsignedInt16 (lldb::SBError& error, lldb::offset_t offset);
65 
66     uint32_t
67     GetUnsignedInt32 (lldb::SBError& error, lldb::offset_t offset);
68 
69     uint64_t
70     GetUnsignedInt64 (lldb::SBError& error, lldb::offset_t offset);
71 
72     int8_t
73     GetSignedInt8 (lldb::SBError& error, lldb::offset_t offset);
74 
75     int16_t
76     GetSignedInt16 (lldb::SBError& error, lldb::offset_t offset);
77 
78     int32_t
79     GetSignedInt32 (lldb::SBError& error, lldb::offset_t offset);
80 
81     int64_t
82     GetSignedInt64 (lldb::SBError& error, lldb::offset_t offset);
83 
84     const char*
85     GetString (lldb::SBError& error, lldb::offset_t offset);
86 
87     bool
88     GetDescription (lldb::SBStream &description, lldb::addr_t base_addr);
89 
90     size_t
91     ReadRawData (lldb::SBError& error,
92                  lldb::offset_t offset,
93                  void *buf,
94                  size_t size);
95 
96     void
97     SetData (lldb::SBError& error, const void *buf, size_t size, lldb::ByteOrder endian, uint8_t addr_size);
98 
99     void
100     SetDataWithOwnership (lldb::SBError& error, const void *buf, size_t size,
101                           lldb::ByteOrder endian, uint8_t addr_size);
102 
103     bool
104     Append (const SBData& rhs);
105 
106     static lldb::SBData
107     CreateDataFromCString (lldb::ByteOrder endian, uint32_t addr_byte_size, const char* data);
108 
109     // in the following CreateData*() and SetData*() prototypes, the two parameters array and array_len
110     // should not be renamed or rearranged, because doing so will break the SWIG typemap
111     static lldb::SBData
112     CreateDataFromUInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint64_t* array, size_t array_len);
113 
114     static lldb::SBData
115     CreateDataFromUInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint32_t* array, size_t array_len);
116 
117     static lldb::SBData
118     CreateDataFromSInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int64_t* array, size_t array_len);
119 
120     static lldb::SBData
121     CreateDataFromSInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int32_t* array, size_t array_len);
122 
123     static lldb::SBData
124     CreateDataFromDoubleArray (lldb::ByteOrder endian, uint32_t addr_byte_size, double* array, size_t array_len);
125 
126     bool
127     SetDataFromCString (const char* data);
128 
129     bool
130     SetDataFromUInt64Array (uint64_t* array, size_t array_len);
131 
132     bool
133     SetDataFromUInt32Array (uint32_t* array, size_t array_len);
134 
135     bool
136     SetDataFromSInt64Array (int64_t* array, size_t array_len);
137 
138     bool
139     SetDataFromSInt32Array (int32_t* array, size_t array_len);
140 
141     bool
142     SetDataFromDoubleArray (double* array, size_t array_len);
143 
144     STRING_EXTENSION(SBData)
145 
146 #ifdef SWIGPYTHON
147     %pythoncode %{
148 
149         class read_data_helper:
150             def __init__(self, sbdata, readerfunc, item_size):
151                 self.sbdata = sbdata
152                 self.readerfunc = readerfunc
153                 self.item_size = item_size
154             def __getitem__(self,key):
155                 if isinstance(key,slice):
156                     list = []
157                     for x in range(*key.indices(self.__len__())):
158                         list.append(self.__getitem__(x))
159                     return list
160                 if not (isinstance(key, int)):
161                     raise TypeError('must be int')
162                 key = key * self.item_size # SBData uses byte-based indexes, but we want to use itemsize-based indexes here
163                 error = SBError()
164                 my_data = self.readerfunc(self.sbdata,error,key)
165                 if error.Fail():
166                     raise IndexError(error.GetCString())
167                 else:
168                     return my_data
169             def __len__(self):
170                 return int(self.sbdata.GetByteSize()/self.item_size)
171             def all(self):
172                 return self[0:len(self)]
173 
174         @classmethod
175         def CreateDataFromInt (cls, value, size = None, target = None, ptr_size = None, endian = None):
176             import sys
177             lldbmodule = sys.modules[cls.__module__]
178             lldbdict = lldbmodule.__dict__
179             if 'target' in lldbdict:
180                 lldbtarget = lldbdict['target']
181             else:
182                 lldbtarget = None
183             if target == None and lldbtarget != None and lldbtarget.IsValid():
184                 target = lldbtarget
185             if ptr_size == None:
186                 if target and target.IsValid():
187                     ptr_size = target.addr_size
188                 else:
189                     ptr_size = 8
190             if endian == None:
191                 if target and target.IsValid():
192                     endian = target.byte_order
193                 else:
194                     endian = lldbdict['eByteOrderLittle']
195             if size == None:
196                 if value > 2147483647:
197                     size = 8
198                 elif value < -2147483648:
199                     size = 8
200                 elif value > 4294967295:
201                     size = 8
202                 else:
203                     size = 4
204             if size == 4:
205                 if value < 0:
206                     return SBData().CreateDataFromSInt32Array(endian, ptr_size, [value])
207                 return SBData().CreateDataFromUInt32Array(endian, ptr_size, [value])
208             if size == 8:
209                 if value < 0:
210                     return SBData().CreateDataFromSInt64Array(endian, ptr_size, [value])
211                 return SBData().CreateDataFromUInt64Array(endian, ptr_size, [value])
212             return None
213 
214         def _make_helper(self, sbdata, getfunc, itemsize):
215             return self.read_data_helper(sbdata, getfunc, itemsize)
216 
217         def _make_helper_uint8(self):
218             return self._make_helper(self, SBData.GetUnsignedInt8, 1)
219 
220         def _make_helper_uint16(self):
221             return self._make_helper(self, SBData.GetUnsignedInt16, 2)
222 
223         def _make_helper_uint32(self):
224             return self._make_helper(self, SBData.GetUnsignedInt32, 4)
225 
226         def _make_helper_uint64(self):
227             return self._make_helper(self, SBData.GetUnsignedInt64, 8)
228 
229         def _make_helper_sint8(self):
230             return self._make_helper(self, SBData.GetSignedInt8, 1)
231 
232         def _make_helper_sint16(self):
233             return self._make_helper(self, SBData.GetSignedInt16, 2)
234 
235         def _make_helper_sint32(self):
236             return self._make_helper(self, SBData.GetSignedInt32, 4)
237 
238         def _make_helper_sint64(self):
239             return self._make_helper(self, SBData.GetSignedInt64, 8)
240 
241         def _make_helper_float(self):
242             return self._make_helper(self, SBData.GetFloat, 4)
243 
244         def _make_helper_double(self):
245             return self._make_helper(self, SBData.GetDouble, 8)
246 
247         def _read_all_uint8(self):
248             return self._make_helper_uint8().all()
249 
250         def _read_all_uint16(self):
251             return self._make_helper_uint16().all()
252 
253         def _read_all_uint32(self):
254             return self._make_helper_uint32().all()
255 
256         def _read_all_uint64(self):
257             return self._make_helper_uint64().all()
258 
259         def _read_all_sint8(self):
260             return self._make_helper_sint8().all()
261 
262         def _read_all_sint16(self):
263             return self._make_helper_sint16().all()
264 
265         def _read_all_sint32(self):
266             return self._make_helper_sint32().all()
267 
268         def _read_all_sint64(self):
269             return self._make_helper_sint64().all()
270 
271         def _read_all_float(self):
272             return self._make_helper_float().all()
273 
274         def _read_all_double(self):
275             return self._make_helper_double().all()
276 
277         uint8 = property(_make_helper_uint8, None, doc='''A read only property that returns an array-like object out of which you can read uint8 values.''')
278         uint16 = property(_make_helper_uint16, None, doc='''A read only property that returns an array-like object out of which you can read uint16 values.''')
279         uint32 = property(_make_helper_uint32, None, doc='''A read only property that returns an array-like object out of which you can read uint32 values.''')
280         uint64 = property(_make_helper_uint64, None, doc='''A read only property that returns an array-like object out of which you can read uint64 values.''')
281         sint8 = property(_make_helper_sint8, None, doc='''A read only property that returns an array-like object out of which you can read sint8 values.''')
282         sint16 = property(_make_helper_sint16, None, doc='''A read only property that returns an array-like object out of which you can read sint16 values.''')
283         sint32 = property(_make_helper_sint32, None, doc='''A read only property that returns an array-like object out of which you can read sint32 values.''')
284         sint64 = property(_make_helper_sint64, None, doc='''A read only property that returns an array-like object out of which you can read sint64 values.''')
285         float = property(_make_helper_float, None, doc='''A read only property that returns an array-like object out of which you can read float values.''')
286         double = property(_make_helper_double, None, doc='''A read only property that returns an array-like object out of which you can read double values.''')
287         uint8s = property(_read_all_uint8, None, doc='''A read only property that returns an array with all the contents of this SBData represented as uint8 values.''')
288         uint16s = property(_read_all_uint16, None, doc='''A read only property that returns an array with all the contents of this SBData represented as uint16 values.''')
289         uint32s = property(_read_all_uint32, None, doc='''A read only property that returns an array with all the contents of this SBData represented as uint32 values.''')
290         uint64s = property(_read_all_uint64, None, doc='''A read only property that returns an array with all the contents of this SBData represented as uint64 values.''')
291         sint8s = property(_read_all_sint8, None, doc='''A read only property that returns an array with all the contents of this SBData represented as sint8 values.''')
292         sint16s = property(_read_all_sint16, None, doc='''A read only property that returns an array with all the contents of this SBData represented as sint16 values.''')
293         sint32s = property(_read_all_sint32, None, doc='''A read only property that returns an array with all the contents of this SBData represented as sint32 values.''')
294         sint64s = property(_read_all_sint64, None, doc='''A read only property that returns an array with all the contents of this SBData represented as sint64 values.''')
295         floats = property(_read_all_float, None, doc='''A read only property that returns an array with all the contents of this SBData represented as float values.''')
296         doubles = property(_read_all_double, None, doc='''A read only property that returns an array with all the contents of this SBData represented as double values.''')
297         byte_order = property(GetByteOrder, SetByteOrder, doc='''A read/write property getting and setting the endianness of this SBData (data.byte_order = lldb.eByteOrderLittle).''')
298         size = property(GetByteSize, None, doc='''A read only property that returns the size the same result as GetByteSize().''')
299     %}
300 #endif
301 
302 };
303 
304 } // namespace lldb
305