[Lldb-commits] [lldb] r220306 - Add typemaps to handle the transformation of Python list of strings into a 'char const **'. This fixes zephyr's issue with SBTarget::Launch without splitting the API into multiple names

Enrico Granata egranata at apple.com
Tue Oct 21 10:49:25 PDT 2014


Author: enrico
Date: Tue Oct 21 12:49:24 2014
New Revision: 220306

URL: http://llvm.org/viewvc/llvm-project?rev=220306&view=rev
Log:
Add typemaps to handle the transformation of Python list of strings into a 'char const **'. This fixes zephyr's issue with SBTarget::Launch without splitting the API into multiple names

Modified:
    lldb/trunk/scripts/Python/python-typemaps.swig

Modified: lldb/trunk/scripts/Python/python-typemaps.swig
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/scripts/Python/python-typemaps.swig?rev=220306&r1=220305&r2=220306&view=diff
==============================================================================
--- lldb/trunk/scripts/Python/python-typemaps.swig (original)
+++ lldb/trunk/scripts/Python/python-typemaps.swig Tue Oct 21 12:49:24 2014
@@ -25,6 +25,23 @@
   }
 }
 
+%typemap(typecheck) char ** {
+  /* Check if is a list  */
+  $1 = 1;
+  if (PyList_Check($input)) {
+    int size = PyList_Size($input);
+    int i = 0;
+    for (i = 0; i < size; i++) {
+      PyObject *o = PyList_GetItem($input,i);
+      if (!PyString_Check(o)) { $1 = 0; }
+    }
+  }
+  else
+  {
+    $1 = ( ($input == Py_None) ? 1 : 0);
+  }
+}
+
 %typemap(freearg) char** {
   free((char *) $1);
 }
@@ -33,6 +50,63 @@
   int len;
   int i;
   len = 0;
+  while ($1[len]) len++;
+  $result = PyList_New(len);
+  for (i = 0; i < len; i++) {
+    PyList_SetItem($result, i, PyString_FromString($1[i]));
+  }
+}
+
+%typemap(in) char const ** {
+  /* Check if is a list  */
+  if (PyList_Check($input)) {
+    int size = PyList_Size($input);
+    int i = 0;
+    $1 = (char **) malloc((size+1) * sizeof(char*));
+    for (i = 0; i < size; i++) {
+      PyObject *o = PyList_GetItem($input,i);
+      if (PyString_Check(o))
+        $1[i] = PyString_AsString(o);
+      else {
+        PyErr_SetString(PyExc_TypeError,"list must contain strings");
+        free($1);
+        return NULL;
+      }
+    }
+    $1[i] = 0;
+  } else if ($input == Py_None) {
+    $1 =  NULL;
+  } else {
+    PyErr_SetString(PyExc_TypeError,"not a list");
+    return NULL;
+  }
+}
+
+%typemap(typecheck) char const ** {
+  /* Check if is a list  */
+  $1 = 1;
+  if (PyList_Check($input)) {
+    int size = PyList_Size($input);
+    int i = 0;
+    for (i = 0; i < size; i++) {
+      PyObject *o = PyList_GetItem($input,i);
+      if (!PyString_Check(o)) { $1 = 0; }
+    }
+  }
+  else
+  {
+    $1 = ( ($input == Py_None) ? 1 : 0);
+  }
+}
+
+%typemap(freearg) char const ** {
+  free((char *) $1);
+}
+
+%typemap(out) char const ** {
+  int len;
+  int i;
+  len = 0;
   while ($1[len]) len++;
   $result = PyList_New(len);
   for (i = 0; i < len; i++) {





More information about the lldb-commits mailing list