//===-- SWIG Interface for SBData -------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// namespace lldb { class SBData { public: SBData (); SBData (const SBData &rhs); ~SBData (); uint8_t GetAddressByteSize (); void SetAddressByteSize (uint8_t addr_byte_size); void Clear (); bool IsValid(); explicit operator bool() const; size_t GetByteSize (); lldb::ByteOrder GetByteOrder(); void SetByteOrder (lldb::ByteOrder endian); float GetFloat (lldb::SBError& error, lldb::offset_t offset); double GetDouble (lldb::SBError& error, lldb::offset_t offset); long double GetLongDouble (lldb::SBError& error, lldb::offset_t offset); lldb::addr_t GetAddress (lldb::SBError& error, lldb::offset_t offset); uint8_t GetUnsignedInt8 (lldb::SBError& error, lldb::offset_t offset); uint16_t GetUnsignedInt16 (lldb::SBError& error, lldb::offset_t offset); uint32_t GetUnsignedInt32 (lldb::SBError& error, lldb::offset_t offset); uint64_t GetUnsignedInt64 (lldb::SBError& error, lldb::offset_t offset); int8_t GetSignedInt8 (lldb::SBError& error, lldb::offset_t offset); int16_t GetSignedInt16 (lldb::SBError& error, lldb::offset_t offset); int32_t GetSignedInt32 (lldb::SBError& error, lldb::offset_t offset); int64_t GetSignedInt64 (lldb::SBError& error, lldb::offset_t offset); const char* GetString (lldb::SBError& error, lldb::offset_t offset); bool GetDescription (lldb::SBStream &description, lldb::addr_t base_addr); size_t ReadRawData (lldb::SBError& error, lldb::offset_t offset, void *buf, size_t size); void SetData (lldb::SBError& error, const void *buf, size_t size, lldb::ByteOrder endian, uint8_t addr_size); bool Append (const SBData& rhs); static lldb::SBData CreateDataFromCString (lldb::ByteOrder endian, uint32_t addr_byte_size, const char* data); // in the following CreateData*() and SetData*() prototypes, the two parameters array and array_len // should not be renamed or rearranged, because doing so will break the SWIG typemap static lldb::SBData CreateDataFromUInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint64_t* array, size_t array_len); static lldb::SBData CreateDataFromUInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint32_t* array, size_t array_len); static lldb::SBData CreateDataFromSInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int64_t* array, size_t array_len); static lldb::SBData CreateDataFromSInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int32_t* array, size_t array_len); static lldb::SBData CreateDataFromDoubleArray (lldb::ByteOrder endian, uint32_t addr_byte_size, double* array, size_t array_len); bool SetDataFromCString (const char* data); bool SetDataFromUInt64Array (uint64_t* array, size_t array_len); bool SetDataFromUInt32Array (uint32_t* array, size_t array_len); bool SetDataFromSInt64Array (int64_t* array, size_t array_len); bool SetDataFromSInt32Array (int32_t* array, size_t array_len); bool SetDataFromDoubleArray (double* array, size_t array_len); STRING_EXTENSION(SBData) #ifdef SWIGPYTHON %pythoncode %{ class read_data_helper: def __init__(self, sbdata, readerfunc, item_size): self.sbdata = sbdata self.readerfunc = readerfunc self.item_size = item_size def __getitem__(self,key): if isinstance(key,slice): list = [] for x in range(*key.indices(self.__len__())): list.append(self.__getitem__(x)) return list if not (isinstance(key,six.integer_types)): raise TypeError('must be int') key = key * self.item_size # SBData uses byte-based indexes, but we want to use itemsize-based indexes here error = SBError() my_data = self.readerfunc(self.sbdata,error,key) if error.Fail(): raise IndexError(error.GetCString()) else: return my_data def __len__(self): return int(self.sbdata.GetByteSize()/self.item_size) def all(self): return self[0:len(self)] @classmethod def CreateDataFromInt (cls, value, size = None, target = None, ptr_size = None, endian = None): import sys lldbmodule = sys.modules[cls.__module__] lldbdict = lldbmodule.__dict__ if 'target' in lldbdict: lldbtarget = lldbdict['target'] else: lldbtarget = None if target == None and lldbtarget != None and lldbtarget.IsValid(): target = lldbtarget if ptr_size == None: if target and target.IsValid(): ptr_size = target.addr_size else: ptr_size = 8 if endian == None: if target and target.IsValid(): endian = target.byte_order else: endian = lldbdict['eByteOrderLittle'] if size == None: if value > 2147483647: size = 8 elif value < -2147483648: size = 8 elif value > 4294967295: size = 8 else: size = 4 if size == 4: if value < 0: return SBData().CreateDataFromSInt32Array(endian, ptr_size, [value]) return SBData().CreateDataFromUInt32Array(endian, ptr_size, [value]) if size == 8: if value < 0: return SBData().CreateDataFromSInt64Array(endian, ptr_size, [value]) return SBData().CreateDataFromUInt64Array(endian, ptr_size, [value]) return None def _make_helper(self, sbdata, getfunc, itemsize): return self.read_data_helper(sbdata, getfunc, itemsize) def _make_helper_uint8(self): return self._make_helper(self, SBData.GetUnsignedInt8, 1) def _make_helper_uint16(self): return self._make_helper(self, SBData.GetUnsignedInt16, 2) def _make_helper_uint32(self): return self._make_helper(self, SBData.GetUnsignedInt32, 4) def _make_helper_uint64(self): return self._make_helper(self, SBData.GetUnsignedInt64, 8) def _make_helper_sint8(self): return self._make_helper(self, SBData.GetSignedInt8, 1) def _make_helper_sint16(self): return self._make_helper(self, SBData.GetSignedInt16, 2) def _make_helper_sint32(self): return self._make_helper(self, SBData.GetSignedInt32, 4) def _make_helper_sint64(self): return self._make_helper(self, SBData.GetSignedInt64, 8) def _make_helper_float(self): return self._make_helper(self, SBData.GetFloat, 4) def _make_helper_double(self): return self._make_helper(self, SBData.GetDouble, 8) def _read_all_uint8(self): return self._make_helper_uint8().all() def _read_all_uint16(self): return self._make_helper_uint16().all() def _read_all_uint32(self): return self._make_helper_uint32().all() def _read_all_uint64(self): return self._make_helper_uint64().all() def _read_all_sint8(self): return self._make_helper_sint8().all() def _read_all_sint16(self): return self._make_helper_sint16().all() def _read_all_sint32(self): return self._make_helper_sint32().all() def _read_all_sint64(self): return self._make_helper_sint64().all() def _read_all_float(self): return self._make_helper_float().all() def _read_all_double(self): return self._make_helper_double().all() 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') 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.''') byte_order = property(GetByteOrder, SetByteOrder, doc='''A read/write property getting and setting the endianness of this SBData (data.byte_order = lldb.eByteOrderLittle).''') size = property(GetByteSize, None, doc='''A read only property that returns the size the same result as GetByteSize().''') %} #endif }; } // namespace lldb