http://llvm.org/bugs/show_bug.cgi?id=11619
Allow creating SBData values from arrays or primitives in Python

Patch submitted by Enrico Granata.


git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@147639 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/scripts/Python/interface/SBProcess.i b/scripts/Python/interface/SBProcess.i
index da8a28f..ee324d2 100644
--- a/scripts/Python/interface/SBProcess.i
+++ b/scripts/Python/interface/SBProcess.i
@@ -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
diff --git a/scripts/Python/python-typemaps.swig b/scripts/Python/python-typemaps.swig
index 86ce7af..539e55a 100644
--- a/scripts/Python/python-typemaps.swig
+++ b/scripts/Python/python-typemaps.swig
@@ -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);
+}