1db913953SBram Moolenaar /* vi:set ts=8 sts=4 sw=4 noet: 2071d4279SBram Moolenaar * 3071d4279SBram Moolenaar * VIM - Vi IMproved by Bram Moolenaar 4071d4279SBram Moolenaar * 5071d4279SBram Moolenaar * Do ":help uganda" in Vim to read copying and usage conditions. 6071d4279SBram Moolenaar * Do ":help credits" in Vim to see a list of people who contributed. 7071d4279SBram Moolenaar * See README.txt for an overview of the Vim source code. 8071d4279SBram Moolenaar */ 9071d4279SBram Moolenaar /* 10071d4279SBram Moolenaar * Python extensions by Paul Moore. 11071d4279SBram Moolenaar * Changes for Unix by David Leonard. 12071d4279SBram Moolenaar * 13071d4279SBram Moolenaar * This consists of four parts: 14071d4279SBram Moolenaar * 1. Python interpreter main program 15071d4279SBram Moolenaar * 2. Python output stream: writes output via [e]msg(). 16071d4279SBram Moolenaar * 3. Implementation of the Vim module for Python 17071d4279SBram Moolenaar * 4. Utility functions for handling the interface between Vim and Python. 18071d4279SBram Moolenaar */ 19071d4279SBram Moolenaar 20071d4279SBram Moolenaar #include "vim.h" 21071d4279SBram Moolenaar 22071d4279SBram Moolenaar #include <limits.h> 23071d4279SBram Moolenaar 242ab2e860SBram Moolenaar // uncomment this if used with the debug version of python. 252ab2e860SBram Moolenaar // Checked on 2.7.4. 262ab2e860SBram Moolenaar // #define Py_DEBUG 272ab2e860SBram Moolenaar // Note: most of time you can add -DPy_DEBUG to CFLAGS in place of uncommenting 282ab2e860SBram Moolenaar // uncomment this if used with the debug version of python, but without its 292ab2e860SBram Moolenaar // allocator 302ab2e860SBram Moolenaar // #define Py_DEBUG_NO_PYMALLOC 310014a53aSBram Moolenaar 322ab2e860SBram Moolenaar // Python.h defines _POSIX_THREADS itself (if needed) 33071d4279SBram Moolenaar #ifdef _POSIX_THREADS 34071d4279SBram Moolenaar # undef _POSIX_THREADS 35071d4279SBram Moolenaar #endif 36071d4279SBram Moolenaar 374f97475dSBram Moolenaar #if defined(MSWIN) && defined(HAVE_FCNTL_H) 38071d4279SBram Moolenaar # undef HAVE_FCNTL_H 39071d4279SBram Moolenaar #endif 40071d4279SBram Moolenaar 41071d4279SBram Moolenaar #ifdef _DEBUG 42071d4279SBram Moolenaar # undef _DEBUG 43071d4279SBram Moolenaar #endif 44071d4279SBram Moolenaar 456aa2cd4bSBram Moolenaar #ifdef HAVE_STRFTIME 466aa2cd4bSBram Moolenaar # undef HAVE_STRFTIME 476aa2cd4bSBram Moolenaar #endif 486aa2cd4bSBram Moolenaar #ifdef HAVE_STRING_H 496aa2cd4bSBram Moolenaar # undef HAVE_STRING_H 506aa2cd4bSBram Moolenaar #endif 516aa2cd4bSBram Moolenaar #ifdef HAVE_PUTENV 526aa2cd4bSBram Moolenaar # undef HAVE_PUTENV 536aa2cd4bSBram Moolenaar #endif 54071d4279SBram Moolenaar #ifdef HAVE_STDARG_H 552ab2e860SBram Moolenaar # undef HAVE_STDARG_H // Python's config.h defines it as well. 56071d4279SBram Moolenaar #endif 57be2c9ae9SBram Moolenaar #ifdef _POSIX_C_SOURCE 582ab2e860SBram Moolenaar # undef _POSIX_C_SOURCE // pyconfig.h defines it as well. 59be2c9ae9SBram Moolenaar #endif 60be2c9ae9SBram Moolenaar #ifdef _XOPEN_SOURCE 612ab2e860SBram Moolenaar # undef _XOPEN_SOURCE // pyconfig.h defines it as well. 62be2c9ae9SBram Moolenaar #endif 63071d4279SBram Moolenaar 640bdda37fSBram Moolenaar #define PY_SSIZE_T_CLEAN 650bdda37fSBram Moolenaar 66071d4279SBram Moolenaar #include <Python.h> 670bdda37fSBram Moolenaar 680bdda37fSBram Moolenaar #if !defined(PY_VERSION_HEX) || PY_VERSION_HEX < 0x02050000 690bdda37fSBram Moolenaar # undef PY_SSIZE_T_CLEAN 700bdda37fSBram Moolenaar #endif 710bdda37fSBram Moolenaar 72*2e2f52a4SBram Moolenaar // these are NULL for Python 2 73*2e2f52a4SBram Moolenaar #define ERRORS_DECODE_ARG NULL 74*2e2f52a4SBram Moolenaar #define ERRORS_ENCODE_ARG ERRORS_DECODE_ARG 75*2e2f52a4SBram Moolenaar 762ab2e860SBram Moolenaar #undef main // Defined in python.h - aargh 772ab2e860SBram Moolenaar #undef HAVE_FCNTL_H // Clash with os_win32.h 78071d4279SBram Moolenaar 7965951258SBram Moolenaar // Perhaps leave this out for Python 2.6, which supports bytes? 80db913953SBram Moolenaar #define PyBytes_FromString PyString_FromString 81335e0b69SBram Moolenaar #define PyBytes_Check PyString_Check 82808c2bc8SBram Moolenaar #define PyBytes_AsStringAndSize PyString_AsStringAndSize 8365951258SBram Moolenaar #define PyBytes_FromStringAndSize PyString_FromStringAndSize 8419e60943SBram Moolenaar 85071d4279SBram Moolenaar #if !defined(FEAT_PYTHON) && defined(PROTO) 862ab2e860SBram Moolenaar // Use this to be able to generate prototypes without python being used. 87e7cb9cf6SBram Moolenaar # define PyObject Py_ssize_t 88e7cb9cf6SBram Moolenaar # define PyThreadState Py_ssize_t 89e7cb9cf6SBram Moolenaar # define PyTypeObject Py_ssize_t 90e7cb9cf6SBram Moolenaar struct PyMethodDef { Py_ssize_t a; }; 91e7cb9cf6SBram Moolenaar # define PySequenceMethods Py_ssize_t 92071d4279SBram Moolenaar #endif 93071d4279SBram Moolenaar 942afa3238SBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 952afa3238SBram Moolenaar # define PY_USE_CAPSULE 962afa3238SBram Moolenaar #endif 972afa3238SBram Moolenaar 982c45e945SBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000 992c45e945SBram Moolenaar # define PyInt Py_ssize_t 1002c45e945SBram Moolenaar # define PyInquiry lenfunc 1012c45e945SBram Moolenaar # define PyIntArgFunc ssizeargfunc 1022c45e945SBram Moolenaar # define PyIntIntArgFunc ssizessizeargfunc 1032c45e945SBram Moolenaar # define PyIntObjArgProc ssizeobjargproc 1042c45e945SBram Moolenaar # define PyIntIntObjArgProc ssizessizeobjargproc 105e7cb9cf6SBram Moolenaar # define Py_ssize_t_fmt "n" 1062c45e945SBram Moolenaar #else 1072c45e945SBram Moolenaar # define PyInt int 1084d1da49cSBram Moolenaar # define lenfunc inquiry 1092c45e945SBram Moolenaar # define PyInquiry inquiry 1102c45e945SBram Moolenaar # define PyIntArgFunc intargfunc 1112c45e945SBram Moolenaar # define PyIntIntArgFunc intintargfunc 1122c45e945SBram Moolenaar # define PyIntObjArgProc intobjargproc 1132c45e945SBram Moolenaar # define PyIntIntObjArgProc intintobjargproc 114e7cb9cf6SBram Moolenaar # define Py_ssize_t_fmt "i" 1152c45e945SBram Moolenaar #endif 116a9922d62SBram Moolenaar #define Py_bytes_fmt "s" 1172c45e945SBram Moolenaar 1182ab2e860SBram Moolenaar // Parser flags 119071d4279SBram Moolenaar #define single_input 256 120071d4279SBram Moolenaar #define file_input 257 121071d4279SBram Moolenaar #define eval_input 258 122071d4279SBram Moolenaar 123071d4279SBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x020300F0 1242ab2e860SBram Moolenaar // Python 2.3: can invoke ":python" recursively. 125071d4279SBram Moolenaar # define PY_CAN_RECURSE 126071d4279SBram Moolenaar #endif 127071d4279SBram Moolenaar 128071d4279SBram Moolenaar #if defined(DYNAMIC_PYTHON) || defined(PROTO) 129071d4279SBram Moolenaar # ifndef DYNAMIC_PYTHON 1302ab2e860SBram Moolenaar # define HINSTANCE long_u // for generating prototypes 131071d4279SBram Moolenaar # endif 132071d4279SBram Moolenaar 1334f97475dSBram Moolenaar # ifndef MSWIN 134bd5e15fdSBram Moolenaar # include <dlfcn.h> 135bd5e15fdSBram Moolenaar # define FARPROC void* 136bd5e15fdSBram Moolenaar # define HINSTANCE void* 137644d37b8SBram Moolenaar # if defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL) 138b61f95c3SBram Moolenaar # define load_dll(n) dlopen((n), RTLD_LAZY) 139b61f95c3SBram Moolenaar # else 140fa5d1e63SBram Moolenaar # define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL) 141b61f95c3SBram Moolenaar # endif 142bd5e15fdSBram Moolenaar # define close_dll dlclose 143bd5e15fdSBram Moolenaar # define symbol_from_dll dlsym 144bd5e15fdSBram Moolenaar # else 145ebbcb824SBram Moolenaar # define load_dll vimLoadLib 146bd5e15fdSBram Moolenaar # define close_dll FreeLibrary 147bd5e15fdSBram Moolenaar # define symbol_from_dll GetProcAddress 148bd5e15fdSBram Moolenaar # endif 149bd5e15fdSBram Moolenaar 1502ab2e860SBram Moolenaar // This makes if_python.c compile without warnings against Python 2.5 1512ab2e860SBram Moolenaar // on Win32 and Win64. 152e7cb9cf6SBram Moolenaar # undef PyRun_SimpleString 153db913953SBram Moolenaar # undef PyRun_String 154e7cb9cf6SBram Moolenaar # undef PyArg_Parse 155e7cb9cf6SBram Moolenaar # undef PyArg_ParseTuple 156e7cb9cf6SBram Moolenaar # undef Py_BuildValue 157e7cb9cf6SBram Moolenaar # undef Py_InitModule4 158e7cb9cf6SBram Moolenaar # undef Py_InitModule4_64 159db913953SBram Moolenaar # undef PyObject_CallMethod 1609f3685a5SBram Moolenaar # undef PyObject_CallFunction 161e7cb9cf6SBram Moolenaar 162071d4279SBram Moolenaar /* 163071d4279SBram Moolenaar * Wrapper defines 164071d4279SBram Moolenaar */ 165071d4279SBram Moolenaar # define PyArg_Parse dll_PyArg_Parse 166071d4279SBram Moolenaar # define PyArg_ParseTuple dll_PyArg_ParseTuple 16719e60943SBram Moolenaar # define PyMem_Free dll_PyMem_Free 168db913953SBram Moolenaar # define PyMem_Malloc dll_PyMem_Malloc 169071d4279SBram Moolenaar # define PyDict_SetItemString dll_PyDict_SetItemString 170071d4279SBram Moolenaar # define PyErr_BadArgument dll_PyErr_BadArgument 171d5f729caSBram Moolenaar # define PyErr_NewException dll_PyErr_NewException 172071d4279SBram Moolenaar # define PyErr_Clear dll_PyErr_Clear 173c476e52fSBram Moolenaar # define PyErr_Format dll_PyErr_Format 1744d36987cSBram Moolenaar # define PyErr_PrintEx dll_PyErr_PrintEx 175071d4279SBram Moolenaar # define PyErr_NoMemory dll_PyErr_NoMemory 176071d4279SBram Moolenaar # define PyErr_Occurred dll_PyErr_Occurred 177071d4279SBram Moolenaar # define PyErr_SetNone dll_PyErr_SetNone 178071d4279SBram Moolenaar # define PyErr_SetString dll_PyErr_SetString 1794d188da2SBram Moolenaar # define PyErr_SetObject dll_PyErr_SetObject 180c09a6d6cSBram Moolenaar # define PyErr_ExceptionMatches dll_PyErr_ExceptionMatches 181071d4279SBram Moolenaar # define PyEval_InitThreads dll_PyEval_InitThreads 182071d4279SBram Moolenaar # define PyEval_RestoreThread dll_PyEval_RestoreThread 183071d4279SBram Moolenaar # define PyEval_SaveThread dll_PyEval_SaveThread 184071d4279SBram Moolenaar # ifdef PY_CAN_RECURSE 185071d4279SBram Moolenaar # define PyGILState_Ensure dll_PyGILState_Ensure 186071d4279SBram Moolenaar # define PyGILState_Release dll_PyGILState_Release 187071d4279SBram Moolenaar # endif 188071d4279SBram Moolenaar # define PyInt_AsLong dll_PyInt_AsLong 189071d4279SBram Moolenaar # define PyInt_FromLong dll_PyInt_FromLong 190db913953SBram Moolenaar # define PyLong_AsLong dll_PyLong_AsLong 191db913953SBram Moolenaar # define PyLong_FromLong dll_PyLong_FromLong 19266b7985eSBram Moolenaar # define PyBool_Type (*dll_PyBool_Type) 193071d4279SBram Moolenaar # define PyInt_Type (*dll_PyInt_Type) 194db913953SBram Moolenaar # define PyLong_Type (*dll_PyLong_Type) 195071d4279SBram Moolenaar # define PyList_GetItem dll_PyList_GetItem 1960ac9379aSBram Moolenaar # define PyList_Append dll_PyList_Append 197c09a6d6cSBram Moolenaar # define PyList_Insert dll_PyList_Insert 198071d4279SBram Moolenaar # define PyList_New dll_PyList_New 199071d4279SBram Moolenaar # define PyList_SetItem dll_PyList_SetItem 200071d4279SBram Moolenaar # define PyList_Size dll_PyList_Size 201071d4279SBram Moolenaar # define PyList_Type (*dll_PyList_Type) 202db913953SBram Moolenaar # define PySequence_Check dll_PySequence_Check 203db913953SBram Moolenaar # define PySequence_Size dll_PySequence_Size 204db913953SBram Moolenaar # define PySequence_GetItem dll_PySequence_GetItem 205a9922d62SBram Moolenaar # define PySequence_Fast dll_PySequence_Fast 206db913953SBram Moolenaar # define PyTuple_Size dll_PyTuple_Size 207db913953SBram Moolenaar # define PyTuple_GetItem dll_PyTuple_GetItem 208db913953SBram Moolenaar # define PyTuple_Type (*dll_PyTuple_Type) 209063a46baSBram Moolenaar # define PySlice_GetIndicesEx dll_PySlice_GetIndicesEx 210071d4279SBram Moolenaar # define PyImport_ImportModule dll_PyImport_ImportModule 2110ac9379aSBram Moolenaar # define PyDict_New dll_PyDict_New 212071d4279SBram Moolenaar # define PyDict_GetItemString dll_PyDict_GetItemString 213db913953SBram Moolenaar # define PyDict_Next dll_PyDict_Next 2143e734ea2SBram Moolenaar # define PyDict_Type (*dll_PyDict_Type) 215bcb40977SBram Moolenaar # ifdef PyMapping_Keys 216bcb40977SBram Moolenaar # define PY_NO_MAPPING_KEYS 217db913953SBram Moolenaar # else 218bcb40977SBram Moolenaar # define PyMapping_Keys dll_PyMapping_Keys 219db913953SBram Moolenaar # endif 220bcb40977SBram Moolenaar # define PyObject_GetItem dll_PyObject_GetItem 221db913953SBram Moolenaar # define PyObject_CallMethod dll_PyObject_CallMethod 222db913953SBram Moolenaar # define PyMapping_Check dll_PyMapping_Check 223db913953SBram Moolenaar # define PyIter_Next dll_PyIter_Next 224071d4279SBram Moolenaar # define PyModule_GetDict dll_PyModule_GetDict 225f9c9b32bSBram Moolenaar # define PyModule_AddObject dll_PyModule_AddObject 226071d4279SBram Moolenaar # define PyRun_SimpleString dll_PyRun_SimpleString 227db913953SBram Moolenaar # define PyRun_String dll_PyRun_String 228d620aa9bSBram Moolenaar # define PyObject_GetAttrString dll_PyObject_GetAttrString 229a9922d62SBram Moolenaar # define PyObject_HasAttrString dll_PyObject_HasAttrString 230d620aa9bSBram Moolenaar # define PyObject_SetAttrString dll_PyObject_SetAttrString 231d620aa9bSBram Moolenaar # define PyObject_CallFunctionObjArgs dll_PyObject_CallFunctionObjArgs 2329f3685a5SBram Moolenaar # define PyObject_CallFunction dll_PyObject_CallFunction 233f4258308SBram Moolenaar # define PyObject_Call dll_PyObject_Call 234141be8a5SBram Moolenaar # define PyObject_Repr dll_PyObject_Repr 235071d4279SBram Moolenaar # define PyString_AsString dll_PyString_AsString 236cdab9051SBram Moolenaar # define PyString_AsStringAndSize dll_PyString_AsStringAndSize 237071d4279SBram Moolenaar # define PyString_FromString dll_PyString_FromString 2381a3b5695SBram Moolenaar # define PyString_FromFormat dll_PyString_FromFormat 239071d4279SBram Moolenaar # define PyString_FromStringAndSize dll_PyString_FromStringAndSize 240071d4279SBram Moolenaar # define PyString_Size dll_PyString_Size 241071d4279SBram Moolenaar # define PyString_Type (*dll_PyString_Type) 242db913953SBram Moolenaar # define PyUnicode_Type (*dll_PyUnicode_Type) 243cc3e85f1SBram Moolenaar # undef PyUnicode_AsEncodedString 244cc3e85f1SBram Moolenaar # define PyUnicode_AsEncodedString py_PyUnicode_AsEncodedString 245db913953SBram Moolenaar # define PyFloat_AsDouble dll_PyFloat_AsDouble 246db913953SBram Moolenaar # define PyFloat_FromDouble dll_PyFloat_FromDouble 247db913953SBram Moolenaar # define PyFloat_Type (*dll_PyFloat_Type) 248141be8a5SBram Moolenaar # define PyNumber_Check dll_PyNumber_Check 249141be8a5SBram Moolenaar # define PyNumber_Long dll_PyNumber_Long 250db913953SBram Moolenaar # define PyImport_AddModule (*dll_PyImport_AddModule) 251071d4279SBram Moolenaar # define PySys_SetObject dll_PySys_SetObject 252c09a6d6cSBram Moolenaar # define PySys_GetObject dll_PySys_GetObject 253071d4279SBram Moolenaar # define PySys_SetArgv dll_PySys_SetArgv 254071d4279SBram Moolenaar # define PyType_Type (*dll_PyType_Type) 255d4a8c98eSBram Moolenaar # define PyFile_Type (*dll_PyFile_Type) 256063a46baSBram Moolenaar # define PySlice_Type (*dll_PySlice_Type) 25730fec7bcSBram Moolenaar # define PyType_Ready (*dll_PyType_Ready) 258a9922d62SBram Moolenaar # define PyType_GenericAlloc dll_PyType_GenericAlloc 259071d4279SBram Moolenaar # define Py_BuildValue dll_Py_BuildValue 260071d4279SBram Moolenaar # define Py_FindMethod dll_Py_FindMethod 261071d4279SBram Moolenaar # define Py_InitModule4 dll_Py_InitModule4 262644d37b8SBram Moolenaar # define Py_SetPythonHome dll_Py_SetPythonHome 263071d4279SBram Moolenaar # define Py_Initialize dll_Py_Initialize 2640e21a3f6SBram Moolenaar # define Py_Finalize dll_Py_Finalize 2650e21a3f6SBram Moolenaar # define Py_IsInitialized dll_Py_IsInitialized 266071d4279SBram Moolenaar # define _PyObject_New dll__PyObject_New 267774267bbSBram Moolenaar # define _PyObject_GC_New dll__PyObject_GC_New 2683e734ea2SBram Moolenaar # ifdef PyObject_GC_Del 2693e734ea2SBram Moolenaar # define Py_underscore_GC 2703e734ea2SBram Moolenaar # define _PyObject_GC_Del dll__PyObject_GC_Del 2713e734ea2SBram Moolenaar # define _PyObject_GC_UnTrack dll__PyObject_GC_UnTrack 2723e734ea2SBram Moolenaar # else 273774267bbSBram Moolenaar # define PyObject_GC_Del dll_PyObject_GC_Del 274774267bbSBram Moolenaar # define PyObject_GC_UnTrack dll_PyObject_GC_UnTrack 2753e734ea2SBram Moolenaar # endif 276e721122bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 277db913953SBram Moolenaar # define _PyObject_NextNotImplemented (*dll__PyObject_NextNotImplemented) 278e721122bSBram Moolenaar # endif 279071d4279SBram Moolenaar # define _Py_NoneStruct (*dll__Py_NoneStruct) 28066b7985eSBram Moolenaar # define _Py_ZeroStruct (*dll__Py_ZeroStruct) 28166b7985eSBram Moolenaar # define _Py_TrueStruct (*dll__Py_TrueStruct) 282071d4279SBram Moolenaar # define PyObject_Init dll__PyObject_Init 283db913953SBram Moolenaar # define PyObject_GetIter dll_PyObject_GetIter 28403db85b3SBram Moolenaar # define PyObject_IsTrue dll_PyObject_IsTrue 285071d4279SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000 286071d4279SBram Moolenaar # define PyType_IsSubtype dll_PyType_IsSubtype 2870014a53aSBram Moolenaar # ifdef Py_DEBUG 2880014a53aSBram Moolenaar # define _Py_NegativeRefcount dll__Py_NegativeRefcount 2890014a53aSBram Moolenaar # define _Py_RefTotal (*dll__Py_RefTotal) 2900014a53aSBram Moolenaar # define _Py_Dealloc dll__Py_Dealloc 2910014a53aSBram Moolenaar # endif 2923e734ea2SBram Moolenaar # endif 2933e734ea2SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000 2940014a53aSBram Moolenaar # if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC) 2950014a53aSBram Moolenaar # define _PyObject_DebugMalloc dll__PyObject_DebugMalloc 2960014a53aSBram Moolenaar # define _PyObject_DebugFree dll__PyObject_DebugFree 2970014a53aSBram Moolenaar # else 298071d4279SBram Moolenaar # define PyObject_Malloc dll_PyObject_Malloc 299071d4279SBram Moolenaar # define PyObject_Free dll_PyObject_Free 300071d4279SBram Moolenaar # endif 3010014a53aSBram Moolenaar # endif 3022afa3238SBram Moolenaar # ifdef PY_USE_CAPSULE 303db913953SBram Moolenaar # define PyCapsule_New dll_PyCapsule_New 304db913953SBram Moolenaar # define PyCapsule_GetPointer dll_PyCapsule_GetPointer 3052afa3238SBram Moolenaar # else 3062afa3238SBram Moolenaar # define PyCObject_FromVoidPtr dll_PyCObject_FromVoidPtr 3072afa3238SBram Moolenaar # define PyCObject_AsVoidPtr dll_PyCObject_AsVoidPtr 3082afa3238SBram Moolenaar # endif 30912a28d4bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 31012a28d4bSBram Moolenaar # define Py_NoSiteFlag (*dll_Py_NoSiteFlag) 31112a28d4bSBram Moolenaar # endif 312071d4279SBram Moolenaar 313071d4279SBram Moolenaar /* 314071d4279SBram Moolenaar * Pointers for dynamic link 315071d4279SBram Moolenaar */ 316071d4279SBram Moolenaar static int(*dll_PyArg_Parse)(PyObject *, char *, ...); 317071d4279SBram Moolenaar static int(*dll_PyArg_ParseTuple)(PyObject *, char *, ...); 31819e60943SBram Moolenaar static int(*dll_PyMem_Free)(void *); 319db913953SBram Moolenaar static void* (*dll_PyMem_Malloc)(size_t); 320071d4279SBram Moolenaar static int(*dll_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item); 321071d4279SBram Moolenaar static int(*dll_PyErr_BadArgument)(void); 322d5f729caSBram Moolenaar static PyObject *(*dll_PyErr_NewException)(char *, PyObject *, PyObject *); 323071d4279SBram Moolenaar static void(*dll_PyErr_Clear)(void); 324c476e52fSBram Moolenaar static PyObject*(*dll_PyErr_Format)(PyObject *, const char *, ...); 3254d36987cSBram Moolenaar static void(*dll_PyErr_PrintEx)(int); 326071d4279SBram Moolenaar static PyObject*(*dll_PyErr_NoMemory)(void); 327071d4279SBram Moolenaar static PyObject*(*dll_PyErr_Occurred)(void); 328071d4279SBram Moolenaar static void(*dll_PyErr_SetNone)(PyObject *); 329071d4279SBram Moolenaar static void(*dll_PyErr_SetString)(PyObject *, const char *); 3304d188da2SBram Moolenaar static void(*dll_PyErr_SetObject)(PyObject *, PyObject *); 331c09a6d6cSBram Moolenaar static int(*dll_PyErr_ExceptionMatches)(PyObject *); 332071d4279SBram Moolenaar static void(*dll_PyEval_InitThreads)(void); 333071d4279SBram Moolenaar static void(*dll_PyEval_RestoreThread)(PyThreadState *); 334071d4279SBram Moolenaar static PyThreadState*(*dll_PyEval_SaveThread)(void); 335071d4279SBram Moolenaar # ifdef PY_CAN_RECURSE 336071d4279SBram Moolenaar static PyGILState_STATE (*dll_PyGILState_Ensure)(void); 337071d4279SBram Moolenaar static void (*dll_PyGILState_Release)(PyGILState_STATE); 338071d4279SBram Moolenaar # endif 339071d4279SBram Moolenaar static long(*dll_PyInt_AsLong)(PyObject *); 340071d4279SBram Moolenaar static PyObject*(*dll_PyInt_FromLong)(long); 341db913953SBram Moolenaar static long(*dll_PyLong_AsLong)(PyObject *); 342db913953SBram Moolenaar static PyObject*(*dll_PyLong_FromLong)(long); 34366b7985eSBram Moolenaar static PyTypeObject* dll_PyBool_Type; 344071d4279SBram Moolenaar static PyTypeObject* dll_PyInt_Type; 345db913953SBram Moolenaar static PyTypeObject* dll_PyLong_Type; 3462c45e945SBram Moolenaar static PyObject*(*dll_PyList_GetItem)(PyObject *, PyInt); 347c09a6d6cSBram Moolenaar static int(*dll_PyList_Append)(PyObject *, PyObject *); 348d5e376ebSBram Moolenaar static int(*dll_PyList_Insert)(PyObject *, PyInt, PyObject *); 3492c45e945SBram Moolenaar static PyObject*(*dll_PyList_New)(PyInt size); 3502c45e945SBram Moolenaar static int(*dll_PyList_SetItem)(PyObject *, PyInt, PyObject *); 3512c45e945SBram Moolenaar static PyInt(*dll_PyList_Size)(PyObject *); 352071d4279SBram Moolenaar static PyTypeObject* dll_PyList_Type; 353db913953SBram Moolenaar static int (*dll_PySequence_Check)(PyObject *); 354db913953SBram Moolenaar static PyInt(*dll_PySequence_Size)(PyObject *); 355db913953SBram Moolenaar static PyObject*(*dll_PySequence_GetItem)(PyObject *, PyInt); 356a9922d62SBram Moolenaar static PyObject*(*dll_PySequence_Fast)(PyObject *, const char *); 357db913953SBram Moolenaar static PyInt(*dll_PyTuple_Size)(PyObject *); 358db913953SBram Moolenaar static PyObject*(*dll_PyTuple_GetItem)(PyObject *, PyInt); 359db913953SBram Moolenaar static PyTypeObject* dll_PyTuple_Type; 3605395e7afSBram Moolenaar static int (*dll_PySlice_GetIndicesEx)(PySliceObject *r, PyInt length, 361063a46baSBram Moolenaar PyInt *start, PyInt *stop, PyInt *step, 362063a46baSBram Moolenaar PyInt *slicelen); 363071d4279SBram Moolenaar static PyObject*(*dll_PyImport_ImportModule)(const char *); 3640ac9379aSBram Moolenaar static PyObject*(*dll_PyDict_New)(void); 365071d4279SBram Moolenaar static PyObject*(*dll_PyDict_GetItemString)(PyObject *, const char *); 3663e734ea2SBram Moolenaar static int (*dll_PyDict_Next)(PyObject *, PyInt *, PyObject **, PyObject **); 3673e734ea2SBram Moolenaar static PyTypeObject* dll_PyDict_Type; 368bcb40977SBram Moolenaar # ifndef PY_NO_MAPPING_KEYS 369bcb40977SBram Moolenaar static PyObject* (*dll_PyMapping_Keys)(PyObject *); 370db913953SBram Moolenaar # endif 371bcb40977SBram Moolenaar static PyObject* (*dll_PyObject_GetItem)(PyObject *, PyObject *); 372db913953SBram Moolenaar static PyObject* (*dll_PyObject_CallMethod)(PyObject *, char *, PyObject *); 373db913953SBram Moolenaar static int (*dll_PyMapping_Check)(PyObject *); 374db913953SBram Moolenaar static PyObject* (*dll_PyIter_Next)(PyObject *); 375071d4279SBram Moolenaar static PyObject*(*dll_PyModule_GetDict)(PyObject *); 376f9c9b32bSBram Moolenaar static int(*dll_PyModule_AddObject)(PyObject *, const char *, PyObject *); 377071d4279SBram Moolenaar static int(*dll_PyRun_SimpleString)(char *); 378db913953SBram Moolenaar static PyObject *(*dll_PyRun_String)(char *, int, PyObject *, PyObject *); 379d620aa9bSBram Moolenaar static PyObject* (*dll_PyObject_GetAttrString)(PyObject *, const char *); 380a9922d62SBram Moolenaar static int (*dll_PyObject_HasAttrString)(PyObject *, const char *); 3810b400087SBram Moolenaar static int (*dll_PyObject_SetAttrString)(PyObject *, const char *, PyObject *); 382d620aa9bSBram Moolenaar static PyObject* (*dll_PyObject_CallFunctionObjArgs)(PyObject *, ...); 3839f3685a5SBram Moolenaar static PyObject* (*dll_PyObject_CallFunction)(PyObject *, char *, ...); 384f4258308SBram Moolenaar static PyObject* (*dll_PyObject_Call)(PyObject *, PyObject *, PyObject *); 385141be8a5SBram Moolenaar static PyObject* (*dll_PyObject_Repr)(PyObject *); 386071d4279SBram Moolenaar static char*(*dll_PyString_AsString)(PyObject *); 387d5e376ebSBram Moolenaar static int(*dll_PyString_AsStringAndSize)(PyObject *, char **, PyInt *); 388071d4279SBram Moolenaar static PyObject*(*dll_PyString_FromString)(const char *); 3891a3b5695SBram Moolenaar static PyObject*(*dll_PyString_FromFormat)(const char *, ...); 3902c45e945SBram Moolenaar static PyObject*(*dll_PyString_FromStringAndSize)(const char *, PyInt); 3912c45e945SBram Moolenaar static PyInt(*dll_PyString_Size)(PyObject *); 392071d4279SBram Moolenaar static PyTypeObject* dll_PyString_Type; 393db913953SBram Moolenaar static PyTypeObject* dll_PyUnicode_Type; 394cc3e85f1SBram Moolenaar static PyObject *(*py_PyUnicode_AsEncodedString)(PyObject *, char *, char *); 395db913953SBram Moolenaar static double(*dll_PyFloat_AsDouble)(PyObject *); 396db913953SBram Moolenaar static PyObject*(*dll_PyFloat_FromDouble)(double); 397db913953SBram Moolenaar static PyTypeObject* dll_PyFloat_Type; 398141be8a5SBram Moolenaar static int(*dll_PyNumber_Check)(PyObject *); 399141be8a5SBram Moolenaar static PyObject*(*dll_PyNumber_Long)(PyObject *); 400071d4279SBram Moolenaar static int(*dll_PySys_SetObject)(char *, PyObject *); 401c09a6d6cSBram Moolenaar static PyObject *(*dll_PySys_GetObject)(char *); 402071d4279SBram Moolenaar static int(*dll_PySys_SetArgv)(int, char **); 403071d4279SBram Moolenaar static PyTypeObject* dll_PyType_Type; 404d4a8c98eSBram Moolenaar static PyTypeObject* dll_PyFile_Type; 405063a46baSBram Moolenaar static PyTypeObject* dll_PySlice_Type; 40630fec7bcSBram Moolenaar static int (*dll_PyType_Ready)(PyTypeObject *type); 407a9922d62SBram Moolenaar static PyObject* (*dll_PyType_GenericAlloc)(PyTypeObject *type, PyInt nitems); 408071d4279SBram Moolenaar static PyObject*(*dll_Py_BuildValue)(char *, ...); 409071d4279SBram Moolenaar static PyObject*(*dll_Py_FindMethod)(struct PyMethodDef[], PyObject *, char *); 410071d4279SBram Moolenaar static PyObject*(*dll_Py_InitModule4)(char *, struct PyMethodDef *, char *, PyObject *, int); 411db913953SBram Moolenaar static PyObject*(*dll_PyImport_AddModule)(char *); 412644d37b8SBram Moolenaar static void(*dll_Py_SetPythonHome)(char *home); 413071d4279SBram Moolenaar static void(*dll_Py_Initialize)(void); 4140e21a3f6SBram Moolenaar static void(*dll_Py_Finalize)(void); 4150e21a3f6SBram Moolenaar static int(*dll_Py_IsInitialized)(void); 416071d4279SBram Moolenaar static PyObject*(*dll__PyObject_New)(PyTypeObject *, PyObject *); 417774267bbSBram Moolenaar static PyObject*(*dll__PyObject_GC_New)(PyTypeObject *); 4183e734ea2SBram Moolenaar # ifdef Py_underscore_GC 4193e734ea2SBram Moolenaar static void(*dll__PyObject_GC_Del)(void *); 4203e734ea2SBram Moolenaar static void(*dll__PyObject_GC_UnTrack)(void *); 4213e734ea2SBram Moolenaar # else 422774267bbSBram Moolenaar static void(*dll_PyObject_GC_Del)(void *); 423774267bbSBram Moolenaar static void(*dll_PyObject_GC_UnTrack)(void *); 4243e734ea2SBram Moolenaar # endif 425071d4279SBram Moolenaar static PyObject*(*dll__PyObject_Init)(PyObject *, PyTypeObject *); 426db913953SBram Moolenaar static PyObject* (*dll_PyObject_GetIter)(PyObject *); 42703db85b3SBram Moolenaar static int (*dll_PyObject_IsTrue)(PyObject *); 428e721122bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 429db913953SBram Moolenaar static iternextfunc dll__PyObject_NextNotImplemented; 430e721122bSBram Moolenaar # endif 431071d4279SBram Moolenaar static PyObject* dll__Py_NoneStruct; 43266b7985eSBram Moolenaar static PyObject* _Py_ZeroStruct; 43366b7985eSBram Moolenaar static PyObject* dll__Py_TrueStruct; 434071d4279SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000 435071d4279SBram Moolenaar static int (*dll_PyType_IsSubtype)(PyTypeObject *, PyTypeObject *); 4360014a53aSBram Moolenaar # ifdef Py_DEBUG 4370014a53aSBram Moolenaar static void (*dll__Py_NegativeRefcount)(const char *fname, int lineno, PyObject *op); 4383e734ea2SBram Moolenaar static PyInt* dll__Py_RefTotal; 4390014a53aSBram Moolenaar static void (*dll__Py_Dealloc)(PyObject *obj); 4400014a53aSBram Moolenaar # endif 4413e734ea2SBram Moolenaar # endif 4423e734ea2SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000 4430014a53aSBram Moolenaar # if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC) 4440014a53aSBram Moolenaar static void (*dll__PyObject_DebugFree)(void*); 4450014a53aSBram Moolenaar static void* (*dll__PyObject_DebugMalloc)(size_t); 4460014a53aSBram Moolenaar # else 447071d4279SBram Moolenaar static void* (*dll_PyObject_Malloc)(size_t); 448071d4279SBram Moolenaar static void (*dll_PyObject_Free)(void*); 449071d4279SBram Moolenaar # endif 4500014a53aSBram Moolenaar # endif 4512afa3238SBram Moolenaar # ifdef PY_USE_CAPSULE 452db913953SBram Moolenaar static PyObject* (*dll_PyCapsule_New)(void *, char *, PyCapsule_Destructor); 453db913953SBram Moolenaar static void* (*dll_PyCapsule_GetPointer)(PyObject *, char *); 4542afa3238SBram Moolenaar # else 455221d6872SBram Moolenaar static PyObject* (*dll_PyCObject_FromVoidPtr)(void *cobj, void (*destr)(void *)); 456221d6872SBram Moolenaar static void* (*dll_PyCObject_AsVoidPtr)(PyObject *); 4572afa3238SBram Moolenaar # endif 45812a28d4bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 45912a28d4bSBram Moolenaar static int* dll_Py_NoSiteFlag; 46012a28d4bSBram Moolenaar # endif 461071d4279SBram Moolenaar 4622ab2e860SBram Moolenaar static HINSTANCE hinstPython = 0; // Instance of python.dll 463071d4279SBram Moolenaar 4642ab2e860SBram Moolenaar // Imported exception objects 465071d4279SBram Moolenaar static PyObject *imp_PyExc_AttributeError; 466071d4279SBram Moolenaar static PyObject *imp_PyExc_IndexError; 467af6abb9dSBram Moolenaar static PyObject *imp_PyExc_KeyError; 468071d4279SBram Moolenaar static PyObject *imp_PyExc_KeyboardInterrupt; 469071d4279SBram Moolenaar static PyObject *imp_PyExc_TypeError; 470071d4279SBram Moolenaar static PyObject *imp_PyExc_ValueError; 47141009374SBram Moolenaar static PyObject *imp_PyExc_SystemExit; 4728661b178SBram Moolenaar static PyObject *imp_PyExc_RuntimeError; 473c09a6d6cSBram Moolenaar static PyObject *imp_PyExc_ImportError; 474141be8a5SBram Moolenaar static PyObject *imp_PyExc_OverflowError; 475071d4279SBram Moolenaar 476071d4279SBram Moolenaar # define PyExc_AttributeError imp_PyExc_AttributeError 477071d4279SBram Moolenaar # define PyExc_IndexError imp_PyExc_IndexError 478af6abb9dSBram Moolenaar # define PyExc_KeyError imp_PyExc_KeyError 479071d4279SBram Moolenaar # define PyExc_KeyboardInterrupt imp_PyExc_KeyboardInterrupt 480071d4279SBram Moolenaar # define PyExc_TypeError imp_PyExc_TypeError 481071d4279SBram Moolenaar # define PyExc_ValueError imp_PyExc_ValueError 48241009374SBram Moolenaar # define PyExc_SystemExit imp_PyExc_SystemExit 4838661b178SBram Moolenaar # define PyExc_RuntimeError imp_PyExc_RuntimeError 484c09a6d6cSBram Moolenaar # define PyExc_ImportError imp_PyExc_ImportError 485141be8a5SBram Moolenaar # define PyExc_OverflowError imp_PyExc_OverflowError 486071d4279SBram Moolenaar 487071d4279SBram Moolenaar /* 488071d4279SBram Moolenaar * Table of name to function pointer of python. 489071d4279SBram Moolenaar */ 490071d4279SBram Moolenaar # define PYTHON_PROC FARPROC 491071d4279SBram Moolenaar static struct 492071d4279SBram Moolenaar { 493071d4279SBram Moolenaar char *name; 494071d4279SBram Moolenaar PYTHON_PROC *ptr; 495071d4279SBram Moolenaar } python_funcname_table[] = 496071d4279SBram Moolenaar { 497e8cdcef8SBram Moolenaar # ifndef PY_SSIZE_T_CLEAN 498071d4279SBram Moolenaar {"PyArg_Parse", (PYTHON_PROC*)&dll_PyArg_Parse}, 499071d4279SBram Moolenaar {"PyArg_ParseTuple", (PYTHON_PROC*)&dll_PyArg_ParseTuple}, 500e8cdcef8SBram Moolenaar {"Py_BuildValue", (PYTHON_PROC*)&dll_Py_BuildValue}, 501e8cdcef8SBram Moolenaar # else 502e8cdcef8SBram Moolenaar {"_PyArg_Parse_SizeT", (PYTHON_PROC*)&dll_PyArg_Parse}, 503e8cdcef8SBram Moolenaar {"_PyArg_ParseTuple_SizeT", (PYTHON_PROC*)&dll_PyArg_ParseTuple}, 504e8cdcef8SBram Moolenaar {"_Py_BuildValue_SizeT", (PYTHON_PROC*)&dll_Py_BuildValue}, 505e8cdcef8SBram Moolenaar # endif 50619e60943SBram Moolenaar {"PyMem_Free", (PYTHON_PROC*)&dll_PyMem_Free}, 507db913953SBram Moolenaar {"PyMem_Malloc", (PYTHON_PROC*)&dll_PyMem_Malloc}, 508071d4279SBram Moolenaar {"PyDict_SetItemString", (PYTHON_PROC*)&dll_PyDict_SetItemString}, 509071d4279SBram Moolenaar {"PyErr_BadArgument", (PYTHON_PROC*)&dll_PyErr_BadArgument}, 510d5f729caSBram Moolenaar {"PyErr_NewException", (PYTHON_PROC*)&dll_PyErr_NewException}, 511071d4279SBram Moolenaar {"PyErr_Clear", (PYTHON_PROC*)&dll_PyErr_Clear}, 512c476e52fSBram Moolenaar {"PyErr_Format", (PYTHON_PROC*)&dll_PyErr_Format}, 5134d36987cSBram Moolenaar {"PyErr_PrintEx", (PYTHON_PROC*)&dll_PyErr_PrintEx}, 514071d4279SBram Moolenaar {"PyErr_NoMemory", (PYTHON_PROC*)&dll_PyErr_NoMemory}, 515071d4279SBram Moolenaar {"PyErr_Occurred", (PYTHON_PROC*)&dll_PyErr_Occurred}, 516071d4279SBram Moolenaar {"PyErr_SetNone", (PYTHON_PROC*)&dll_PyErr_SetNone}, 517071d4279SBram Moolenaar {"PyErr_SetString", (PYTHON_PROC*)&dll_PyErr_SetString}, 5184d188da2SBram Moolenaar {"PyErr_SetObject", (PYTHON_PROC*)&dll_PyErr_SetObject}, 519c09a6d6cSBram Moolenaar {"PyErr_ExceptionMatches", (PYTHON_PROC*)&dll_PyErr_ExceptionMatches}, 520071d4279SBram Moolenaar {"PyEval_InitThreads", (PYTHON_PROC*)&dll_PyEval_InitThreads}, 521071d4279SBram Moolenaar {"PyEval_RestoreThread", (PYTHON_PROC*)&dll_PyEval_RestoreThread}, 522071d4279SBram Moolenaar {"PyEval_SaveThread", (PYTHON_PROC*)&dll_PyEval_SaveThread}, 523071d4279SBram Moolenaar # ifdef PY_CAN_RECURSE 524071d4279SBram Moolenaar {"PyGILState_Ensure", (PYTHON_PROC*)&dll_PyGILState_Ensure}, 525071d4279SBram Moolenaar {"PyGILState_Release", (PYTHON_PROC*)&dll_PyGILState_Release}, 526071d4279SBram Moolenaar # endif 527071d4279SBram Moolenaar {"PyInt_AsLong", (PYTHON_PROC*)&dll_PyInt_AsLong}, 528071d4279SBram Moolenaar {"PyInt_FromLong", (PYTHON_PROC*)&dll_PyInt_FromLong}, 529db913953SBram Moolenaar {"PyLong_AsLong", (PYTHON_PROC*)&dll_PyLong_AsLong}, 530db913953SBram Moolenaar {"PyLong_FromLong", (PYTHON_PROC*)&dll_PyLong_FromLong}, 53166b7985eSBram Moolenaar {"PyBool_Type", (PYTHON_PROC*)&dll_PyBool_Type}, 532071d4279SBram Moolenaar {"PyInt_Type", (PYTHON_PROC*)&dll_PyInt_Type}, 533db913953SBram Moolenaar {"PyLong_Type", (PYTHON_PROC*)&dll_PyLong_Type}, 534071d4279SBram Moolenaar {"PyList_GetItem", (PYTHON_PROC*)&dll_PyList_GetItem}, 5350ac9379aSBram Moolenaar {"PyList_Append", (PYTHON_PROC*)&dll_PyList_Append}, 536c09a6d6cSBram Moolenaar {"PyList_Insert", (PYTHON_PROC*)&dll_PyList_Insert}, 537071d4279SBram Moolenaar {"PyList_New", (PYTHON_PROC*)&dll_PyList_New}, 538071d4279SBram Moolenaar {"PyList_SetItem", (PYTHON_PROC*)&dll_PyList_SetItem}, 539071d4279SBram Moolenaar {"PyList_Size", (PYTHON_PROC*)&dll_PyList_Size}, 540071d4279SBram Moolenaar {"PyList_Type", (PYTHON_PROC*)&dll_PyList_Type}, 541db913953SBram Moolenaar {"PySequence_Size", (PYTHON_PROC*)&dll_PySequence_Size}, 542db913953SBram Moolenaar {"PySequence_Check", (PYTHON_PROC*)&dll_PySequence_Check}, 543a9922d62SBram Moolenaar {"PySequence_GetItem", (PYTHON_PROC*)&dll_PySequence_GetItem}, 544a9922d62SBram Moolenaar {"PySequence_Fast", (PYTHON_PROC*)&dll_PySequence_Fast}, 545db913953SBram Moolenaar {"PyTuple_GetItem", (PYTHON_PROC*)&dll_PyTuple_GetItem}, 546db913953SBram Moolenaar {"PyTuple_Size", (PYTHON_PROC*)&dll_PyTuple_Size}, 547db913953SBram Moolenaar {"PyTuple_Type", (PYTHON_PROC*)&dll_PyTuple_Type}, 548063a46baSBram Moolenaar {"PySlice_GetIndicesEx", (PYTHON_PROC*)&dll_PySlice_GetIndicesEx}, 549071d4279SBram Moolenaar {"PyImport_ImportModule", (PYTHON_PROC*)&dll_PyImport_ImportModule}, 550071d4279SBram Moolenaar {"PyDict_GetItemString", (PYTHON_PROC*)&dll_PyDict_GetItemString}, 551db913953SBram Moolenaar {"PyDict_Next", (PYTHON_PROC*)&dll_PyDict_Next}, 5520ac9379aSBram Moolenaar {"PyDict_New", (PYTHON_PROC*)&dll_PyDict_New}, 5533e734ea2SBram Moolenaar {"PyDict_Type", (PYTHON_PROC*)&dll_PyDict_Type}, 554bcb40977SBram Moolenaar # ifndef PY_NO_MAPPING_KEYS 555bcb40977SBram Moolenaar {"PyMapping_Keys", (PYTHON_PROC*)&dll_PyMapping_Keys}, 556db913953SBram Moolenaar # endif 557bcb40977SBram Moolenaar {"PyObject_GetItem", (PYTHON_PROC*)&dll_PyObject_GetItem}, 558db913953SBram Moolenaar {"PyObject_CallMethod", (PYTHON_PROC*)&dll_PyObject_CallMethod}, 559db913953SBram Moolenaar {"PyMapping_Check", (PYTHON_PROC*)&dll_PyMapping_Check}, 560db913953SBram Moolenaar {"PyIter_Next", (PYTHON_PROC*)&dll_PyIter_Next}, 561071d4279SBram Moolenaar {"PyModule_GetDict", (PYTHON_PROC*)&dll_PyModule_GetDict}, 562f9c9b32bSBram Moolenaar {"PyModule_AddObject", (PYTHON_PROC*)&dll_PyModule_AddObject}, 563071d4279SBram Moolenaar {"PyRun_SimpleString", (PYTHON_PROC*)&dll_PyRun_SimpleString}, 564db913953SBram Moolenaar {"PyRun_String", (PYTHON_PROC*)&dll_PyRun_String}, 565d620aa9bSBram Moolenaar {"PyObject_GetAttrString", (PYTHON_PROC*)&dll_PyObject_GetAttrString}, 566a9922d62SBram Moolenaar {"PyObject_HasAttrString", (PYTHON_PROC*)&dll_PyObject_HasAttrString}, 567d620aa9bSBram Moolenaar {"PyObject_SetAttrString", (PYTHON_PROC*)&dll_PyObject_SetAttrString}, 568d620aa9bSBram Moolenaar {"PyObject_CallFunctionObjArgs", (PYTHON_PROC*)&dll_PyObject_CallFunctionObjArgs}, 5699f3685a5SBram Moolenaar {"PyObject_CallFunction", (PYTHON_PROC*)&dll_PyObject_CallFunction}, 570f4258308SBram Moolenaar {"PyObject_Call", (PYTHON_PROC*)&dll_PyObject_Call}, 571141be8a5SBram Moolenaar {"PyObject_Repr", (PYTHON_PROC*)&dll_PyObject_Repr}, 572071d4279SBram Moolenaar {"PyString_AsString", (PYTHON_PROC*)&dll_PyString_AsString}, 573cdab9051SBram Moolenaar {"PyString_AsStringAndSize", (PYTHON_PROC*)&dll_PyString_AsStringAndSize}, 574071d4279SBram Moolenaar {"PyString_FromString", (PYTHON_PROC*)&dll_PyString_FromString}, 5751a3b5695SBram Moolenaar {"PyString_FromFormat", (PYTHON_PROC*)&dll_PyString_FromFormat}, 576071d4279SBram Moolenaar {"PyString_FromStringAndSize", (PYTHON_PROC*)&dll_PyString_FromStringAndSize}, 577071d4279SBram Moolenaar {"PyString_Size", (PYTHON_PROC*)&dll_PyString_Size}, 578071d4279SBram Moolenaar {"PyString_Type", (PYTHON_PROC*)&dll_PyString_Type}, 579db913953SBram Moolenaar {"PyUnicode_Type", (PYTHON_PROC*)&dll_PyUnicode_Type}, 580db913953SBram Moolenaar {"PyFloat_Type", (PYTHON_PROC*)&dll_PyFloat_Type}, 581db913953SBram Moolenaar {"PyFloat_AsDouble", (PYTHON_PROC*)&dll_PyFloat_AsDouble}, 582db913953SBram Moolenaar {"PyFloat_FromDouble", (PYTHON_PROC*)&dll_PyFloat_FromDouble}, 583db913953SBram Moolenaar {"PyImport_AddModule", (PYTHON_PROC*)&dll_PyImport_AddModule}, 584141be8a5SBram Moolenaar {"PyNumber_Check", (PYTHON_PROC*)&dll_PyNumber_Check}, 585141be8a5SBram Moolenaar {"PyNumber_Long", (PYTHON_PROC*)&dll_PyNumber_Long}, 586071d4279SBram Moolenaar {"PySys_SetObject", (PYTHON_PROC*)&dll_PySys_SetObject}, 587c09a6d6cSBram Moolenaar {"PySys_GetObject", (PYTHON_PROC*)&dll_PySys_GetObject}, 588071d4279SBram Moolenaar {"PySys_SetArgv", (PYTHON_PROC*)&dll_PySys_SetArgv}, 589071d4279SBram Moolenaar {"PyType_Type", (PYTHON_PROC*)&dll_PyType_Type}, 590d4a8c98eSBram Moolenaar {"PyFile_Type", (PYTHON_PROC*)&dll_PyFile_Type}, 591063a46baSBram Moolenaar {"PySlice_Type", (PYTHON_PROC*)&dll_PySlice_Type}, 59230fec7bcSBram Moolenaar {"PyType_Ready", (PYTHON_PROC*)&dll_PyType_Ready}, 593a9922d62SBram Moolenaar {"PyType_GenericAlloc", (PYTHON_PROC*)&dll_PyType_GenericAlloc}, 594071d4279SBram Moolenaar {"Py_FindMethod", (PYTHON_PROC*)&dll_Py_FindMethod}, 595644d37b8SBram Moolenaar {"Py_SetPythonHome", (PYTHON_PROC*)&dll_Py_SetPythonHome}, 596071d4279SBram Moolenaar {"Py_Initialize", (PYTHON_PROC*)&dll_Py_Initialize}, 5970e21a3f6SBram Moolenaar {"Py_Finalize", (PYTHON_PROC*)&dll_Py_Finalize}, 5980e21a3f6SBram Moolenaar {"Py_IsInitialized", (PYTHON_PROC*)&dll_Py_IsInitialized}, 599071d4279SBram Moolenaar {"_PyObject_New", (PYTHON_PROC*)&dll__PyObject_New}, 600774267bbSBram Moolenaar {"_PyObject_GC_New", (PYTHON_PROC*)&dll__PyObject_GC_New}, 6013e734ea2SBram Moolenaar # ifdef Py_underscore_GC 6023e734ea2SBram Moolenaar {"_PyObject_GC_Del", (PYTHON_PROC*)&dll__PyObject_GC_Del}, 6033e734ea2SBram Moolenaar {"_PyObject_GC_UnTrack", (PYTHON_PROC*)&dll__PyObject_GC_UnTrack}, 6043e734ea2SBram Moolenaar # else 605774267bbSBram Moolenaar {"PyObject_GC_Del", (PYTHON_PROC*)&dll_PyObject_GC_Del}, 606774267bbSBram Moolenaar {"PyObject_GC_UnTrack", (PYTHON_PROC*)&dll_PyObject_GC_UnTrack}, 6073e734ea2SBram Moolenaar # endif 608071d4279SBram Moolenaar {"PyObject_Init", (PYTHON_PROC*)&dll__PyObject_Init}, 609db913953SBram Moolenaar {"PyObject_GetIter", (PYTHON_PROC*)&dll_PyObject_GetIter}, 61003db85b3SBram Moolenaar {"PyObject_IsTrue", (PYTHON_PROC*)&dll_PyObject_IsTrue}, 611e721122bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 612db913953SBram Moolenaar {"_PyObject_NextNotImplemented", (PYTHON_PROC*)&dll__PyObject_NextNotImplemented}, 613e721122bSBram Moolenaar # endif 614071d4279SBram Moolenaar {"_Py_NoneStruct", (PYTHON_PROC*)&dll__Py_NoneStruct}, 61566b7985eSBram Moolenaar {"_Py_ZeroStruct", (PYTHON_PROC*)&dll__Py_ZeroStruct}, 61666b7985eSBram Moolenaar {"_Py_TrueStruct", (PYTHON_PROC*)&dll__Py_TrueStruct}, 617071d4279SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000 6180014a53aSBram Moolenaar # ifdef Py_DEBUG 6190014a53aSBram Moolenaar {"_Py_NegativeRefcount", (PYTHON_PROC*)&dll__Py_NegativeRefcount}, 6200014a53aSBram Moolenaar {"_Py_RefTotal", (PYTHON_PROC*)&dll__Py_RefTotal}, 6210014a53aSBram Moolenaar {"_Py_Dealloc", (PYTHON_PROC*)&dll__Py_Dealloc}, 6220014a53aSBram Moolenaar # endif 6233e734ea2SBram Moolenaar {"PyType_IsSubtype", (PYTHON_PROC*)&dll_PyType_IsSubtype}, 6243e734ea2SBram Moolenaar # endif 6253e734ea2SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000 6260014a53aSBram Moolenaar # if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC) 6270014a53aSBram Moolenaar {"_PyObject_DebugFree", (PYTHON_PROC*)&dll__PyObject_DebugFree}, 6280014a53aSBram Moolenaar {"_PyObject_DebugMalloc", (PYTHON_PROC*)&dll__PyObject_DebugMalloc}, 6290014a53aSBram Moolenaar # else 630071d4279SBram Moolenaar {"PyObject_Malloc", (PYTHON_PROC*)&dll_PyObject_Malloc}, 631071d4279SBram Moolenaar {"PyObject_Free", (PYTHON_PROC*)&dll_PyObject_Free}, 632071d4279SBram Moolenaar # endif 6330014a53aSBram Moolenaar # endif 6340014a53aSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000 \ 635a2aa31a9SBram Moolenaar && SIZEOF_SIZE_T != VIM_SIZEOF_INT 6360014a53aSBram Moolenaar # ifdef Py_DEBUG 6370014a53aSBram Moolenaar {"Py_InitModule4TraceRefs_64", (PYTHON_PROC*)&dll_Py_InitModule4}, 6380014a53aSBram Moolenaar # else 6390014a53aSBram Moolenaar {"Py_InitModule4_64", (PYTHON_PROC*)&dll_Py_InitModule4}, 6400014a53aSBram Moolenaar # endif 6410014a53aSBram Moolenaar # else 6420014a53aSBram Moolenaar # ifdef Py_DEBUG 6430014a53aSBram Moolenaar {"Py_InitModule4TraceRefs", (PYTHON_PROC*)&dll_Py_InitModule4}, 6440014a53aSBram Moolenaar # else 6450014a53aSBram Moolenaar {"Py_InitModule4", (PYTHON_PROC*)&dll_Py_InitModule4}, 6460014a53aSBram Moolenaar # endif 6470014a53aSBram Moolenaar # endif 6482afa3238SBram Moolenaar # ifdef PY_USE_CAPSULE 649db913953SBram Moolenaar {"PyCapsule_New", (PYTHON_PROC*)&dll_PyCapsule_New}, 650db913953SBram Moolenaar {"PyCapsule_GetPointer", (PYTHON_PROC*)&dll_PyCapsule_GetPointer}, 6512afa3238SBram Moolenaar # else 6522afa3238SBram Moolenaar {"PyCObject_FromVoidPtr", (PYTHON_PROC*)&dll_PyCObject_FromVoidPtr}, 6532afa3238SBram Moolenaar {"PyCObject_AsVoidPtr", (PYTHON_PROC*)&dll_PyCObject_AsVoidPtr}, 6542afa3238SBram Moolenaar # endif 65512a28d4bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 65612a28d4bSBram Moolenaar {"Py_NoSiteFlag", (PYTHON_PROC*)&dll_Py_NoSiteFlag}, 65712a28d4bSBram Moolenaar # endif 658071d4279SBram Moolenaar {"", NULL}, 659071d4279SBram Moolenaar }; 660071d4279SBram Moolenaar 661071d4279SBram Moolenaar /* 662071d4279SBram Moolenaar * Load library and get all pointers. 663071d4279SBram Moolenaar * Parameter 'libname' provides name of DLL. 664071d4279SBram Moolenaar * Return OK or FAIL. 665071d4279SBram Moolenaar */ 666071d4279SBram Moolenaar static int 667071d4279SBram Moolenaar python_runtime_link_init(char *libname, int verbose) 668071d4279SBram Moolenaar { 669071d4279SBram Moolenaar int i; 6707b24ce08SBram Moolenaar PYTHON_PROC *ucs_as_encoded_string = 6717b24ce08SBram Moolenaar (PYTHON_PROC*)&py_PyUnicode_AsEncodedString; 672071d4279SBram Moolenaar 673644d37b8SBram Moolenaar # if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON3) 6742ab2e860SBram Moolenaar // Can't have Python and Python3 loaded at the same time. 6752ab2e860SBram Moolenaar // It cause a crash, because RTLD_GLOBAL is needed for 6762ab2e860SBram Moolenaar // standard C extension libraries of one or both python versions. 6774c3a326cSBram Moolenaar if (python3_loaded()) 6784c3a326cSBram Moolenaar { 6799dc93ae4SBram Moolenaar if (verbose) 680f9e3e09fSBram Moolenaar emsg(_("E836: This Vim cannot execute :python after using :py3")); 6814c3a326cSBram Moolenaar return FAIL; 6824c3a326cSBram Moolenaar } 6834c3a326cSBram Moolenaar # endif 6844c3a326cSBram Moolenaar 685071d4279SBram Moolenaar if (hinstPython) 686071d4279SBram Moolenaar return OK; 687bd5e15fdSBram Moolenaar hinstPython = load_dll(libname); 688071d4279SBram Moolenaar if (!hinstPython) 689071d4279SBram Moolenaar { 690071d4279SBram Moolenaar if (verbose) 691f9e3e09fSBram Moolenaar semsg(_(e_loadlib), libname); 692071d4279SBram Moolenaar return FAIL; 693071d4279SBram Moolenaar } 694071d4279SBram Moolenaar 695071d4279SBram Moolenaar for (i = 0; python_funcname_table[i].ptr; ++i) 696071d4279SBram Moolenaar { 697bd5e15fdSBram Moolenaar if ((*python_funcname_table[i].ptr = symbol_from_dll(hinstPython, 698071d4279SBram Moolenaar python_funcname_table[i].name)) == NULL) 699071d4279SBram Moolenaar { 700bd5e15fdSBram Moolenaar close_dll(hinstPython); 701071d4279SBram Moolenaar hinstPython = 0; 702071d4279SBram Moolenaar if (verbose) 703f9e3e09fSBram Moolenaar semsg(_(e_loadfunc), python_funcname_table[i].name); 704071d4279SBram Moolenaar return FAIL; 705071d4279SBram Moolenaar } 706071d4279SBram Moolenaar } 707cc3e85f1SBram Moolenaar 7082ab2e860SBram Moolenaar // Load unicode functions separately as only the ucs2 or the ucs4 functions 7092ab2e860SBram Moolenaar // will be present in the library. 7107b24ce08SBram Moolenaar *ucs_as_encoded_string = symbol_from_dll(hinstPython, 711cc3e85f1SBram Moolenaar "PyUnicodeUCS2_AsEncodedString"); 7127b24ce08SBram Moolenaar if (*ucs_as_encoded_string == NULL) 7137b24ce08SBram Moolenaar *ucs_as_encoded_string = symbol_from_dll(hinstPython, 714cc3e85f1SBram Moolenaar "PyUnicodeUCS4_AsEncodedString"); 7157b24ce08SBram Moolenaar if (*ucs_as_encoded_string == NULL) 716cc3e85f1SBram Moolenaar { 717cc3e85f1SBram Moolenaar close_dll(hinstPython); 718cc3e85f1SBram Moolenaar hinstPython = 0; 719cc3e85f1SBram Moolenaar if (verbose) 720f9e3e09fSBram Moolenaar semsg(_(e_loadfunc), "PyUnicode_UCSX_*"); 721cc3e85f1SBram Moolenaar return FAIL; 722cc3e85f1SBram Moolenaar } 723cc3e85f1SBram Moolenaar 724071d4279SBram Moolenaar return OK; 725071d4279SBram Moolenaar } 726071d4279SBram Moolenaar 727071d4279SBram Moolenaar /* 728071d4279SBram Moolenaar * If python is enabled (there is installed python on Windows system) return 729071d4279SBram Moolenaar * TRUE, else FALSE. 730071d4279SBram Moolenaar */ 731071d4279SBram Moolenaar int 732e7cb9cf6SBram Moolenaar python_enabled(int verbose) 733071d4279SBram Moolenaar { 73425e4fcdeSBram Moolenaar return python_runtime_link_init((char *)p_pydll, verbose) == OK; 735071d4279SBram Moolenaar } 736071d4279SBram Moolenaar 737ca8a4dfeSBram Moolenaar /* 738ca8a4dfeSBram Moolenaar * Load the standard Python exceptions - don't import the symbols from the 739071d4279SBram Moolenaar * DLL, as this can cause errors (importing data symbols is not reliable). 740071d4279SBram Moolenaar */ 741071d4279SBram Moolenaar static void 742ca8a4dfeSBram Moolenaar get_exceptions(void) 743071d4279SBram Moolenaar { 744071d4279SBram Moolenaar PyObject *exmod = PyImport_ImportModule("exceptions"); 745071d4279SBram Moolenaar PyObject *exdict = PyModule_GetDict(exmod); 746071d4279SBram Moolenaar imp_PyExc_AttributeError = PyDict_GetItemString(exdict, "AttributeError"); 747071d4279SBram Moolenaar imp_PyExc_IndexError = PyDict_GetItemString(exdict, "IndexError"); 748af6abb9dSBram Moolenaar imp_PyExc_KeyError = PyDict_GetItemString(exdict, "KeyError"); 749071d4279SBram Moolenaar imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt"); 750071d4279SBram Moolenaar imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError"); 751071d4279SBram Moolenaar imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError"); 75241009374SBram Moolenaar imp_PyExc_SystemExit = PyDict_GetItemString(exdict, "SystemExit"); 7538661b178SBram Moolenaar imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError"); 754c09a6d6cSBram Moolenaar imp_PyExc_ImportError = PyDict_GetItemString(exdict, "ImportError"); 755141be8a5SBram Moolenaar imp_PyExc_OverflowError = PyDict_GetItemString(exdict, "OverflowError"); 756071d4279SBram Moolenaar Py_XINCREF(imp_PyExc_AttributeError); 757071d4279SBram Moolenaar Py_XINCREF(imp_PyExc_IndexError); 758af6abb9dSBram Moolenaar Py_XINCREF(imp_PyExc_KeyError); 759071d4279SBram Moolenaar Py_XINCREF(imp_PyExc_KeyboardInterrupt); 760071d4279SBram Moolenaar Py_XINCREF(imp_PyExc_TypeError); 761071d4279SBram Moolenaar Py_XINCREF(imp_PyExc_ValueError); 76241009374SBram Moolenaar Py_XINCREF(imp_PyExc_SystemExit); 7638661b178SBram Moolenaar Py_XINCREF(imp_PyExc_RuntimeError); 764c09a6d6cSBram Moolenaar Py_XINCREF(imp_PyExc_ImportError); 765141be8a5SBram Moolenaar Py_XINCREF(imp_PyExc_OverflowError); 766071d4279SBram Moolenaar Py_XDECREF(exmod); 767071d4279SBram Moolenaar } 7682ab2e860SBram Moolenaar #endif // DYNAMIC_PYTHON 769071d4279SBram Moolenaar 770db913953SBram Moolenaar static int initialised = 0; 771db913953SBram Moolenaar #define PYINITIALISED initialised 772c4f83380SBram Moolenaar static int python_end_called = FALSE; 773db913953SBram Moolenaar 7742a0f3d3fSBram Moolenaar #define DESTRUCTOR_FINISH(self) self->ob_type->tp_free((PyObject*)self); 7754d1da49cSBram Moolenaar 776971db467SBram Moolenaar #define WIN_PYTHON_REF(win) win->w_python_ref 777971db467SBram Moolenaar #define BUF_PYTHON_REF(buf) buf->b_python_ref 7785e538ecdSBram Moolenaar #define TAB_PYTHON_REF(tab) tab->tp_python_ref 779971db467SBram Moolenaar 7804d1da49cSBram Moolenaar static PyObject *OutputGetattr(PyObject *, char *); 7814d1da49cSBram Moolenaar static PyObject *BufferGetattr(PyObject *, char *); 7824d1da49cSBram Moolenaar static PyObject *WindowGetattr(PyObject *, char *); 7835e538ecdSBram Moolenaar static PyObject *TabPageGetattr(PyObject *, char *); 7844d1da49cSBram Moolenaar static PyObject *RangeGetattr(PyObject *, char *); 7854d1da49cSBram Moolenaar static PyObject *DictionaryGetattr(PyObject *, char*); 7864d1da49cSBram Moolenaar static PyObject *ListGetattr(PyObject *, char *); 7874d1da49cSBram Moolenaar static PyObject *FunctionGetattr(PyObject *, char *); 7884d1da49cSBram Moolenaar 7892a0f3d3fSBram Moolenaar #ifndef Py_VISIT 7902a0f3d3fSBram Moolenaar # define Py_VISIT(obj) visit(obj, arg) 7912a0f3d3fSBram Moolenaar #endif 7922a0f3d3fSBram Moolenaar #ifndef Py_CLEAR 7932a0f3d3fSBram Moolenaar # define Py_CLEAR(obj) \ 7943e734ea2SBram Moolenaar { \ 7952a0f3d3fSBram Moolenaar Py_XDECREF(obj); \ 7963e734ea2SBram Moolenaar obj = NULL; \ 7973e734ea2SBram Moolenaar } 7982a0f3d3fSBram Moolenaar #endif 7992a0f3d3fSBram Moolenaar 800fdde880bSBram Moolenaar #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) 801fdde880bSBram Moolenaar static void * 802fdde880bSBram Moolenaar py_memsave(void *p, size_t len) 803fdde880bSBram Moolenaar { 804fdde880bSBram Moolenaar void *r; 805fdde880bSBram Moolenaar 806fdde880bSBram Moolenaar if (!(r = PyMem_Malloc(len))) 807fdde880bSBram Moolenaar return NULL; 808fdde880bSBram Moolenaar mch_memmove(r, p, len); 809fdde880bSBram Moolenaar return r; 810fdde880bSBram Moolenaar } 811fdde880bSBram Moolenaar 812fdde880bSBram Moolenaar # define PY_STRSAVE(s) ((char_u *) py_memsave(s, STRLEN(s) + 1)) 813fdde880bSBram Moolenaar #endif 814fdde880bSBram Moolenaar 815922a4664SBram Moolenaar typedef PySliceObject PySliceObject_T; 816922a4664SBram Moolenaar 817170bf1aeSBram Moolenaar /* 818170bf1aeSBram Moolenaar * Include the code shared with if_python3.c 819170bf1aeSBram Moolenaar */ 820170bf1aeSBram Moolenaar #include "if_py_both.h" 821170bf1aeSBram Moolenaar 822170bf1aeSBram Moolenaar 8232ab2e860SBram Moolenaar /////////////////////////////////////////////////////// 8242ab2e860SBram Moolenaar // Internal function prototypes. 825071d4279SBram Moolenaar 826071d4279SBram Moolenaar static int PythonMod_Init(void); 827071d4279SBram Moolenaar 828071d4279SBram Moolenaar 8292ab2e860SBram Moolenaar /////////////////////////////////////////////////////// 8302ab2e860SBram Moolenaar // 1. Python interpreter main program. 831071d4279SBram Moolenaar 8322ab2e860SBram Moolenaar #if PYTHON_API_VERSION < 1007 // Python 1.4 833071d4279SBram Moolenaar typedef PyObject PyThreadState; 8349ba0eb85SBram Moolenaar #endif 835071d4279SBram Moolenaar 83671700b89SBram Moolenaar #ifndef PY_CAN_RECURSE 837071d4279SBram Moolenaar static PyThreadState *saved_python_thread = NULL; 838071d4279SBram Moolenaar 839071d4279SBram Moolenaar /* 840071d4279SBram Moolenaar * Suspend a thread of the Python interpreter, other threads are allowed to 841071d4279SBram Moolenaar * run. 842071d4279SBram Moolenaar */ 843293ee4d4SBram Moolenaar static void 844293ee4d4SBram Moolenaar Python_SaveThread(void) 845071d4279SBram Moolenaar { 846071d4279SBram Moolenaar saved_python_thread = PyEval_SaveThread(); 847071d4279SBram Moolenaar } 848071d4279SBram Moolenaar 849071d4279SBram Moolenaar /* 850071d4279SBram Moolenaar * Restore a thread of the Python interpreter, waits for other threads to 851071d4279SBram Moolenaar * block. 852071d4279SBram Moolenaar */ 853293ee4d4SBram Moolenaar static void 854293ee4d4SBram Moolenaar Python_RestoreThread(void) 855071d4279SBram Moolenaar { 856071d4279SBram Moolenaar PyEval_RestoreThread(saved_python_thread); 857071d4279SBram Moolenaar saved_python_thread = NULL; 8589ba0eb85SBram Moolenaar } 85971700b89SBram Moolenaar #endif 860071d4279SBram Moolenaar 861071d4279SBram Moolenaar void 86268c2f638SBram Moolenaar python_end(void) 863071d4279SBram Moolenaar { 864a5792f58SBram Moolenaar static int recurse = 0; 865a5792f58SBram Moolenaar 8662ab2e860SBram Moolenaar // If a crash occurs while doing this, don't try again. 867a5792f58SBram Moolenaar if (recurse != 0) 868a5792f58SBram Moolenaar return; 869a5792f58SBram Moolenaar 870c4f83380SBram Moolenaar python_end_called = TRUE; 871a5792f58SBram Moolenaar ++recurse; 872a5792f58SBram Moolenaar 873071d4279SBram Moolenaar #ifdef DYNAMIC_PYTHON 8740e21a3f6SBram Moolenaar if (hinstPython && Py_IsInitialized()) 8759ba0eb85SBram Moolenaar { 87671700b89SBram Moolenaar # ifdef PY_CAN_RECURSE 87771700b89SBram Moolenaar PyGILState_Ensure(); 87871700b89SBram Moolenaar # else 8792ab2e860SBram Moolenaar Python_RestoreThread(); // enter python 88071700b89SBram Moolenaar # endif 8810e21a3f6SBram Moolenaar Py_Finalize(); 8829ba0eb85SBram Moolenaar } 8830e21a3f6SBram Moolenaar #else 8840e21a3f6SBram Moolenaar if (Py_IsInitialized()) 8859ba0eb85SBram Moolenaar { 88671700b89SBram Moolenaar # ifdef PY_CAN_RECURSE 88771700b89SBram Moolenaar PyGILState_Ensure(); 88871700b89SBram Moolenaar # else 8892ab2e860SBram Moolenaar Python_RestoreThread(); // enter python 89071700b89SBram Moolenaar # endif 8910e21a3f6SBram Moolenaar Py_Finalize(); 8929ba0eb85SBram Moolenaar } 893071d4279SBram Moolenaar #endif 894a5792f58SBram Moolenaar 895a5792f58SBram Moolenaar --recurse; 896071d4279SBram Moolenaar } 897071d4279SBram Moolenaar 8984c3a326cSBram Moolenaar #if (defined(DYNAMIC_PYTHON) && defined(FEAT_PYTHON3)) || defined(PROTO) 8994c3a326cSBram Moolenaar int 90068c2f638SBram Moolenaar python_loaded(void) 9014c3a326cSBram Moolenaar { 9024c3a326cSBram Moolenaar return (hinstPython != 0); 9034c3a326cSBram Moolenaar } 9044c3a326cSBram Moolenaar #endif 9054c3a326cSBram Moolenaar 90694073167SBram Moolenaar static char *py_home_buf = NULL; 90794073167SBram Moolenaar 908071d4279SBram Moolenaar static int 909071d4279SBram Moolenaar Python_Init(void) 910071d4279SBram Moolenaar { 911071d4279SBram Moolenaar if (!initialised) 912071d4279SBram Moolenaar { 91312a28d4bSBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 91412a28d4bSBram Moolenaar PyObject *site; 91512a28d4bSBram Moolenaar #endif 91612a28d4bSBram Moolenaar 917071d4279SBram Moolenaar #ifdef DYNAMIC_PYTHON 918071d4279SBram Moolenaar if (!python_enabled(TRUE)) 919071d4279SBram Moolenaar { 920f9e3e09fSBram Moolenaar emsg(_("E263: Sorry, this command is disabled, the Python library could not be loaded.")); 921071d4279SBram Moolenaar goto fail; 922071d4279SBram Moolenaar } 923071d4279SBram Moolenaar #endif 924071d4279SBram Moolenaar 92594073167SBram Moolenaar if (*p_pyhome != NUL) 92694073167SBram Moolenaar { 9272ab2e860SBram Moolenaar // The string must not change later, make a copy in static memory. 92894073167SBram Moolenaar py_home_buf = (char *)vim_strsave(p_pyhome); 92994073167SBram Moolenaar if (py_home_buf != NULL) 93094073167SBram Moolenaar Py_SetPythonHome(py_home_buf); 93194073167SBram Moolenaar } 932644d37b8SBram Moolenaar #ifdef PYTHON_HOME 93394073167SBram Moolenaar else if (mch_getenv((char_u *)"PYTHONHOME") == NULL) 934644d37b8SBram Moolenaar Py_SetPythonHome(PYTHON_HOME); 935644d37b8SBram Moolenaar #endif 936644d37b8SBram Moolenaar 937170bf1aeSBram Moolenaar init_structs(); 938170bf1aeSBram Moolenaar 93912a28d4bSBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 9402ab2e860SBram Moolenaar // Disable implicit 'import site', because it may cause Vim to exit 9412ab2e860SBram Moolenaar // when it can't be found. 94212a28d4bSBram Moolenaar Py_NoSiteFlag++; 94312a28d4bSBram Moolenaar #endif 94412a28d4bSBram Moolenaar 945071d4279SBram Moolenaar Py_Initialize(); 94612a28d4bSBram Moolenaar 94712a28d4bSBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 9482ab2e860SBram Moolenaar // 'import site' explicitly. 94912a28d4bSBram Moolenaar site = PyImport_ImportModule("site"); 95012a28d4bSBram Moolenaar if (site == NULL) 95112a28d4bSBram Moolenaar { 952f9e3e09fSBram Moolenaar emsg(_("E887: Sorry, this command is disabled, the Python's site module could not be loaded.")); 95312a28d4bSBram Moolenaar goto fail; 95412a28d4bSBram Moolenaar } 95512a28d4bSBram Moolenaar Py_DECREF(site); 95612a28d4bSBram Moolenaar #endif 95712a28d4bSBram Moolenaar 9582ab2e860SBram Moolenaar // Initialise threads, and below save the state using 9592ab2e860SBram Moolenaar // PyEval_SaveThread. Without the call to PyEval_SaveThread, thread 9602ab2e860SBram Moolenaar // specific state (such as the system trace hook), will be lost 9612ab2e860SBram Moolenaar // between invocations of Python code. 962071d4279SBram Moolenaar PyEval_InitThreads(); 963071d4279SBram Moolenaar #ifdef DYNAMIC_PYTHON 964071d4279SBram Moolenaar get_exceptions(); 965071d4279SBram Moolenaar #endif 966071d4279SBram Moolenaar 9671dc28783SBram Moolenaar if (PythonIO_Init_io()) 968071d4279SBram Moolenaar goto fail; 969071d4279SBram Moolenaar 970071d4279SBram Moolenaar if (PythonMod_Init()) 971071d4279SBram Moolenaar goto fail; 972071d4279SBram Moolenaar 973db913953SBram Moolenaar globals = PyModule_GetDict(PyImport_AddModule("__main__")); 974db913953SBram Moolenaar 9752ab2e860SBram Moolenaar // Remove the element from sys.path that was added because of our 9762ab2e860SBram Moolenaar // argv[0] value in PythonMod_Init(). Previously we used an empty 9772ab2e860SBram Moolenaar // string, but depending on the OS we then get an empty entry or 9782ab2e860SBram Moolenaar // the current directory in sys.path. 9799774ecc8SBram Moolenaar PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)"); 9809774ecc8SBram Moolenaar 9812ab2e860SBram Moolenaar // lock is created and acquired in PyEval_InitThreads() and thread 9822ab2e860SBram Moolenaar // state is created in Py_Initialize() 9832ab2e860SBram Moolenaar // there _PyGILState_NoteThreadState() also sets gilcounter to 1 9842ab2e860SBram Moolenaar // (python must have threads enabled!) 9852ab2e860SBram Moolenaar // so the following does both: unlock GIL and save thread state in TLS 9862ab2e860SBram Moolenaar // without deleting thread state 98703db85b3SBram Moolenaar #ifndef PY_CAN_RECURSE 98803db85b3SBram Moolenaar saved_python_thread = 98903db85b3SBram Moolenaar #endif 99076d711c3SBram Moolenaar PyEval_SaveThread(); 991071d4279SBram Moolenaar 992071d4279SBram Moolenaar initialised = 1; 993071d4279SBram Moolenaar } 994071d4279SBram Moolenaar 995071d4279SBram Moolenaar return 0; 996071d4279SBram Moolenaar 997071d4279SBram Moolenaar fail: 9982ab2e860SBram Moolenaar // We call PythonIO_Flush() here to print any Python errors. 9992ab2e860SBram Moolenaar // This is OK, as it is possible to call this function even 10002ab2e860SBram Moolenaar // if PythonIO_Init_io() has not completed successfully (it will 10012ab2e860SBram Moolenaar // not do anything in this case). 1002071d4279SBram Moolenaar PythonIO_Flush(); 1003071d4279SBram Moolenaar return -1; 1004071d4279SBram Moolenaar } 1005071d4279SBram Moolenaar 1006071d4279SBram Moolenaar /* 1007071d4279SBram Moolenaar * External interface 1008071d4279SBram Moolenaar */ 1009071d4279SBram Moolenaar static void 1010b52f4c02SBram Moolenaar DoPyCommand(const char *cmd, rangeinitializer init_range, runner run, void *arg) 1011071d4279SBram Moolenaar { 10129ba0eb85SBram Moolenaar #ifndef PY_CAN_RECURSE 1013071d4279SBram Moolenaar static int recursive = 0; 1014071d4279SBram Moolenaar #endif 1015071d4279SBram Moolenaar #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) 1016071d4279SBram Moolenaar char *saved_locale; 1017071d4279SBram Moolenaar #endif 101871700b89SBram Moolenaar #ifdef PY_CAN_RECURSE 101971700b89SBram Moolenaar PyGILState_STATE pygilstate; 102071700b89SBram Moolenaar #endif 1021071d4279SBram Moolenaar 1022071d4279SBram Moolenaar #ifndef PY_CAN_RECURSE 1023071d4279SBram Moolenaar if (recursive) 1024071d4279SBram Moolenaar { 1025f9e3e09fSBram Moolenaar emsg(_("E659: Cannot invoke Python recursively")); 1026071d4279SBram Moolenaar return; 1027071d4279SBram Moolenaar } 1028071d4279SBram Moolenaar ++recursive; 1029071d4279SBram Moolenaar #endif 1030c4f83380SBram Moolenaar if (python_end_called) 1031c4f83380SBram Moolenaar return; 1032071d4279SBram Moolenaar 1033071d4279SBram Moolenaar if (Python_Init()) 1034071d4279SBram Moolenaar goto theend; 1035071d4279SBram Moolenaar 1036b52f4c02SBram Moolenaar init_range(arg); 1037b52f4c02SBram Moolenaar 10382ab2e860SBram Moolenaar Python_Release_Vim(); // leave Vim 1039071d4279SBram Moolenaar 1040071d4279SBram Moolenaar #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) 10412ab2e860SBram Moolenaar // Python only works properly when the LC_NUMERIC locale is "C". 1042071d4279SBram Moolenaar saved_locale = setlocale(LC_NUMERIC, NULL); 1043071d4279SBram Moolenaar if (saved_locale == NULL || STRCMP(saved_locale, "C") == 0) 1044071d4279SBram Moolenaar saved_locale = NULL; 1045071d4279SBram Moolenaar else 1046071d4279SBram Moolenaar { 10472ab2e860SBram Moolenaar // Need to make a copy, value may change when setting new locale. 1048e9ba516bSBram Moolenaar saved_locale = (char *) PY_STRSAVE(saved_locale); 1049071d4279SBram Moolenaar (void)setlocale(LC_NUMERIC, "C"); 1050071d4279SBram Moolenaar } 1051071d4279SBram Moolenaar #endif 1052071d4279SBram Moolenaar 105371700b89SBram Moolenaar #ifdef PY_CAN_RECURSE 105471700b89SBram Moolenaar pygilstate = PyGILState_Ensure(); 105571700b89SBram Moolenaar #else 10562ab2e860SBram Moolenaar Python_RestoreThread(); // enter python 105771700b89SBram Moolenaar #endif 1058071d4279SBram Moolenaar 10592a0f3d3fSBram Moolenaar run((char *) cmd, arg 10602a0f3d3fSBram Moolenaar #ifdef PY_CAN_RECURSE 10612a0f3d3fSBram Moolenaar , &pygilstate 10622a0f3d3fSBram Moolenaar #endif 10632a0f3d3fSBram Moolenaar ); 1064071d4279SBram Moolenaar 106571700b89SBram Moolenaar #ifdef PY_CAN_RECURSE 106671700b89SBram Moolenaar PyGILState_Release(pygilstate); 106771700b89SBram Moolenaar #else 10682ab2e860SBram Moolenaar Python_SaveThread(); // leave python 106971700b89SBram Moolenaar #endif 1070071d4279SBram Moolenaar 1071071d4279SBram Moolenaar #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) 1072071d4279SBram Moolenaar if (saved_locale != NULL) 1073071d4279SBram Moolenaar { 1074071d4279SBram Moolenaar (void)setlocale(LC_NUMERIC, saved_locale); 1075e9ba516bSBram Moolenaar PyMem_Free(saved_locale); 1076071d4279SBram Moolenaar } 1077071d4279SBram Moolenaar #endif 1078071d4279SBram Moolenaar 10792ab2e860SBram Moolenaar Python_Lock_Vim(); // enter vim 1080071d4279SBram Moolenaar PythonIO_Flush(); 1081071d4279SBram Moolenaar 1082071d4279SBram Moolenaar theend: 1083071d4279SBram Moolenaar #ifndef PY_CAN_RECURSE 1084071d4279SBram Moolenaar --recursive; 1085071d4279SBram Moolenaar #endif 1086db913953SBram Moolenaar return; 1087071d4279SBram Moolenaar } 1088071d4279SBram Moolenaar 1089071d4279SBram Moolenaar /* 1090071d4279SBram Moolenaar * ":python" 1091071d4279SBram Moolenaar */ 1092071d4279SBram Moolenaar void 1093071d4279SBram Moolenaar ex_python(exarg_T *eap) 1094071d4279SBram Moolenaar { 1095071d4279SBram Moolenaar char_u *script; 1096071d4279SBram Moolenaar 1097071d4279SBram Moolenaar script = script_get(eap, eap->arg); 1098071d4279SBram Moolenaar if (!eap->skip) 1099071d4279SBram Moolenaar { 110014816ad6SBram Moolenaar if (p_pyx == 0) 110114816ad6SBram Moolenaar p_pyx = 2; 110214816ad6SBram Moolenaar 1103b52f4c02SBram Moolenaar DoPyCommand(script == NULL ? (char *) eap->arg : (char *) script, 1104b52f4c02SBram Moolenaar (rangeinitializer) init_range_cmd, 1105b52f4c02SBram Moolenaar (runner) run_cmd, 1106b52f4c02SBram Moolenaar (void *) eap); 1107071d4279SBram Moolenaar } 1108071d4279SBram Moolenaar vim_free(script); 1109071d4279SBram Moolenaar } 1110071d4279SBram Moolenaar 1111071d4279SBram Moolenaar #define BUFFER_SIZE 1024 1112071d4279SBram Moolenaar 1113071d4279SBram Moolenaar /* 1114071d4279SBram Moolenaar * ":pyfile" 1115071d4279SBram Moolenaar */ 1116071d4279SBram Moolenaar void 1117071d4279SBram Moolenaar ex_pyfile(exarg_T *eap) 1118071d4279SBram Moolenaar { 1119071d4279SBram Moolenaar static char buffer[BUFFER_SIZE]; 1120071d4279SBram Moolenaar const char *file = (char *)eap->arg; 1121071d4279SBram Moolenaar char *p; 1122071d4279SBram Moolenaar 1123f42dd3c3SBram Moolenaar if (p_pyx == 0) 1124f42dd3c3SBram Moolenaar p_pyx = 2; 1125f42dd3c3SBram Moolenaar 11262ab2e860SBram Moolenaar // Have to do it like this. PyRun_SimpleFile requires you to pass a 11272ab2e860SBram Moolenaar // stdio file pointer, but Vim and the Python DLL are compiled with 11282ab2e860SBram Moolenaar // different options under Windows, meaning that stdio pointers aren't 11292ab2e860SBram Moolenaar // compatible between the two. Yuk. 11302ab2e860SBram Moolenaar // 11312ab2e860SBram Moolenaar // Put the string "execfile('file')" into buffer. But, we need to 11322ab2e860SBram Moolenaar // escape any backslashes or single quotes in the file name, so that 11332ab2e860SBram Moolenaar // Python won't mangle the file name. 1134071d4279SBram Moolenaar strcpy(buffer, "execfile('"); 11352ab2e860SBram Moolenaar p = buffer + 10; // size of "execfile('" 1136071d4279SBram Moolenaar 1137071d4279SBram Moolenaar while (*file && p < buffer + (BUFFER_SIZE - 3)) 1138071d4279SBram Moolenaar { 1139071d4279SBram Moolenaar if (*file == '\\' || *file == '\'') 1140071d4279SBram Moolenaar *p++ = '\\'; 1141071d4279SBram Moolenaar *p++ = *file++; 1142071d4279SBram Moolenaar } 1143071d4279SBram Moolenaar 11442ab2e860SBram Moolenaar // If we didn't finish the file name, we hit a buffer overflow 1145071d4279SBram Moolenaar if (*file != '\0') 1146071d4279SBram Moolenaar return; 1147071d4279SBram Moolenaar 11482ab2e860SBram Moolenaar // Put in the terminating "')" and a null 1149071d4279SBram Moolenaar *p++ = '\''; 1150071d4279SBram Moolenaar *p++ = ')'; 1151071d4279SBram Moolenaar *p++ = '\0'; 1152071d4279SBram Moolenaar 11532ab2e860SBram Moolenaar // Execute the file 1154b52f4c02SBram Moolenaar DoPyCommand(buffer, 1155b52f4c02SBram Moolenaar (rangeinitializer) init_range_cmd, 1156b52f4c02SBram Moolenaar (runner) run_cmd, 1157b52f4c02SBram Moolenaar (void *) eap); 1158071d4279SBram Moolenaar } 1159071d4279SBram Moolenaar 1160d620aa9bSBram Moolenaar void 1161d620aa9bSBram Moolenaar ex_pydo(exarg_T *eap) 1162d620aa9bSBram Moolenaar { 1163f42dd3c3SBram Moolenaar if (p_pyx == 0) 1164f42dd3c3SBram Moolenaar p_pyx = 2; 1165f42dd3c3SBram Moolenaar 1166b52f4c02SBram Moolenaar DoPyCommand((char *)eap->arg, 1167b52f4c02SBram Moolenaar (rangeinitializer) init_range_cmd, 1168b52f4c02SBram Moolenaar (runner)run_do, 1169b52f4c02SBram Moolenaar (void *)eap); 1170d620aa9bSBram Moolenaar } 1171d620aa9bSBram Moolenaar 11722ab2e860SBram Moolenaar /////////////////////////////////////////////////////// 11732ab2e860SBram Moolenaar // 2. Python output stream: writes output via [e]msg(). 1174071d4279SBram Moolenaar 11752ab2e860SBram Moolenaar // Implementation functions 1176071d4279SBram Moolenaar 1177071d4279SBram Moolenaar static PyObject * 1178071d4279SBram Moolenaar OutputGetattr(PyObject *self, char *name) 1179071d4279SBram Moolenaar { 1180071d4279SBram Moolenaar if (strcmp(name, "softspace") == 0) 1181071d4279SBram Moolenaar return PyInt_FromLong(((OutputObject *)(self))->softspace); 1182dd8aca66SBram Moolenaar else if (strcmp(name, "__members__") == 0) 1183dd8aca66SBram Moolenaar return ObjectDir(NULL, OutputAttrs); 11846d4431e7SBram Moolenaar else if (strcmp(name, "errors") == 0) 11856d4431e7SBram Moolenaar return PyString_FromString("strict"); 11866d4431e7SBram Moolenaar else if (strcmp(name, "encoding") == 0) 11876d4431e7SBram Moolenaar return PyString_FromString(ENC_OPT); 1188071d4279SBram Moolenaar return Py_FindMethod(OutputMethods, self, name); 1189071d4279SBram Moolenaar } 1190071d4279SBram Moolenaar 11912ab2e860SBram Moolenaar /////////////////////////////////////////////////////// 11922ab2e860SBram Moolenaar // 3. Implementation of the Vim module for Python 1193071d4279SBram Moolenaar 11942ab2e860SBram Moolenaar // Window type - Implementation functions 11952ab2e860SBram Moolenaar // -------------------------------------- 1196071d4279SBram Moolenaar 1197071d4279SBram Moolenaar #define WindowType_Check(obj) ((obj)->ob_type == &WindowType) 1198071d4279SBram Moolenaar 11992ab2e860SBram Moolenaar // Buffer type - Implementation functions 12002ab2e860SBram Moolenaar // -------------------------------------- 1201071d4279SBram Moolenaar 1202071d4279SBram Moolenaar #define BufferType_Check(obj) ((obj)->ob_type == &BufferType) 1203071d4279SBram Moolenaar 12044ce5fe4cSBram Moolenaar static int BufferAssItem(PyObject *, PyInt, PyObject *); 12054ce5fe4cSBram Moolenaar static int BufferAssSlice(PyObject *, PyInt, PyInt, PyObject *); 1206071d4279SBram Moolenaar 12072ab2e860SBram Moolenaar // Line range type - Implementation functions 12082ab2e860SBram Moolenaar // -------------------------------------- 1209071d4279SBram Moolenaar 1210071d4279SBram Moolenaar #define RangeType_Check(obj) ((obj)->ob_type == &RangeType) 1211071d4279SBram Moolenaar 12124ce5fe4cSBram Moolenaar static int RangeAssItem(PyObject *, PyInt, PyObject *); 12134ce5fe4cSBram Moolenaar static int RangeAssSlice(PyObject *, PyInt, PyInt, PyObject *); 1214071d4279SBram Moolenaar 12152ab2e860SBram Moolenaar // Current objects type - Implementation functions 12162ab2e860SBram Moolenaar // ----------------------------------------------- 1217071d4279SBram Moolenaar 1218071d4279SBram Moolenaar static PySequenceMethods BufferAsSeq = { 12192ab2e860SBram Moolenaar (PyInquiry) BufferLength, // sq_length, len(x) 12202ab2e860SBram Moolenaar (binaryfunc) 0, // BufferConcat, sq_concat, x+y 12212ab2e860SBram Moolenaar (PyIntArgFunc) 0, // BufferRepeat, sq_repeat, x*n 12222ab2e860SBram Moolenaar (PyIntArgFunc) BufferItem, // sq_item, x[i] 12232ab2e860SBram Moolenaar (PyIntIntArgFunc) BufferSlice, // sq_slice, x[i:j] 12242ab2e860SBram Moolenaar (PyIntObjArgProc) BufferAssItem, // sq_ass_item, x[i]=v 12252ab2e860SBram Moolenaar (PyIntIntObjArgProc) BufferAssSlice, // sq_ass_slice, x[i:j]=v 12264d1da49cSBram Moolenaar (objobjproc) 0, 12274d1da49cSBram Moolenaar (binaryfunc) 0, 1228071d4279SBram Moolenaar 0, 1229071d4279SBram Moolenaar }; 1230071d4279SBram Moolenaar 12312ab2e860SBram Moolenaar // Buffer object - Implementation 1232071d4279SBram Moolenaar 1233071d4279SBram Moolenaar static PyObject * 1234071d4279SBram Moolenaar BufferGetattr(PyObject *self, char *name) 1235071d4279SBram Moolenaar { 12364d1da49cSBram Moolenaar PyObject *r; 1237071d4279SBram Moolenaar 12389e822c00SBram Moolenaar if ((r = BufferAttrValid((BufferObject *)(self), name))) 12399e822c00SBram Moolenaar return r; 12409e822c00SBram Moolenaar 12414d1da49cSBram Moolenaar if (CheckBuffer((BufferObject *)(self))) 1242071d4279SBram Moolenaar return NULL; 1243071d4279SBram Moolenaar 12444d1da49cSBram Moolenaar r = BufferAttr((BufferObject *)(self), name); 12454d1da49cSBram Moolenaar if (r || PyErr_Occurred()) 12464d1da49cSBram Moolenaar return r; 1247071d4279SBram Moolenaar else 1248071d4279SBram Moolenaar return Py_FindMethod(BufferMethods, self, name); 1249071d4279SBram Moolenaar } 1250071d4279SBram Moolenaar 12512ab2e860SBram Moolenaar ////////////////// 1252071d4279SBram Moolenaar 12534ce5fe4cSBram Moolenaar static int 12542c45e945SBram Moolenaar BufferAssItem(PyObject *self, PyInt n, PyObject *val) 1255071d4279SBram Moolenaar { 12568f1723deSBram Moolenaar return RBAsItem((BufferObject *)(self), n, val, 1, -1, NULL); 1257071d4279SBram Moolenaar } 1258071d4279SBram Moolenaar 12594ce5fe4cSBram Moolenaar static int 12602c45e945SBram Moolenaar BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val) 1261071d4279SBram Moolenaar { 12628f1723deSBram Moolenaar return RBAsSlice((BufferObject *)(self), lo, hi, val, 1, -1, NULL); 1263071d4279SBram Moolenaar } 1264071d4279SBram Moolenaar 1265071d4279SBram Moolenaar static PySequenceMethods RangeAsSeq = { 12662ab2e860SBram Moolenaar (PyInquiry) RangeLength, // sq_length, len(x) 12672ab2e860SBram Moolenaar (binaryfunc) 0, /* RangeConcat, */ // sq_concat, x+y 12682ab2e860SBram Moolenaar (PyIntArgFunc) 0, /* RangeRepeat, */ // sq_repeat, x*n 12692ab2e860SBram Moolenaar (PyIntArgFunc) RangeItem, // sq_item, x[i] 12702ab2e860SBram Moolenaar (PyIntIntArgFunc) RangeSlice, // sq_slice, x[i:j] 12712ab2e860SBram Moolenaar (PyIntObjArgProc) RangeAssItem, // sq_ass_item, x[i]=v 12722ab2e860SBram Moolenaar (PyIntIntObjArgProc) RangeAssSlice, // sq_ass_slice, x[i:j]=v 12734d1da49cSBram Moolenaar (objobjproc) 0, 12744d1da49cSBram Moolenaar #if PY_MAJOR_VERSION >= 2 12754d1da49cSBram Moolenaar (binaryfunc) 0, 12764d1da49cSBram Moolenaar 0, 12774d1da49cSBram Moolenaar #endif 1278071d4279SBram Moolenaar }; 1279071d4279SBram Moolenaar 12802ab2e860SBram Moolenaar // Line range object - Implementation 1281071d4279SBram Moolenaar 1282071d4279SBram Moolenaar static PyObject * 1283071d4279SBram Moolenaar RangeGetattr(PyObject *self, char *name) 1284071d4279SBram Moolenaar { 1285071d4279SBram Moolenaar if (strcmp(name, "start") == 0) 1286e7cb9cf6SBram Moolenaar return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->start - 1); 1287071d4279SBram Moolenaar else if (strcmp(name, "end") == 0) 1288e7cb9cf6SBram Moolenaar return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->end - 1); 1289dd8aca66SBram Moolenaar else if (strcmp(name, "__members__") == 0) 1290dd8aca66SBram Moolenaar return ObjectDir(NULL, RangeAttrs); 1291071d4279SBram Moolenaar else 1292071d4279SBram Moolenaar return Py_FindMethod(RangeMethods, self, name); 1293071d4279SBram Moolenaar } 1294071d4279SBram Moolenaar 12952ab2e860SBram Moolenaar //////////////// 1296071d4279SBram Moolenaar 12974ce5fe4cSBram Moolenaar static int 12982c45e945SBram Moolenaar RangeAssItem(PyObject *self, PyInt n, PyObject *val) 1299071d4279SBram Moolenaar { 1300ca8a4dfeSBram Moolenaar return RBAsItem(((RangeObject *)(self))->buf, n, val, 1301071d4279SBram Moolenaar ((RangeObject *)(self))->start, 1302071d4279SBram Moolenaar ((RangeObject *)(self))->end, 1303071d4279SBram Moolenaar &((RangeObject *)(self))->end); 1304071d4279SBram Moolenaar } 1305071d4279SBram Moolenaar 13064ce5fe4cSBram Moolenaar static int 13072c45e945SBram Moolenaar RangeAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val) 1308071d4279SBram Moolenaar { 130919e60943SBram Moolenaar return RBAsSlice(((RangeObject *)(self))->buf, lo, hi, val, 1310071d4279SBram Moolenaar ((RangeObject *)(self))->start, 1311071d4279SBram Moolenaar ((RangeObject *)(self))->end, 1312071d4279SBram Moolenaar &((RangeObject *)(self))->end); 1313071d4279SBram Moolenaar } 1314071d4279SBram Moolenaar 13152ab2e860SBram Moolenaar // TabPage object - Implementation 13165e538ecdSBram Moolenaar 13175e538ecdSBram Moolenaar static PyObject * 13185e538ecdSBram Moolenaar TabPageGetattr(PyObject *self, char *name) 13195e538ecdSBram Moolenaar { 13205e538ecdSBram Moolenaar PyObject *r; 13215e538ecdSBram Moolenaar 13229e822c00SBram Moolenaar if ((r = TabPageAttrValid((TabPageObject *)(self), name))) 13239e822c00SBram Moolenaar return r; 13249e822c00SBram Moolenaar 13255e538ecdSBram Moolenaar if (CheckTabPage((TabPageObject *)(self))) 13265e538ecdSBram Moolenaar return NULL; 13275e538ecdSBram Moolenaar 13285e538ecdSBram Moolenaar r = TabPageAttr((TabPageObject *)(self), name); 13295e538ecdSBram Moolenaar if (r || PyErr_Occurred()) 13305e538ecdSBram Moolenaar return r; 13315e538ecdSBram Moolenaar else 13325e538ecdSBram Moolenaar return Py_FindMethod(TabPageMethods, self, name); 13335e538ecdSBram Moolenaar } 13345e538ecdSBram Moolenaar 13352ab2e860SBram Moolenaar // Window object - Implementation 1336071d4279SBram Moolenaar 1337071d4279SBram Moolenaar static PyObject * 1338071d4279SBram Moolenaar WindowGetattr(PyObject *self, char *name) 1339071d4279SBram Moolenaar { 13404d1da49cSBram Moolenaar PyObject *r; 1341071d4279SBram Moolenaar 13429e822c00SBram Moolenaar if ((r = WindowAttrValid((WindowObject *)(self), name))) 13439e822c00SBram Moolenaar return r; 13449e822c00SBram Moolenaar 13454d1da49cSBram Moolenaar if (CheckWindow((WindowObject *)(self))) 1346071d4279SBram Moolenaar return NULL; 1347071d4279SBram Moolenaar 13484d1da49cSBram Moolenaar r = WindowAttr((WindowObject *)(self), name); 13494d1da49cSBram Moolenaar if (r || PyErr_Occurred()) 13504d1da49cSBram Moolenaar return r; 1351071d4279SBram Moolenaar else 1352071d4279SBram Moolenaar return Py_FindMethod(WindowMethods, self, name); 1353071d4279SBram Moolenaar } 1354071d4279SBram Moolenaar 13552ab2e860SBram Moolenaar // Tab page list object - Definitions 13565e538ecdSBram Moolenaar 13575e538ecdSBram Moolenaar static PySequenceMethods TabListAsSeq = { 13582ab2e860SBram Moolenaar (PyInquiry) TabListLength, // sq_length, len(x) 13592ab2e860SBram Moolenaar (binaryfunc) 0, // sq_concat, x+y 13602ab2e860SBram Moolenaar (PyIntArgFunc) 0, // sq_repeat, x*n 13612ab2e860SBram Moolenaar (PyIntArgFunc) TabListItem, // sq_item, x[i] 13622ab2e860SBram Moolenaar (PyIntIntArgFunc) 0, // sq_slice, x[i:j] 13632ab2e860SBram Moolenaar (PyIntObjArgProc) 0, // sq_ass_item, x[i]=v 13642ab2e860SBram Moolenaar (PyIntIntObjArgProc) 0, // sq_ass_slice, x[i:j]=v 13655e538ecdSBram Moolenaar (objobjproc) 0, 13665e538ecdSBram Moolenaar #if PY_MAJOR_VERSION >= 2 13675e538ecdSBram Moolenaar (binaryfunc) 0, 13685e538ecdSBram Moolenaar 0, 13695e538ecdSBram Moolenaar #endif 13705e538ecdSBram Moolenaar }; 13715e538ecdSBram Moolenaar 13722ab2e860SBram Moolenaar // Window list object - Definitions 1373071d4279SBram Moolenaar 1374071d4279SBram Moolenaar static PySequenceMethods WinListAsSeq = { 13752ab2e860SBram Moolenaar (PyInquiry) WinListLength, // sq_length, len(x) 13762ab2e860SBram Moolenaar (binaryfunc) 0, // sq_concat, x+y 13772ab2e860SBram Moolenaar (PyIntArgFunc) 0, // sq_repeat, x*n 13782ab2e860SBram Moolenaar (PyIntArgFunc) WinListItem, // sq_item, x[i] 13792ab2e860SBram Moolenaar (PyIntIntArgFunc) 0, // sq_slice, x[i:j] 13802ab2e860SBram Moolenaar (PyIntObjArgProc) 0, // sq_ass_item, x[i]=v 13812ab2e860SBram Moolenaar (PyIntIntObjArgProc) 0, // sq_ass_slice, x[i:j]=v 13824d1da49cSBram Moolenaar (objobjproc) 0, 13834d1da49cSBram Moolenaar #if PY_MAJOR_VERSION >= 2 13844d1da49cSBram Moolenaar (binaryfunc) 0, 13854d1da49cSBram Moolenaar 0, 13864d1da49cSBram Moolenaar #endif 1387071d4279SBram Moolenaar }; 1388071d4279SBram Moolenaar 13892ab2e860SBram Moolenaar // External interface 1390071d4279SBram Moolenaar 1391071d4279SBram Moolenaar void 1392071d4279SBram Moolenaar python_buffer_free(buf_T *buf) 1393071d4279SBram Moolenaar { 1394971db467SBram Moolenaar if (BUF_PYTHON_REF(buf) != NULL) 1395071d4279SBram Moolenaar { 1396971db467SBram Moolenaar BufferObject *bp = BUF_PYTHON_REF(buf); 1397071d4279SBram Moolenaar bp->buf = INVALID_BUFFER_VALUE; 1398971db467SBram Moolenaar BUF_PYTHON_REF(buf) = NULL; 1399071d4279SBram Moolenaar } 1400071d4279SBram Moolenaar } 1401071d4279SBram Moolenaar 1402071d4279SBram Moolenaar void 1403071d4279SBram Moolenaar python_window_free(win_T *win) 1404071d4279SBram Moolenaar { 1405971db467SBram Moolenaar if (WIN_PYTHON_REF(win) != NULL) 1406071d4279SBram Moolenaar { 1407971db467SBram Moolenaar WindowObject *wp = WIN_PYTHON_REF(win); 1408071d4279SBram Moolenaar wp->win = INVALID_WINDOW_VALUE; 1409971db467SBram Moolenaar WIN_PYTHON_REF(win) = NULL; 1410071d4279SBram Moolenaar } 1411071d4279SBram Moolenaar } 14125e538ecdSBram Moolenaar 14135e538ecdSBram Moolenaar void 14145e538ecdSBram Moolenaar python_tabpage_free(tabpage_T *tab) 14155e538ecdSBram Moolenaar { 14165e538ecdSBram Moolenaar if (TAB_PYTHON_REF(tab) != NULL) 14175e538ecdSBram Moolenaar { 14185e538ecdSBram Moolenaar TabPageObject *tp = TAB_PYTHON_REF(tab); 14195e538ecdSBram Moolenaar tp->tab = INVALID_TABPAGE_VALUE; 14205e538ecdSBram Moolenaar TAB_PYTHON_REF(tab) = NULL; 14215e538ecdSBram Moolenaar } 14225e538ecdSBram Moolenaar } 1423071d4279SBram Moolenaar 14241dc28783SBram Moolenaar static int 1425071d4279SBram Moolenaar PythonMod_Init(void) 1426071d4279SBram Moolenaar { 14272ab2e860SBram Moolenaar // The special value is removed from sys.path in Python_Init(). 14289774ecc8SBram Moolenaar static char *(argv[2]) = {"/must>not&exist/foo", NULL}; 1429071d4279SBram Moolenaar 14301dc28783SBram Moolenaar if (init_types()) 14311dc28783SBram Moolenaar return -1; 1432071d4279SBram Moolenaar 14332ab2e860SBram Moolenaar // Set sys.argv[] to avoid a crash in warn(). 1434071d4279SBram Moolenaar PySys_SetArgv(1, argv); 1435071d4279SBram Moolenaar 1436c09a6d6cSBram Moolenaar vim_module = Py_InitModule4("vim", VimMethods, (char *)NULL, 1437c09a6d6cSBram Moolenaar (PyObject *)NULL, PYTHON_API_VERSION); 1438071d4279SBram Moolenaar 1439dee2e315SBram Moolenaar if (populate_module(vim_module)) 1440c09a6d6cSBram Moolenaar return -1; 1441c09a6d6cSBram Moolenaar 1442c09a6d6cSBram Moolenaar if (init_sys_path()) 1443c09a6d6cSBram Moolenaar return -1; 1444c09a6d6cSBram Moolenaar 1445c09a6d6cSBram Moolenaar return 0; 1446071d4279SBram Moolenaar } 1447071d4279SBram Moolenaar 14482ab2e860SBram Moolenaar ////////////////////////////////////////////////////////////////////////// 14492ab2e860SBram Moolenaar // 4. Utility functions for handling the interface between Vim and Python. 1450071d4279SBram Moolenaar 14512ab2e860SBram Moolenaar // Convert a Vim line into a Python string. 14522ab2e860SBram Moolenaar // All internal newlines are replaced by null characters. 14532ab2e860SBram Moolenaar // 14542ab2e860SBram Moolenaar // On errors, the Python exception data is set, and NULL is returned. 1455071d4279SBram Moolenaar static PyObject * 1456071d4279SBram Moolenaar LineToString(const char *str) 1457071d4279SBram Moolenaar { 1458071d4279SBram Moolenaar PyObject *result; 14592c45e945SBram Moolenaar PyInt len = strlen(str); 1460071d4279SBram Moolenaar char *p; 1461071d4279SBram Moolenaar 14622ab2e860SBram Moolenaar // Allocate an Python string object, with uninitialised contents. We 14632ab2e860SBram Moolenaar // must do it this way, so that we can modify the string in place 14642ab2e860SBram Moolenaar // later. See the Python source, Objects/stringobject.c for details. 1465071d4279SBram Moolenaar result = PyString_FromStringAndSize(NULL, len); 1466071d4279SBram Moolenaar if (result == NULL) 1467071d4279SBram Moolenaar return NULL; 1468071d4279SBram Moolenaar 1469071d4279SBram Moolenaar p = PyString_AsString(result); 1470071d4279SBram Moolenaar 1471071d4279SBram Moolenaar while (*str) 1472071d4279SBram Moolenaar { 1473071d4279SBram Moolenaar if (*str == '\n') 1474071d4279SBram Moolenaar *p = '\0'; 1475071d4279SBram Moolenaar else 1476071d4279SBram Moolenaar *p = *str; 1477071d4279SBram Moolenaar 1478071d4279SBram Moolenaar ++p; 1479071d4279SBram Moolenaar ++str; 1480071d4279SBram Moolenaar } 1481071d4279SBram Moolenaar 1482071d4279SBram Moolenaar return result; 1483071d4279SBram Moolenaar } 1484071d4279SBram Moolenaar 1485db913953SBram Moolenaar static PyObject * 1486db913953SBram Moolenaar DictionaryGetattr(PyObject *self, char *name) 1487db913953SBram Moolenaar { 148866b7985eSBram Moolenaar DictionaryObject *this = ((DictionaryObject *) (self)); 148966b7985eSBram Moolenaar 149066b7985eSBram Moolenaar if (strcmp(name, "locked") == 0) 149166b7985eSBram Moolenaar return PyInt_FromLong(this->dict->dv_lock); 149266b7985eSBram Moolenaar else if (strcmp(name, "scope") == 0) 149366b7985eSBram Moolenaar return PyInt_FromLong(this->dict->dv_scope); 1494dd8aca66SBram Moolenaar else if (strcmp(name, "__members__") == 0) 1495dd8aca66SBram Moolenaar return ObjectDir(NULL, DictionaryAttrs); 149666b7985eSBram Moolenaar 1497db913953SBram Moolenaar return Py_FindMethod(DictionaryMethods, self, name); 1498db913953SBram Moolenaar } 1499db913953SBram Moolenaar 1500db913953SBram Moolenaar static PyObject * 1501db913953SBram Moolenaar ListGetattr(PyObject *self, char *name) 1502db913953SBram Moolenaar { 150366b7985eSBram Moolenaar if (strcmp(name, "locked") == 0) 150466b7985eSBram Moolenaar return PyInt_FromLong(((ListObject *)(self))->list->lv_lock); 1505dd8aca66SBram Moolenaar else if (strcmp(name, "__members__") == 0) 1506dd8aca66SBram Moolenaar return ObjectDir(NULL, ListAttrs); 150766b7985eSBram Moolenaar 1508db913953SBram Moolenaar return Py_FindMethod(ListMethods, self, name); 1509db913953SBram Moolenaar } 1510db913953SBram Moolenaar 1511db913953SBram Moolenaar static PyObject * 1512db913953SBram Moolenaar FunctionGetattr(PyObject *self, char *name) 1513db913953SBram Moolenaar { 15148110a091SBram Moolenaar PyObject *r; 1515db913953SBram Moolenaar 15168110a091SBram Moolenaar r = FunctionAttr((FunctionObject *)(self), name); 15178110a091SBram Moolenaar 15188110a091SBram Moolenaar if (r || PyErr_Occurred()) 15198110a091SBram Moolenaar return r; 1520db913953SBram Moolenaar else 1521db913953SBram Moolenaar return Py_FindMethod(FunctionMethods, self, name); 1522db913953SBram Moolenaar } 1523db913953SBram Moolenaar 1524db913953SBram Moolenaar void 1525db913953SBram Moolenaar do_pyeval(char_u *str, typval_T *rettv) 1526db913953SBram Moolenaar { 1527b52f4c02SBram Moolenaar DoPyCommand((char *) str, 1528b52f4c02SBram Moolenaar (rangeinitializer) init_range_eval, 1529b52f4c02SBram Moolenaar (runner) run_eval, 1530b52f4c02SBram Moolenaar (void *) rettv); 15318e9a24a1SBram Moolenaar if (rettv->v_type == VAR_UNKNOWN) 1532db913953SBram Moolenaar { 153377fceb89SBram Moolenaar rettv->v_type = VAR_NUMBER; 153477fceb89SBram Moolenaar rettv->vval.v_number = 0; 1535db913953SBram Moolenaar } 1536db913953SBram Moolenaar } 1537071d4279SBram Moolenaar 15382ab2e860SBram Moolenaar // Don't generate a prototype for the next function, it generates an error on 15392ab2e860SBram Moolenaar // newer Python versions. 1540071d4279SBram Moolenaar #if PYTHON_API_VERSION < 1007 /* Python 1.4 */ && !defined(PROTO) 1541071d4279SBram Moolenaar 1542071d4279SBram Moolenaar char * 1543071d4279SBram Moolenaar Py_GetProgramName(void) 1544071d4279SBram Moolenaar { 1545071d4279SBram Moolenaar return "vim"; 1546071d4279SBram Moolenaar } 15472ab2e860SBram Moolenaar #endif // Python 1.4 1548170bf1aeSBram Moolenaar 15492459a5ecSBram Moolenaar int 1550db913953SBram Moolenaar set_ref_in_python(int copyID) 1551db913953SBram Moolenaar { 15522459a5ecSBram Moolenaar return set_ref_in_py(copyID); 1553db913953SBram Moolenaar } 1554