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