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