[Lldb-commits] [lldb] r147639 - in /lldb/trunk: include/lldb/API/SBData.h include/lldb/API/SBProcess.h scripts/Python/interface/SBProcess.i scripts/Python/python-typemaps.swig source/API/SBProcess.cpp test/python_api/sbdata/TestSBData.py

Greg Clayton gclayton at apple.com
Thu Jan 5 17:16:29 PST 2012


The functions that were added to the SBProcess seem like they should be been moved to the SBData class. The only thing the process is used for is the byte order and address byte size, which no one is using. 

It seems like these should be moved to SBData as static "Create" and "SetData" fucntions and an extra parameter should be added for the byte order and address byte size:

class SBData
{

.....

    static lldb::SBData CreateFromCString (const char* data);
    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);

    void SetDataFromCString (const char* data);
    void SetDataFromUInt64Array (uint64_t* array, size_t array_len);
    void SetDataFromUInt32Array (uint32_t* array, size_t array_len);
    void SetDataFromSInt64Array (int64_t* array, size_t array_len);
    void SetDataFromSInt32Array (int32_t* array, size_t array_len);
    void SetDataFromDoubleArray (double* array, size_t array_len);



The data could add a "void SetByteOrder(lldb::ByteOrder byte_order);" accessor if needed

The use of process is not really neededed as you can also do:

data = lldb.SBData (lldb.process.GetByteOrder(), ...)

We don't want require having a process before we can make SBData objects filled with bytes.

Greg

On Jan 5, 2012, at 4:46 PM, Johnny Chen wrote:

> Author: johnny
> Date: Thu Jan  5 18:46:12 2012
> New Revision: 147639
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=147639&view=rev
> Log:
> http://llvm.org/bugs/show_bug.cgi?id=11619
> Allow creating SBData values from arrays or primitives in Python
> 
> Patch submitted by Enrico Granata.
> 
> Modified:
>    lldb/trunk/include/lldb/API/SBData.h
>    lldb/trunk/include/lldb/API/SBProcess.h
>    lldb/trunk/scripts/Python/interface/SBProcess.i
>    lldb/trunk/scripts/Python/python-typemaps.swig
>    lldb/trunk/source/API/SBProcess.cpp
>    lldb/trunk/test/python_api/sbdata/TestSBData.py
> 
> Modified: lldb/trunk/include/lldb/API/SBData.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBData.h?rev=147639&r1=147638&r2=147639&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/API/SBData.h (original)
> +++ lldb/trunk/include/lldb/API/SBData.h Thu Jan  5 18:46:12 2012
> @@ -126,6 +126,7 @@
> 
> private:
>     friend class SBInstruction;
> +    friend class SBProcess;
>     friend class SBSection;
>     friend class SBValue;
> 
> 
> Modified: lldb/trunk/include/lldb/API/SBProcess.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBProcess.h?rev=147639&r1=147638&r2=147639&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/API/SBProcess.h (original)
> +++ lldb/trunk/include/lldb/API/SBProcess.h Thu Jan  5 18:46:12 2012
> @@ -185,7 +185,25 @@
> 
>     lldb::SBError
>     UnloadImage (uint32_t image_token);
> +    
> +    lldb::SBData
> +    GetDataFromCString(const char* data);
> +    
> +    lldb::SBData
> +    GetDataFromUnsignedInt64Array(uint64_t* array, size_t array_len);
> +
> +    lldb::SBData
> +    GetDataFromUnsignedInt32Array(uint32_t* array, size_t array_len);
> 
> +    lldb::SBData
> +    GetDataFromSignedInt64Array(int64_t* array, size_t array_len);
> +    
> +    lldb::SBData
> +    GetDataFromSignedInt32Array(int32_t* array, size_t array_len);
> +
> +    lldb::SBData
> +    GetDataFromDoubleArray(double* array, size_t array_len);
> +    
> protected:
>     friend class SBAddress;
>     friend class SBBreakpoint;
> 
> Modified: lldb/trunk/scripts/Python/interface/SBProcess.i
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/interface/SBProcess.i?rev=147639&r1=147638&r2=147639&view=diff
> ==============================================================================
> --- lldb/trunk/scripts/Python/interface/SBProcess.i (original)
> +++ lldb/trunk/scripts/Python/interface/SBProcess.i Thu Jan  5 18:46:12 2012
> @@ -280,6 +280,25 @@
> 
>     lldb::SBError
>     UnloadImage (uint32_t image_token);
> +
> +    lldb::SBData
> +    GetDataFromCString(const char* data);
> +
> +    lldb::SBData
> +    GetDataFromUnsignedInt64Array(uint64_t* array, size_t array_len);
> +
> +    lldb::SBData
> +    GetDataFromUnsignedInt32Array(uint32_t* array, size_t array_len);
> +
> +    lldb::SBData
> +    GetDataFromSignedInt64Array(int64_t* array, size_t array_len);
> +
> +    lldb::SBData
> +    GetDataFromSignedInt32Array(int32_t* array, size_t array_len);
> +
> +    lldb::SBData
> +    GetDataFromDoubleArray(double* array, size_t array_len);
> +
> };
> 
> }  // namespace lldb
> 
> Modified: lldb/trunk/scripts/Python/python-typemaps.swig
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/python-typemaps.swig?rev=147639&r1=147638&r2=147639&view=diff
> ==============================================================================
> --- lldb/trunk/scripts/Python/python-typemaps.swig (original)
> +++ lldb/trunk/scripts/Python/python-typemaps.swig Thu Jan  5 18:46:12 2012
> @@ -135,3 +135,156 @@
>    $result = PyString_FromStringAndSize(static_cast<const char*>($1),result);
>    free($1);
> }
> +
> +// these typemaps allow Python users to pass list objects
> +// and have them turn into C++ arrays (this is useful, for instance
> +// when creating SBData objects from lists of numbers)
> +%typemap(in) (uint64_t* array, size_t array_len) {
> +  /* Check if is a list  */
> +  if (PyList_Check($input)) {
> +    int size = PyList_Size($input);
> +    int i = 0;
> +    $2 = size;
> +    $1 = (uint64_t*) malloc(size * sizeof(uint64_t));
> +    for (i = 0; i < size; i++) {
> +      PyObject *o = PyList_GetItem($input,i);
> +      if (PyInt_Check(o)) {
> +        $1[i] = PyInt_AsLong(o);
> +      }
> +      else {
> +        PyErr_SetString(PyExc_TypeError,"list must contain numbers");
> +        free($1);
> +        return NULL;
> +      }
> +    }
> +  } else if ($input == Py_None) {
> +    $1 =  NULL;
> +  } else {
> +    PyErr_SetString(PyExc_TypeError,"not a list");
> +    return NULL;
> +  }
> +}
> +
> +%typemap(freearg) (uint64_t* array, size_t array_len) {
> +  free($1);
> +}
> +
> +%typemap(in) (uint32_t* array, size_t array_len) {
> +  /* Check if is a list  */
> +  if (PyList_Check($input)) {
> +    int size = PyList_Size($input);
> +    int i = 0;
> +    $2 = size;
> +    $1 = (uint32_t*) malloc(size * sizeof(uint32_t));
> +    for (i = 0; i < size; i++) {
> +      PyObject *o = PyList_GetItem($input,i);
> +      if (PyInt_Check(o)) {
> +        $1[i] = PyInt_AsLong(o);
> +      }
> +      else {
> +        PyErr_SetString(PyExc_TypeError,"list must contain numbers");
> +        free($1);
> +        return NULL;
> +      }
> +    }
> +  } else if ($input == Py_None) {
> +    $1 =  NULL;
> +  } else {
> +    PyErr_SetString(PyExc_TypeError,"not a list");
> +    return NULL;
> +  }
> +}
> +
> +%typemap(freearg) (uint32_t* array, size_t array_len) {
> +  free($1);
> +}
> +
> +%typemap(in) (int64_t* array, size_t array_len) {
> +  /* Check if is a list  */
> +  if (PyList_Check($input)) {
> +    int size = PyList_Size($input);
> +    int i = 0;
> +    $2 = size;
> +    $1 = (int64_t*) malloc(size * sizeof(int64_t));
> +    for (i = 0; i < size; i++) {
> +      PyObject *o = PyList_GetItem($input,i);
> +      if (PyInt_Check(o)) {
> +        $1[i] = PyInt_AsLong(o);
> +      }
> +      else {
> +        PyErr_SetString(PyExc_TypeError,"list must contain numbers");
> +        free($1);
> +        return NULL;
> +      }
> +    }
> +  } else if ($input == Py_None) {
> +    $1 =  NULL;
> +  } else {
> +    PyErr_SetString(PyExc_TypeError,"not a list");
> +    return NULL;
> +  }
> +}
> +
> +%typemap(freearg) (int64_t* array, size_t array_len) {
> +  free($1);
> +}
> +
> +%typemap(in) (int32_t* array, size_t array_len) {
> +  /* Check if is a list  */
> +  if (PyList_Check($input)) {
> +    int size = PyList_Size($input);
> +    int i = 0;
> +    $2 = size;
> +    $1 = (int32_t*) malloc(size * sizeof(int32_t));
> +    for (i = 0; i < size; i++) {
> +      PyObject *o = PyList_GetItem($input,i);
> +      if (PyInt_Check(o)) {
> +        $1[i] = PyInt_AsLong(o);
> +      }
> +      else {
> +        PyErr_SetString(PyExc_TypeError,"list must contain numbers");
> +        free($1);
> +        return NULL;
> +      }
> +    }
> +  } else if ($input == Py_None) {
> +    $1 =  NULL;
> +  } else {
> +    PyErr_SetString(PyExc_TypeError,"not a list");
> +    return NULL;
> +  }
> +}
> +
> +%typemap(freearg) (int32_t* array, size_t array_len) {
> +  free($1);
> +}
> +
> +%typemap(in) (double* array, size_t array_len) {
> +  /* Check if is a list  */
> +  if (PyList_Check($input)) {
> +    int size = PyList_Size($input);
> +    int i = 0;
> +    $2 = size;
> +    $1 = (double*) malloc(size * sizeof(double));
> +    for (i = 0; i < size; i++) {
> +      PyObject *o = PyList_GetItem($input,i);
> +      if (PyFloat_Check(o)) {
> +        $1[i] = PyFloat_AsDouble(o);
> +      }
> +      else {
> +        PyErr_SetString(PyExc_TypeError,"list must contain floating-point numbers");
> +        free($1);
> +        return NULL;
> +      }
> +    }
> +  } else if ($input == Py_None) {
> +    $1 =  NULL;
> +  } else {
> +    PyErr_SetString(PyExc_TypeError,"not a list");
> +    return NULL;
> +  }
> +}
> +
> +%typemap(freearg) (double* array, size_t array_len) {
> +  free($1);
> +}
> 
> Modified: lldb/trunk/source/API/SBProcess.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBProcess.cpp?rev=147639&r1=147638&r2=147639&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBProcess.cpp (original)
> +++ lldb/trunk/source/API/SBProcess.cpp Thu Jan  5 18:46:12 2012
> @@ -919,4 +919,129 @@
>     return sb_error;
> }
> 
> +lldb::SBData
> +SBProcess::GetDataFromCString(const char* data)
> +{
> +    if (!IsValid())
> +        return SBData();
> +    
> +    if (!data || !data[0])
> +        return SBData();
> +    
> +    uint32_t data_len = strlen(data);
> +    lldb::ByteOrder byte_order = GetByteOrder();
> +    uint8_t addr_size = GetAddressByteSize();
> +    
> +    lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
> +    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, byte_order, addr_size));
> +    
> +    SBData ret(data_sp);
> +    
> +    return ret;
> +}
> +
> +lldb::SBData
> +SBProcess::GetDataFromUnsignedInt64Array(uint64_t* array, size_t array_len)
> +{
> +    if (!IsValid())
> +        return SBData();
> +    
> +    if (!array || array_len == 0)
> +        return SBData();
> +    
> +    lldb::ByteOrder byte_order = GetByteOrder();
> +    uint8_t addr_size = GetAddressByteSize();
> +    size_t data_len = array_len * sizeof(uint64_t);
> +
> +    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
> +    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, byte_order, addr_size));
> +    
> +    SBData ret(data_sp);
> +    
> +    return ret;
> +}
> +
> +lldb::SBData
> +SBProcess::GetDataFromUnsignedInt32Array(uint32_t* array, size_t array_len)
> +{
> +    if (!IsValid())
> +        return SBData();
> +    
> +    if (!array || array_len == 0)
> +        return SBData();
> +    
> +    lldb::ByteOrder byte_order = GetByteOrder();
> +    uint8_t addr_size = GetAddressByteSize();
> +    size_t data_len = array_len * sizeof(uint32_t);
> +    
> +    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
> +    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, byte_order, addr_size));
> +    
> +    SBData ret(data_sp);
> +    
> +    return ret;
> +}
> +
> +lldb::SBData
> +SBProcess::GetDataFromSignedInt64Array(int64_t* array, size_t array_len)
> +{
> +    if (!IsValid())
> +        return SBData();
> +    
> +    if (!array || array_len == 0)
> +        return SBData();
> +    
> +    lldb::ByteOrder byte_order = GetByteOrder();
> +    uint8_t addr_size = GetAddressByteSize();
> +    size_t data_len = array_len * sizeof(int64_t);
> +    
> +    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
> +    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, byte_order, addr_size));
> +    
> +    SBData ret(data_sp);
> +    
> +    return ret;
> +}
> +
> +lldb::SBData
> +SBProcess::GetDataFromSignedInt32Array(int32_t* array, size_t array_len)
> +{
> +    if (!IsValid())
> +        return SBData();
> +    
> +    if (!array || array_len == 0)
> +        return SBData();
> +    
> +    lldb::ByteOrder byte_order = GetByteOrder();
> +    uint8_t addr_size = GetAddressByteSize();
> +    size_t data_len = array_len * sizeof(int32_t);
> +    
> +    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
> +    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, byte_order, addr_size));
> +    
> +    SBData ret(data_sp);
> +    
> +    return ret;
> +}
> +
> +lldb::SBData
> +SBProcess::GetDataFromDoubleArray(double* array, size_t array_len)
> +{
> +    if (!IsValid())
> +        return SBData();
> +        
> +    if (!array || array_len == 0)
> +        return SBData();
> +        
> +    lldb::ByteOrder byte_order = GetByteOrder();
> +    uint8_t addr_size = GetAddressByteSize();
> +    size_t data_len = array_len * sizeof(double);
> +    
> +    lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
> +    lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, byte_order, addr_size));
> +    
> +    SBData ret(data_sp);
> +    
> +    return ret;
> +}
> 
> 
> Modified: lldb/trunk/test/python_api/sbdata/TestSBData.py
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/python_api/sbdata/TestSBData.py?rev=147639&r1=147638&r2=147639&view=diff
> ==============================================================================
> --- lldb/trunk/test/python_api/sbdata/TestSBData.py (original)
> +++ lldb/trunk/test/python_api/sbdata/TestSBData.py Thu Jan  5 18:46:12 2012
> @@ -212,6 +212,48 @@
>         self.assertTrue(data.GetUnsignedInt8(error, offset) == 68, 'made-up data == 68')
>         offset += 1
> 
> +        # check the new API calls introduced per LLVM bugzilla enhancement request
> +        # 11619 (Allow creating SBData values from arrays or primitives in Python)
> +
> +        data2 = process.GetDataFromCString('hello!')
> +        self.assertTrue(data2.GetUnsignedInt8(error,0) == 104, 'h == 104')
> +        self.assertTrue(data2.GetUnsignedInt8(error,1) == 101, 'e == 101')
> +        self.assertTrue(data2.GetUnsignedInt8(error,2) == 108, 'l == 108')
> +        self.assertTrue(data2.GetUnsignedInt8(error,3) == 108, 'l == 108')
> +        self.assertTrue(data2.GetUnsignedInt8(error,4) == 111, 'o == 111')
> +        self.assertTrue(data2.GetUnsignedInt8(error,5) == 33, '! == 33')
> +        self.assertTrue(data2.GetUnsignedInt8(error,6) == 0, 'binary 0 terminator')
> +        
> +        data2 = process.GetDataFromUnsignedInt64Array([1,2,3,4,5])
> +        self.assertTrue(data2.GetUnsignedInt64(error,0) == 1, 'data2[0] = 1')
> +        self.assertTrue(data2.GetUnsignedInt64(error,8) == 2, 'data2[1] = 2')
> +        self.assertTrue(data2.GetUnsignedInt64(error,16) == 3, 'data2[2] = 3')
> +        self.assertTrue(data2.GetUnsignedInt64(error,24) == 4, 'data2[3] = 4')
> +        self.assertTrue(data2.GetUnsignedInt64(error,32) == 5, 'data2[4] = 5')
> +        
> +        data2 = process.GetDataFromSignedInt32Array([2, -2])
> +        self.assertTrue(data2.GetSignedInt32(error,0) == 2, 'signed32 data2[0] = 2')
> +        self.assertTrue(data2.GetSignedInt32(error,4) == -2, 'signed32 data2[1] = -2')
> +        
> +        data2.Append(process.GetDataFromSignedInt64Array([2, -2]))
> +        self.assertTrue(data2.GetSignedInt32(error,0) == 2, 'signed32 data2[0] = 2')
> +        self.assertTrue(data2.GetSignedInt32(error,4) == -2, 'signed32 data2[1] = -2')
> +        self.assertTrue(data2.GetSignedInt64(error,8) == 2, 'signed64 data2[0] = 2')
> +        self.assertTrue(data2.GetSignedInt64(error,16) == -2, 'signed64 data2[1] = -2')
> +        
> +        data2 = process.GetDataFromUnsignedInt32Array([1,2,3,4,5])
> +        self.assertTrue(data2.GetUnsignedInt32(error,0) == 1, '32-bit data2[0] = 1')
> +        self.assertTrue(data2.GetUnsignedInt32(error,4) == 2, '32-bit data2[1] = 2')
> +        self.assertTrue(data2.GetUnsignedInt32(error,8) == 3, '32-bit data2[2] = 3')
> +        self.assertTrue(data2.GetUnsignedInt32(error,12) == 4, '32-bit data2[3] = 4')
> +        self.assertTrue(data2.GetUnsignedInt32(error,16) == 5, '32-bit data2[4] = 5')
> +        
> +        data2 = process.GetDataFromDoubleArray([3.14,6.28,2.71])
> +        self.assertTrue( fabs(data2.GetDouble(error,0) - 3.14) < 0.5, 'double data2[0] = 3.14')
> +        self.assertTrue( fabs(data2.GetDouble(error,8) - 6.28) < 0.5, 'double data2[1] = 6.28')
> +        self.assertTrue( fabs(data2.GetDouble(error,16) - 2.71) < 0.5, 'double data2[2] = 2.71')
> +        
> +
> if __name__ == '__main__':
>     import atexit
>     lldb.SBDebugger.Initialize()
> 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits




More information about the lldb-commits mailing list