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