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);
+}