[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

Johnny Chen johnny.chen at apple.com
Thu Jan 5 16:46:13 PST 2012


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()





More information about the lldb-commits mailing list