16498aff2SJonas Devlieghere/* Typemap definitions, to allow SWIG to properly handle 'char**' data types. */
26498aff2SJonas Devlieghere
35d8eedeeSAntónio Afonso%inline %{
45d8eedeeSAntónio Afonso
55d8eedeeSAntónio Afonso#include "../bindings/python/python-typemaps.h"
65d8eedeeSAntónio Afonso
75d8eedeeSAntónio Afonso%}
85d8eedeeSAntónio Afonso
96498aff2SJonas Devlieghere%typemap(in) char ** {
106498aff2SJonas Devlieghere  /* Check if is a list  */
116498aff2SJonas Devlieghere  if (PythonList::Check($input)) {
126498aff2SJonas Devlieghere    PythonList list(PyRefType::Borrowed, $input);
136498aff2SJonas Devlieghere    int size = list.GetSize();
146498aff2SJonas Devlieghere    int i = 0;
156498aff2SJonas Devlieghere    $1 = (char **)malloc((size + 1) * sizeof(char *));
166498aff2SJonas Devlieghere    for (i = 0; i < size; i++) {
176498aff2SJonas Devlieghere      PythonString py_str = list.GetItemAtIndex(i).AsType<PythonString>();
186498aff2SJonas Devlieghere      if (!py_str.IsAllocated()) {
196498aff2SJonas Devlieghere        PyErr_SetString(PyExc_TypeError, "list must contain strings");
206498aff2SJonas Devlieghere        free($1);
216498aff2SJonas Devlieghere        return nullptr;
226498aff2SJonas Devlieghere      }
236498aff2SJonas Devlieghere
246498aff2SJonas Devlieghere      $1[i] = const_cast<char *>(py_str.GetString().data());
256498aff2SJonas Devlieghere    }
266498aff2SJonas Devlieghere    $1[i] = 0;
276498aff2SJonas Devlieghere  } else if ($input == Py_None) {
286498aff2SJonas Devlieghere    $1 = NULL;
296498aff2SJonas Devlieghere  } else {
306498aff2SJonas Devlieghere    PyErr_SetString(PyExc_TypeError, "not a list");
316498aff2SJonas Devlieghere    return NULL;
326498aff2SJonas Devlieghere  }
336498aff2SJonas Devlieghere}
346498aff2SJonas Devlieghere
356498aff2SJonas Devlieghere%typemap(typecheck) char ** {
366498aff2SJonas Devlieghere  /* Check if is a list  */
376498aff2SJonas Devlieghere  $1 = 1;
386498aff2SJonas Devlieghere  if (PythonList::Check($input)) {
396498aff2SJonas Devlieghere    PythonList list(PyRefType::Borrowed, $input);
406498aff2SJonas Devlieghere    int size = list.GetSize();
416498aff2SJonas Devlieghere    int i = 0;
426498aff2SJonas Devlieghere    for (i = 0; i < size; i++) {
436498aff2SJonas Devlieghere      PythonString s = list.GetItemAtIndex(i).AsType<PythonString>();
449d5e37edSPavel Labath      if (!s.IsAllocated()) {
459d5e37edSPavel Labath        $1 = 0;
466498aff2SJonas Devlieghere      }
476498aff2SJonas Devlieghere    }
489d5e37edSPavel Labath  } else {
496498aff2SJonas Devlieghere    $1 = (($input == Py_None) ? 1 : 0);
506498aff2SJonas Devlieghere  }
516498aff2SJonas Devlieghere}
526498aff2SJonas Devlieghere
536498aff2SJonas Devlieghere%typemap(freearg) char** {
546498aff2SJonas Devlieghere  free((char *) $1);
556498aff2SJonas Devlieghere}
566498aff2SJonas Devlieghere
576498aff2SJonas Devlieghere%typemap(out) char** {
586498aff2SJonas Devlieghere  int len;
596498aff2SJonas Devlieghere  int i;
606498aff2SJonas Devlieghere  len = 0;
619d5e37edSPavel Labath  while ($1[len])
629d5e37edSPavel Labath    len++;
636498aff2SJonas Devlieghere  PythonList list(len);
646498aff2SJonas Devlieghere  for (i = 0; i < len; i++)
656498aff2SJonas Devlieghere    list.SetItemAtIndex(i, PythonString($1[i]));
666498aff2SJonas Devlieghere  $result = list.release();
676498aff2SJonas Devlieghere}
686498aff2SJonas Devlieghere
696498aff2SJonas Devlieghere%typemap(in) lldb::tid_t {
7052712d3fSLawrence D'Anna  PythonObject obj = Retain<PythonObject>($input);
7152712d3fSLawrence D'Anna  lldb::tid_t value = unwrapOrSetPythonException(As<unsigned long long>(obj));
7252712d3fSLawrence D'Anna  if (PyErr_Occurred())
736498aff2SJonas Devlieghere    return nullptr;
7452712d3fSLawrence D'Anna  $1 = value;
756498aff2SJonas Devlieghere}
766498aff2SJonas Devlieghere
776498aff2SJonas Devlieghere%typemap(in) lldb::StateType {
7852712d3fSLawrence D'Anna  PythonObject obj = Retain<PythonObject>($input);
7952712d3fSLawrence D'Anna  unsigned long long state_type_value =
8052712d3fSLawrence D'Anna      unwrapOrSetPythonException(As<unsigned long long>(obj));
8152712d3fSLawrence D'Anna  if (PyErr_Occurred())
8252712d3fSLawrence D'Anna    return nullptr;
836498aff2SJonas Devlieghere  if (state_type_value > lldb::StateType::kLastStateType) {
846498aff2SJonas Devlieghere    PyErr_SetString(PyExc_ValueError, "Not a valid StateType value");
856498aff2SJonas Devlieghere    return nullptr;
866498aff2SJonas Devlieghere  }
876498aff2SJonas Devlieghere  $1 = static_cast<lldb::StateType>(state_type_value);
886498aff2SJonas Devlieghere}
896498aff2SJonas Devlieghere
906498aff2SJonas Devlieghere/* Typemap definitions to allow SWIG to properly handle char buffer. */
916498aff2SJonas Devlieghere
926498aff2SJonas Devlieghere// typemap for a char buffer
936498aff2SJonas Devlieghere%typemap(in) (char *dst, size_t dst_len) {
946498aff2SJonas Devlieghere  if (!PyInt_Check($input)) {
956498aff2SJonas Devlieghere    PyErr_SetString(PyExc_ValueError, "Expecting an integer");
966498aff2SJonas Devlieghere    return NULL;
976498aff2SJonas Devlieghere  }
986498aff2SJonas Devlieghere  $2 = PyInt_AsLong($input);
996498aff2SJonas Devlieghere  if ($2 <= 0) {
1006498aff2SJonas Devlieghere    PyErr_SetString(PyExc_ValueError, "Positive integer expected");
1016498aff2SJonas Devlieghere    return NULL;
1026498aff2SJonas Devlieghere  }
1036498aff2SJonas Devlieghere  $1 = (char *)malloc($2);
1046498aff2SJonas Devlieghere}
1056498aff2SJonas Devlieghere// SBProcess::ReadCStringFromMemory() uses a void*, but needs to be treated
1066498aff2SJonas Devlieghere// as char data instead of byte data.
1076498aff2SJonas Devlieghere%typemap(in) (void *char_buf, size_t size) = (char *dst, size_t dst_len);
1086498aff2SJonas Devlieghere
1096498aff2SJonas Devlieghere// Return the char buffer.  Discarding any previous return result
1106498aff2SJonas Devlieghere%typemap(argout) (char *dst, size_t dst_len) {
1116498aff2SJonas Devlieghere  Py_XDECREF($result); /* Blow away any previous result */
1126498aff2SJonas Devlieghere  if (result == 0) {
1136498aff2SJonas Devlieghere    PythonString string("");
1146498aff2SJonas Devlieghere    $result = string.release();
1156498aff2SJonas Devlieghere    Py_INCREF($result);
1166498aff2SJonas Devlieghere  } else {
1176498aff2SJonas Devlieghere    llvm::StringRef ref(static_cast<const char *>($1), result);
1186498aff2SJonas Devlieghere    PythonString string(ref);
1196498aff2SJonas Devlieghere    $result = string.release();
1206498aff2SJonas Devlieghere  }
1216498aff2SJonas Devlieghere  free($1);
1226498aff2SJonas Devlieghere}
1236498aff2SJonas Devlieghere// SBProcess::ReadCStringFromMemory() uses a void*, but needs to be treated
1246498aff2SJonas Devlieghere// as char data instead of byte data.
1256498aff2SJonas Devlieghere%typemap(argout) (void *char_buf, size_t size) = (char *dst, size_t dst_len);
1266498aff2SJonas Devlieghere
1276498aff2SJonas Devlieghere
12861b6a4e8SRaphael Isemann// typemap for handling an snprintf-like API like SBThread::GetStopDescription.
12961b6a4e8SRaphael Isemann%typemap(in) (char *dst_or_null, size_t dst_len) {
13061b6a4e8SRaphael Isemann  if (!PyInt_Check($input)) {
13161b6a4e8SRaphael Isemann    PyErr_SetString(PyExc_ValueError, "Expecting an integer");
13261b6a4e8SRaphael Isemann    return NULL;
13361b6a4e8SRaphael Isemann  }
13461b6a4e8SRaphael Isemann  $2 = PyInt_AsLong($input);
13561b6a4e8SRaphael Isemann  if ($2 <= 0) {
13661b6a4e8SRaphael Isemann    PyErr_SetString(PyExc_ValueError, "Positive integer expected");
13761b6a4e8SRaphael Isemann    return NULL;
13861b6a4e8SRaphael Isemann  }
13961b6a4e8SRaphael Isemann  $1 = (char *)malloc($2);
14061b6a4e8SRaphael Isemann}
14161b6a4e8SRaphael Isemann%typemap(argout) (char *dst_or_null, size_t dst_len) {
14261b6a4e8SRaphael Isemann  Py_XDECREF($result); /* Blow away any previous result */
14361b6a4e8SRaphael Isemann  llvm::StringRef ref($1);
14461b6a4e8SRaphael Isemann  PythonString string(ref);
14561b6a4e8SRaphael Isemann  $result = string.release();
14661b6a4e8SRaphael Isemann  free($1);
14761b6a4e8SRaphael Isemann}
14861b6a4e8SRaphael Isemann
14961b6a4e8SRaphael Isemann
1506498aff2SJonas Devlieghere// typemap for an outgoing buffer
1516498aff2SJonas Devlieghere// See also SBEvent::SBEvent(uint32_t event, const char *cstr, uint32_t cstr_len).
1526498aff2SJonas Devlieghere// Ditto for SBProcess::PutSTDIN(const char *src, size_t src_len).
1536498aff2SJonas Devlieghere%typemap(in) (const char *cstr, uint32_t cstr_len),
1546498aff2SJonas Devlieghere             (const char *src, size_t src_len) {
1556498aff2SJonas Devlieghere  if (PythonString::Check($input)) {
1566498aff2SJonas Devlieghere    PythonString str(PyRefType::Borrowed, $input);
1576498aff2SJonas Devlieghere    $1 = (char *)str.GetString().data();
1586498aff2SJonas Devlieghere    $2 = str.GetSize();
1599d5e37edSPavel Labath  } else if (PythonByteArray::Check($input)) {
1606498aff2SJonas Devlieghere    PythonByteArray bytearray(PyRefType::Borrowed, $input);
1616498aff2SJonas Devlieghere    $1 = (char *)bytearray.GetBytes().data();
1626498aff2SJonas Devlieghere    $2 = bytearray.GetSize();
1639d5e37edSPavel Labath  } else if (PythonBytes::Check($input)) {
1646498aff2SJonas Devlieghere    PythonBytes bytes(PyRefType::Borrowed, $input);
1656498aff2SJonas Devlieghere    $1 = (char *)bytes.GetBytes().data();
1666498aff2SJonas Devlieghere    $2 = bytes.GetSize();
1679d5e37edSPavel Labath  } else {
1686498aff2SJonas Devlieghere    PyErr_SetString(PyExc_ValueError, "Expecting a string");
1696498aff2SJonas Devlieghere    return NULL;
1706498aff2SJonas Devlieghere  }
1716498aff2SJonas Devlieghere}
1726498aff2SJonas Devlieghere// For SBProcess::WriteMemory, SBTarget::GetInstructions and SBDebugger::DispatchInput.
1736498aff2SJonas Devlieghere%typemap(in) (const void *buf, size_t size),
1746498aff2SJonas Devlieghere             (const void *data, size_t data_len) {
1756498aff2SJonas Devlieghere  if (PythonString::Check($input)) {
1766498aff2SJonas Devlieghere    PythonString str(PyRefType::Borrowed, $input);
1776498aff2SJonas Devlieghere    $1 = (void *)str.GetString().data();
1786498aff2SJonas Devlieghere    $2 = str.GetSize();
1799d5e37edSPavel Labath  } else if (PythonByteArray::Check($input)) {
1806498aff2SJonas Devlieghere    PythonByteArray bytearray(PyRefType::Borrowed, $input);
1816498aff2SJonas Devlieghere    $1 = (void *)bytearray.GetBytes().data();
1826498aff2SJonas Devlieghere    $2 = bytearray.GetSize();
1839d5e37edSPavel Labath  } else if (PythonBytes::Check($input)) {
1846498aff2SJonas Devlieghere    PythonBytes bytes(PyRefType::Borrowed, $input);
1856498aff2SJonas Devlieghere    $1 = (void *)bytes.GetBytes().data();
1866498aff2SJonas Devlieghere    $2 = bytes.GetSize();
1879d5e37edSPavel Labath  } else {
1886498aff2SJonas Devlieghere    PyErr_SetString(PyExc_ValueError, "Expecting a buffer");
1896498aff2SJonas Devlieghere    return NULL;
1906498aff2SJonas Devlieghere  }
1916498aff2SJonas Devlieghere}
1926498aff2SJonas Devlieghere
1936498aff2SJonas Devlieghere// typemap for an incoming buffer
1946498aff2SJonas Devlieghere// See also SBProcess::ReadMemory.
1956498aff2SJonas Devlieghere%typemap(in) (void *buf, size_t size) {
1966498aff2SJonas Devlieghere  if (PyInt_Check($input)) {
1976498aff2SJonas Devlieghere    $2 = PyInt_AsLong($input);
1986498aff2SJonas Devlieghere  } else if (PyLong_Check($input)) {
1996498aff2SJonas Devlieghere    $2 = PyLong_AsLong($input);
2006498aff2SJonas Devlieghere  } else {
2016498aff2SJonas Devlieghere    PyErr_SetString(PyExc_ValueError, "Expecting an integer or long object");
2026498aff2SJonas Devlieghere    return NULL;
2036498aff2SJonas Devlieghere  }
2046498aff2SJonas Devlieghere  if ($2 <= 0) {
2056498aff2SJonas Devlieghere    PyErr_SetString(PyExc_ValueError, "Positive integer expected");
2066498aff2SJonas Devlieghere    return NULL;
2076498aff2SJonas Devlieghere  }
2086498aff2SJonas Devlieghere  $1 = (void *)malloc($2);
2096498aff2SJonas Devlieghere}
2106498aff2SJonas Devlieghere
2116498aff2SJonas Devlieghere// Return the buffer.  Discarding any previous return result
2126498aff2SJonas Devlieghere// See also SBProcess::ReadMemory.
2136498aff2SJonas Devlieghere%typemap(argout) (void *buf, size_t size) {
2146498aff2SJonas Devlieghere  Py_XDECREF($result); /* Blow away any previous result */
2156498aff2SJonas Devlieghere  if (result == 0) {
2166498aff2SJonas Devlieghere    $result = Py_None;
2176498aff2SJonas Devlieghere    Py_INCREF($result);
2186498aff2SJonas Devlieghere  } else {
2196498aff2SJonas Devlieghere    PythonBytes bytes(static_cast<const uint8_t *>($1), result);
2206498aff2SJonas Devlieghere    $result = bytes.release();
2216498aff2SJonas Devlieghere  }
2226498aff2SJonas Devlieghere  free($1);
2236498aff2SJonas Devlieghere}
2246498aff2SJonas Devlieghere
2256498aff2SJonas Devlieghere%{
2266498aff2SJonas Devliegherenamespace {
2276498aff2SJonas Devliegheretemplate <class T>
2286498aff2SJonas DevlieghereT PyLongAsT(PyObject *obj) {
2296498aff2SJonas Devlieghere  static_assert(true, "unsupported type");
2306498aff2SJonas Devlieghere}
2316498aff2SJonas Devlieghere
2326498aff2SJonas Devliegheretemplate <> uint64_t PyLongAsT<uint64_t>(PyObject *obj) {
2336498aff2SJonas Devlieghere  return static_cast<uint64_t>(PyLong_AsUnsignedLongLong(obj));
2346498aff2SJonas Devlieghere}
2356498aff2SJonas Devlieghere
2366498aff2SJonas Devliegheretemplate <> uint32_t PyLongAsT<uint32_t>(PyObject *obj) {
2376498aff2SJonas Devlieghere  return static_cast<uint32_t>(PyLong_AsUnsignedLong(obj));
2386498aff2SJonas Devlieghere}
2396498aff2SJonas Devlieghere
2406498aff2SJonas Devliegheretemplate <> int64_t PyLongAsT<int64_t>(PyObject *obj) {
2416498aff2SJonas Devlieghere  return static_cast<int64_t>(PyLong_AsLongLong(obj));
2426498aff2SJonas Devlieghere}
2436498aff2SJonas Devlieghere
2446498aff2SJonas Devliegheretemplate <> int32_t PyLongAsT<int32_t>(PyObject *obj) {
2456498aff2SJonas Devlieghere  return static_cast<int32_t>(PyLong_AsLong(obj));
2466498aff2SJonas Devlieghere}
2476498aff2SJonas Devlieghere
2489d5e37edSPavel Labathtemplate <class T> bool SetNumberFromPyObject(T &number, PyObject *obj) {
2496498aff2SJonas Devlieghere  if (PyInt_Check(obj))
2506498aff2SJonas Devlieghere    number = static_cast<T>(PyInt_AsLong(obj));
2516498aff2SJonas Devlieghere  else if (PyLong_Check(obj))
2526498aff2SJonas Devlieghere    number = PyLongAsT<T>(obj);
2539d5e37edSPavel Labath  else
2549d5e37edSPavel Labath    return false;
2556498aff2SJonas Devlieghere
2566498aff2SJonas Devlieghere  return true;
2576498aff2SJonas Devlieghere}
2586498aff2SJonas Devlieghere
2599d5e37edSPavel Labathtemplate <> bool SetNumberFromPyObject<double>(double &number, PyObject *obj) {
2606498aff2SJonas Devlieghere  if (PyFloat_Check(obj)) {
2616498aff2SJonas Devlieghere    number = PyFloat_AsDouble(obj);
2626498aff2SJonas Devlieghere    return true;
2636498aff2SJonas Devlieghere  }
2646498aff2SJonas Devlieghere
2656498aff2SJonas Devlieghere  return false;
2666498aff2SJonas Devlieghere}
2676498aff2SJonas Devlieghere
2686498aff2SJonas Devlieghere} // namespace
2696498aff2SJonas Devlieghere%}
2706498aff2SJonas Devlieghere
2716498aff2SJonas Devlieghere// these typemaps allow Python users to pass list objects
2726498aff2SJonas Devlieghere// and have them turn into C++ arrays (this is useful, for instance
2736498aff2SJonas Devlieghere// when creating SBData objects from lists of numbers)
2746498aff2SJonas Devlieghere%typemap(in) (uint64_t* array, size_t array_len),
2756498aff2SJonas Devlieghere             (uint32_t* array, size_t array_len),
2766498aff2SJonas Devlieghere             (int64_t* array, size_t array_len),
2776498aff2SJonas Devlieghere             (int32_t* array, size_t array_len),
2786498aff2SJonas Devlieghere             (double* array, size_t array_len) {
2796498aff2SJonas Devlieghere  /* Check if is a list  */
2806498aff2SJonas Devlieghere  if (PyList_Check($input)) {
2816498aff2SJonas Devlieghere    int size = PyList_Size($input);
2826498aff2SJonas Devlieghere    int i = 0;
2836498aff2SJonas Devlieghere    $2 = size;
2846498aff2SJonas Devlieghere    $1 = ($1_type)malloc(size * sizeof($*1_type));
2856498aff2SJonas Devlieghere    for (i = 0; i < size; i++) {
2866498aff2SJonas Devlieghere      PyObject *o = PyList_GetItem($input, i);
2876498aff2SJonas Devlieghere      if (!SetNumberFromPyObject($1[i], o)) {
2886498aff2SJonas Devlieghere        PyErr_SetString(PyExc_TypeError, "list must contain numbers");
2896498aff2SJonas Devlieghere        free($1);
2906498aff2SJonas Devlieghere        return NULL;
2916498aff2SJonas Devlieghere      }
2926498aff2SJonas Devlieghere
2936498aff2SJonas Devlieghere      if (PyErr_Occurred()) {
2946498aff2SJonas Devlieghere        free($1);
2956498aff2SJonas Devlieghere        return NULL;
2966498aff2SJonas Devlieghere      }
2976498aff2SJonas Devlieghere    }
2986498aff2SJonas Devlieghere  } else if ($input == Py_None) {
2996498aff2SJonas Devlieghere    $1 = NULL;
3006498aff2SJonas Devlieghere    $2 = 0;
3016498aff2SJonas Devlieghere  } else {
3026498aff2SJonas Devlieghere    PyErr_SetString(PyExc_TypeError, "not a list");
3036498aff2SJonas Devlieghere    return NULL;
3046498aff2SJonas Devlieghere  }
3056498aff2SJonas Devlieghere}
3066498aff2SJonas Devlieghere
3076498aff2SJonas Devlieghere%typemap(freearg) (uint64_t* array, size_t array_len),
3086498aff2SJonas Devlieghere                  (uint32_t* array, size_t array_len),
3096498aff2SJonas Devlieghere                  (int64_t* array, size_t array_len),
3106498aff2SJonas Devlieghere                  (int32_t* array, size_t array_len),
3116498aff2SJonas Devlieghere                  (double* array, size_t array_len) {
3126498aff2SJonas Devlieghere  free($1);
3136498aff2SJonas Devlieghere}
3146498aff2SJonas Devlieghere
3156498aff2SJonas Devlieghere// these typemaps wrap SBModule::GetVersion() from requiring a memory buffer
3166498aff2SJonas Devlieghere// to the more Pythonic style where a list is returned and no previous allocation
3176498aff2SJonas Devlieghere// is necessary - this will break if more than 50 versions are ever returned
3186498aff2SJonas Devlieghere%typemap(typecheck) (uint32_t *versions, uint32_t num_versions) {
3196498aff2SJonas Devlieghere  $1 = ($input == Py_None ? 1 : 0);
3206498aff2SJonas Devlieghere}
3216498aff2SJonas Devlieghere
3226498aff2SJonas Devlieghere%typemap(in, numinputs=0) (uint32_t *versions) {
3236498aff2SJonas Devlieghere  $1 = (uint32_t *)malloc(sizeof(uint32_t) * 50);
3246498aff2SJonas Devlieghere}
3256498aff2SJonas Devlieghere
3266498aff2SJonas Devlieghere%typemap(in, numinputs=0) (uint32_t num_versions) {
3276498aff2SJonas Devlieghere  $1 = 50;
3286498aff2SJonas Devlieghere}
3296498aff2SJonas Devlieghere
3306498aff2SJonas Devlieghere%typemap(argout) (uint32_t *versions, uint32_t num_versions) {
3316498aff2SJonas Devlieghere  uint32_t count = result;
3326498aff2SJonas Devlieghere  if (count >= $2)
3336498aff2SJonas Devlieghere    count = $2;
3346498aff2SJonas Devlieghere  PyObject *list = PyList_New(count);
3359d5e37edSPavel Labath  for (uint32_t j = 0; j < count; j++) {
3366498aff2SJonas Devlieghere    PyObject *item = PyInt_FromLong($1[j]);
3376498aff2SJonas Devlieghere    int ok = PyList_SetItem(list, j, item);
3389d5e37edSPavel Labath    if (ok != 0) {
3396498aff2SJonas Devlieghere      $result = Py_None;
3406498aff2SJonas Devlieghere      break;
3416498aff2SJonas Devlieghere    }
3426498aff2SJonas Devlieghere  }
3436498aff2SJonas Devlieghere  $result = list;
3446498aff2SJonas Devlieghere}
3456498aff2SJonas Devlieghere
3466498aff2SJonas Devlieghere%typemap(freearg) (uint32_t *versions) {
3476498aff2SJonas Devlieghere  free($1);
3486498aff2SJonas Devlieghere}
3496498aff2SJonas Devlieghere
3506498aff2SJonas Devlieghere
3516498aff2SJonas Devlieghere// For Log::LogOutputCallback
3526498aff2SJonas Devlieghere%typemap(in) (lldb::LogOutputCallback log_callback, void *baton) {
3539d5e37edSPavel Labath  if (!($input == Py_None ||
3549d5e37edSPavel Labath        PyCallable_Check(reinterpret_cast<PyObject *>($input)))) {
3556498aff2SJonas Devlieghere    PyErr_SetString(PyExc_TypeError, "Need a callable object or None!");
3566498aff2SJonas Devlieghere    return NULL;
3576498aff2SJonas Devlieghere  }
3586498aff2SJonas Devlieghere
3596498aff2SJonas Devlieghere  // FIXME (filcab): We can't currently check if our callback is already
3606498aff2SJonas Devlieghere  // LLDBSwigPythonCallPythonLogOutputCallback (to DECREF the previous
3616498aff2SJonas Devlieghere  // baton) nor can we just remove all traces of a callback, if we want to
3626498aff2SJonas Devlieghere  // revert to a file logging mechanism.
3636498aff2SJonas Devlieghere
3646498aff2SJonas Devlieghere  // Don't lose the callback reference
3656498aff2SJonas Devlieghere  Py_INCREF($input);
3666498aff2SJonas Devlieghere  $1 = LLDBSwigPythonCallPythonLogOutputCallback;
3676498aff2SJonas Devlieghere  $2 = $input;
3686498aff2SJonas Devlieghere}
3696498aff2SJonas Devlieghere
3706498aff2SJonas Devlieghere%typemap(typecheck) (lldb::LogOutputCallback log_callback, void *baton) {
3716498aff2SJonas Devlieghere  $1 = $input == Py_None;
3726498aff2SJonas Devlieghere  $1 = $1 || PyCallable_Check(reinterpret_cast<PyObject *>($input));
3736498aff2SJonas Devlieghere}
3746498aff2SJonas Devlieghere
3756498aff2SJonas Devlieghere
3766498aff2SJonas Devlieghere%typemap(in) lldb::FileSP {
3776498aff2SJonas Devlieghere  PythonFile py_file(PyRefType::Borrowed, $input);
3786498aff2SJonas Devlieghere  if (!py_file) {
3796498aff2SJonas Devlieghere    PyErr_SetString(PyExc_TypeError, "not a file");
3806498aff2SJonas Devlieghere    return nullptr;
3816498aff2SJonas Devlieghere  }
3826498aff2SJonas Devlieghere  auto sp = unwrapOrSetPythonException(py_file.ConvertToFile());
3836498aff2SJonas Devlieghere  if (!sp)
3846498aff2SJonas Devlieghere    return nullptr;
3856498aff2SJonas Devlieghere  $1 = sp;
3866498aff2SJonas Devlieghere}
3876498aff2SJonas Devlieghere
3886498aff2SJonas Devlieghere%typemap(in) lldb::FileSP FORCE_IO_METHODS {
3896498aff2SJonas Devlieghere  PythonFile py_file(PyRefType::Borrowed, $input);
3906498aff2SJonas Devlieghere  if (!py_file) {
3916498aff2SJonas Devlieghere    PyErr_SetString(PyExc_TypeError, "not a file");
3926498aff2SJonas Devlieghere    return nullptr;
3936498aff2SJonas Devlieghere  }
3949d5e37edSPavel Labath  auto sp = unwrapOrSetPythonException(
3959d5e37edSPavel Labath      py_file.ConvertToFileForcingUseOfScriptingIOMethods());
3966498aff2SJonas Devlieghere  if (!sp)
3976498aff2SJonas Devlieghere    return nullptr;
3986498aff2SJonas Devlieghere  $1 = sp;
3996498aff2SJonas Devlieghere}
4006498aff2SJonas Devlieghere
4016498aff2SJonas Devlieghere%typemap(in) lldb::FileSP BORROWED {
4026498aff2SJonas Devlieghere  PythonFile py_file(PyRefType::Borrowed, $input);
4036498aff2SJonas Devlieghere  if (!py_file) {
4046498aff2SJonas Devlieghere    PyErr_SetString(PyExc_TypeError, "not a file");
4056498aff2SJonas Devlieghere    return nullptr;
4066498aff2SJonas Devlieghere  }
4079d5e37edSPavel Labath  auto sp =
4089d5e37edSPavel Labath      unwrapOrSetPythonException(py_file.ConvertToFile(/*borrowed=*/true));
4096498aff2SJonas Devlieghere  if (!sp)
4106498aff2SJonas Devlieghere    return nullptr;
4116498aff2SJonas Devlieghere  $1 = sp;
4126498aff2SJonas Devlieghere}
4136498aff2SJonas Devlieghere
4146498aff2SJonas Devlieghere%typemap(in) lldb::FileSP BORROWED_FORCE_IO_METHODS {
4156498aff2SJonas Devlieghere  PythonFile py_file(PyRefType::Borrowed, $input);
4166498aff2SJonas Devlieghere  if (!py_file) {
4176498aff2SJonas Devlieghere    PyErr_SetString(PyExc_TypeError, "not a file");
4186498aff2SJonas Devlieghere    return nullptr;
4196498aff2SJonas Devlieghere  }
4209d5e37edSPavel Labath  auto sp = unwrapOrSetPythonException(
4219d5e37edSPavel Labath      py_file.ConvertToFileForcingUseOfScriptingIOMethods(/*borrowed=*/true));
4226498aff2SJonas Devlieghere  if (!sp)
4236498aff2SJonas Devlieghere    return nullptr;
4246498aff2SJonas Devlieghere  $1 = sp;
4256498aff2SJonas Devlieghere}
4266498aff2SJonas Devlieghere
4276498aff2SJonas Devlieghere%typecheck(SWIG_TYPECHECK_POINTER) lldb::FileSP {
4286498aff2SJonas Devlieghere  if (PythonFile::Check($input)) {
4296498aff2SJonas Devlieghere    $1 = 1;
4306498aff2SJonas Devlieghere  } else {
4316498aff2SJonas Devlieghere    PyErr_Clear();
4326498aff2SJonas Devlieghere    $1 = 0;
4336498aff2SJonas Devlieghere  }
4346498aff2SJonas Devlieghere}
4356498aff2SJonas Devlieghere
4366498aff2SJonas Devlieghere%typemap(out) lldb::FileSP {
4376498aff2SJonas Devlieghere  $result = nullptr;
438*392963bbSJitka Plesnikova  const lldb::FileSP &sp = $1;
4396498aff2SJonas Devlieghere  if (sp) {
4406498aff2SJonas Devlieghere    PythonFile pyfile = unwrapOrSetPythonException(PythonFile::FromFile(*sp));
4416498aff2SJonas Devlieghere    if (!pyfile.IsValid())
4426498aff2SJonas Devlieghere      return nullptr;
4436498aff2SJonas Devlieghere    $result = pyfile.release();
4446498aff2SJonas Devlieghere  }
4459d5e37edSPavel Labath  if (!$result) {
4466498aff2SJonas Devlieghere    $result = Py_None;
4476498aff2SJonas Devlieghere    Py_INCREF(Py_None);
4486498aff2SJonas Devlieghere  }
4496498aff2SJonas Devlieghere}
4506498aff2SJonas Devlieghere
4516498aff2SJonas Devlieghere%typemap(in) (const char* string, int len) {
4529d5e37edSPavel Labath  if ($input == Py_None) {
4536498aff2SJonas Devlieghere    $1 = NULL;
4546498aff2SJonas Devlieghere    $2 = 0;
4559d5e37edSPavel Labath  } else if (PythonString::Check($input)) {
4566498aff2SJonas Devlieghere    PythonString py_str(PyRefType::Borrowed, $input);
4576498aff2SJonas Devlieghere    llvm::StringRef str = py_str.GetString();
4586498aff2SJonas Devlieghere    $1 = const_cast<char *>(str.data());
4596498aff2SJonas Devlieghere    $2 = str.size();
4606498aff2SJonas Devlieghere    // In Python 2, if $input is a PyUnicode object then this
4616498aff2SJonas Devlieghere    // will trigger a Unicode -> String conversion, in which
4626498aff2SJonas Devlieghere    // case the `PythonString` will now own the PyString.  Thus
4636498aff2SJonas Devlieghere    // if it goes out of scope, the data will be deleted.  The
4646498aff2SJonas Devlieghere    // only way to avoid this is to leak the Python object in
4656498aff2SJonas Devlieghere    // that case.  Note that if there was no conversion, then
4666498aff2SJonas Devlieghere    // releasing the string will not leak anything, since we
4676498aff2SJonas Devlieghere    // created this as a borrowed reference.
4686498aff2SJonas Devlieghere    py_str.release();
4699d5e37edSPavel Labath  } else {
4706498aff2SJonas Devlieghere    PyErr_SetString(PyExc_TypeError, "not a string-like object");
4716498aff2SJonas Devlieghere    return NULL;
4726498aff2SJonas Devlieghere  }
4736498aff2SJonas Devlieghere}
4746498aff2SJonas Devlieghere
4756498aff2SJonas Devlieghere// These two pybuffer macros are copied out of swig/Lib/python/pybuffer.i,
4766498aff2SJonas Devlieghere// and fixed so they will not crash if PyObject_GetBuffer fails.
4776498aff2SJonas Devlieghere// https://github.com/swig/swig/issues/1640
478c8de17bcSLawrence D'Anna//
479c8de17bcSLawrence D'Anna// I've also moved the call to PyBuffer_Release to the end of the SWIG wrapper,
480c8de17bcSLawrence D'Anna// doing it right away is not legal according to the python buffer protocol.
4816498aff2SJonas Devlieghere
4826498aff2SJonas Devlieghere%define %pybuffer_mutable_binary(TYPEMAP, SIZE)
483c8de17bcSLawrence D'Anna%typemap(in) (TYPEMAP, SIZE) (Py_buffer_RAII view) {
4849d5e37edSPavel Labath  int res;
4859d5e37edSPavel Labath  Py_ssize_t size = 0;
4869d5e37edSPavel Labath  void *buf = 0;
487c8de17bcSLawrence D'Anna  res = PyObject_GetBuffer($input, &view.buffer, PyBUF_WRITABLE);
4886498aff2SJonas Devlieghere  if (res < 0) {
4896498aff2SJonas Devlieghere    PyErr_Clear();
4906498aff2SJonas Devlieghere    %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
4916498aff2SJonas Devlieghere  }
492c8de17bcSLawrence D'Anna  size = view.buffer.len;
493c8de17bcSLawrence D'Anna  buf = view.buffer.buf;
4946498aff2SJonas Devlieghere  $1 = ($1_ltype)buf;
4956498aff2SJonas Devlieghere  $2 = ($2_ltype)(size / sizeof($*1_type));
4966498aff2SJonas Devlieghere}
4976498aff2SJonas Devlieghere%enddef
4986498aff2SJonas Devlieghere
4996498aff2SJonas Devlieghere%define %pybuffer_binary(TYPEMAP, SIZE)
500c8de17bcSLawrence D'Anna%typemap(in) (TYPEMAP, SIZE) (Py_buffer_RAII view) {
5019d5e37edSPavel Labath  int res;
5029d5e37edSPavel Labath  Py_ssize_t size = 0;
5039d5e37edSPavel Labath  const void *buf = 0;
504c8de17bcSLawrence D'Anna  res = PyObject_GetBuffer($input, &view.buffer, PyBUF_CONTIG_RO);
5056498aff2SJonas Devlieghere  if (res < 0) {
5066498aff2SJonas Devlieghere    PyErr_Clear();
5076498aff2SJonas Devlieghere    %argument_fail(res, "(TYPEMAP, SIZE)", $symname, $argnum);
5086498aff2SJonas Devlieghere  }
509c8de17bcSLawrence D'Anna  size = view.buffer.len;
510c8de17bcSLawrence D'Anna  buf = view.buffer.buf;
5116498aff2SJonas Devlieghere  $1 = ($1_ltype)buf;
5126498aff2SJonas Devlieghere  $2 = ($2_ltype)(size / sizeof($*1_type));
5136498aff2SJonas Devlieghere}
5146498aff2SJonas Devlieghere%enddef
5156498aff2SJonas Devlieghere
5166498aff2SJonas Devlieghere%pybuffer_binary(const uint8_t *buf, size_t num_bytes);
5176498aff2SJonas Devlieghere%pybuffer_mutable_binary(uint8_t *buf, size_t num_bytes);
518