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 240014a53aSBram Moolenaar /* uncomment this if used with the debug version of python. 250014a53aSBram Moolenaar * Checked on 2.7.4. */ 260014a53aSBram Moolenaar /* #define Py_DEBUG */ 270014a53aSBram Moolenaar /* Note: most of time you can add -DPy_DEBUG to CFLAGS in place of uncommenting 280014a53aSBram Moolenaar */ 290014a53aSBram Moolenaar /* uncomment this if used with the debug version of python, but without its 300014a53aSBram Moolenaar * allocator */ 310014a53aSBram Moolenaar /* #define Py_DEBUG_NO_PYMALLOC */ 320014a53aSBram Moolenaar 33071d4279SBram Moolenaar /* Python.h defines _POSIX_THREADS itself (if needed) */ 34071d4279SBram Moolenaar #ifdef _POSIX_THREADS 35071d4279SBram Moolenaar # undef _POSIX_THREADS 36071d4279SBram Moolenaar #endif 37071d4279SBram Moolenaar 38071d4279SBram Moolenaar #if defined(_WIN32) && defined(HAVE_FCNTL_H) 39071d4279SBram Moolenaar # undef HAVE_FCNTL_H 40071d4279SBram Moolenaar #endif 41071d4279SBram Moolenaar 42071d4279SBram Moolenaar #ifdef _DEBUG 43071d4279SBram Moolenaar # undef _DEBUG 44071d4279SBram Moolenaar #endif 45071d4279SBram Moolenaar 46071d4279SBram Moolenaar #ifdef HAVE_STDARG_H 47071d4279SBram Moolenaar # undef HAVE_STDARG_H /* Python's config.h defines it as well. */ 48071d4279SBram Moolenaar #endif 49be2c9ae9SBram Moolenaar #ifdef _POSIX_C_SOURCE 50be2c9ae9SBram Moolenaar # undef _POSIX_C_SOURCE /* pyconfig.h defines it as well. */ 51be2c9ae9SBram Moolenaar #endif 52be2c9ae9SBram Moolenaar #ifdef _XOPEN_SOURCE 53be2c9ae9SBram Moolenaar # undef _XOPEN_SOURCE /* pyconfig.h defines it as well. */ 54be2c9ae9SBram Moolenaar #endif 55071d4279SBram Moolenaar 560bdda37fSBram Moolenaar #define PY_SSIZE_T_CLEAN 570bdda37fSBram Moolenaar 58071d4279SBram Moolenaar #include <Python.h> 590bdda37fSBram Moolenaar 600bdda37fSBram Moolenaar #if !defined(PY_VERSION_HEX) || PY_VERSION_HEX < 0x02050000 610bdda37fSBram Moolenaar # undef PY_SSIZE_T_CLEAN 620bdda37fSBram Moolenaar #endif 630bdda37fSBram Moolenaar 64071d4279SBram Moolenaar #if defined(MACOS) && !defined(MACOS_X_UNIX) 65071d4279SBram Moolenaar # include "macglue.h" 66071d4279SBram Moolenaar # include <CodeFragments.h> 67071d4279SBram Moolenaar #endif 68071d4279SBram Moolenaar #undef main /* Defined in python.h - aargh */ 69071d4279SBram Moolenaar #undef HAVE_FCNTL_H /* Clash with os_win32.h */ 70071d4279SBram Moolenaar 71db913953SBram Moolenaar #define PyBytes_FromString PyString_FromString 72335e0b69SBram Moolenaar #define PyBytes_Check PyString_Check 73808c2bc8SBram Moolenaar #define PyBytes_AsStringAndSize PyString_AsStringAndSize 7419e60943SBram Moolenaar 75071d4279SBram Moolenaar #if !defined(FEAT_PYTHON) && defined(PROTO) 76071d4279SBram Moolenaar /* Use this to be able to generate prototypes without python being used. */ 77e7cb9cf6SBram Moolenaar # define PyObject Py_ssize_t 78e7cb9cf6SBram Moolenaar # define PyThreadState Py_ssize_t 79e7cb9cf6SBram Moolenaar # define PyTypeObject Py_ssize_t 80e7cb9cf6SBram Moolenaar struct PyMethodDef { Py_ssize_t a; }; 81e7cb9cf6SBram Moolenaar # define PySequenceMethods Py_ssize_t 82071d4279SBram Moolenaar #endif 83071d4279SBram Moolenaar 842afa3238SBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 852afa3238SBram Moolenaar # define PY_USE_CAPSULE 862afa3238SBram Moolenaar #endif 872afa3238SBram Moolenaar 882c45e945SBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000 892c45e945SBram Moolenaar # define PyInt Py_ssize_t 902c45e945SBram Moolenaar # define PyInquiry lenfunc 912c45e945SBram Moolenaar # define PyIntArgFunc ssizeargfunc 922c45e945SBram Moolenaar # define PyIntIntArgFunc ssizessizeargfunc 932c45e945SBram Moolenaar # define PyIntObjArgProc ssizeobjargproc 942c45e945SBram Moolenaar # define PyIntIntObjArgProc ssizessizeobjargproc 95e7cb9cf6SBram Moolenaar # define Py_ssize_t_fmt "n" 962c45e945SBram Moolenaar #else 972c45e945SBram Moolenaar # define PyInt int 984d1da49cSBram Moolenaar # define lenfunc inquiry 992c45e945SBram Moolenaar # define PyInquiry inquiry 1002c45e945SBram Moolenaar # define PyIntArgFunc intargfunc 1012c45e945SBram Moolenaar # define PyIntIntArgFunc intintargfunc 1022c45e945SBram Moolenaar # define PyIntObjArgProc intobjargproc 1032c45e945SBram Moolenaar # define PyIntIntObjArgProc intintobjargproc 104e7cb9cf6SBram Moolenaar # define Py_ssize_t_fmt "i" 1052c45e945SBram Moolenaar #endif 106a9922d62SBram Moolenaar #define Py_bytes_fmt "s" 1072c45e945SBram Moolenaar 108071d4279SBram Moolenaar /* Parser flags */ 109071d4279SBram Moolenaar #define single_input 256 110071d4279SBram Moolenaar #define file_input 257 111071d4279SBram Moolenaar #define eval_input 258 112071d4279SBram Moolenaar 113071d4279SBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x020300F0 114071d4279SBram Moolenaar /* Python 2.3: can invoke ":python" recursively. */ 115071d4279SBram Moolenaar # define PY_CAN_RECURSE 116071d4279SBram Moolenaar #endif 117071d4279SBram Moolenaar 118071d4279SBram Moolenaar # if defined(DYNAMIC_PYTHON) || defined(PROTO) 119071d4279SBram Moolenaar # ifndef DYNAMIC_PYTHON 120e7cb9cf6SBram Moolenaar # define HINSTANCE long_u /* for generating prototypes */ 121071d4279SBram Moolenaar # endif 122071d4279SBram Moolenaar 123fa5d1e63SBram Moolenaar # ifndef WIN3264 124bd5e15fdSBram Moolenaar # include <dlfcn.h> 125bd5e15fdSBram Moolenaar # define FARPROC void* 126bd5e15fdSBram Moolenaar # define HINSTANCE void* 127644d37b8SBram Moolenaar # if defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL) 128b61f95c3SBram Moolenaar # define load_dll(n) dlopen((n), RTLD_LAZY) 129b61f95c3SBram Moolenaar # else 130fa5d1e63SBram Moolenaar # define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL) 131b61f95c3SBram Moolenaar # endif 132bd5e15fdSBram Moolenaar # define close_dll dlclose 133bd5e15fdSBram Moolenaar # define symbol_from_dll dlsym 134bd5e15fdSBram Moolenaar # else 135ebbcb824SBram Moolenaar # define load_dll vimLoadLib 136bd5e15fdSBram Moolenaar # define close_dll FreeLibrary 137bd5e15fdSBram Moolenaar # define symbol_from_dll GetProcAddress 138bd5e15fdSBram Moolenaar # endif 139bd5e15fdSBram Moolenaar 140e7cb9cf6SBram Moolenaar /* This makes if_python.c compile without warnings against Python 2.5 141e7cb9cf6SBram Moolenaar * on Win32 and Win64. */ 142e7cb9cf6SBram Moolenaar # undef PyRun_SimpleString 143db913953SBram Moolenaar # undef PyRun_String 144e7cb9cf6SBram Moolenaar # undef PyArg_Parse 145e7cb9cf6SBram Moolenaar # undef PyArg_ParseTuple 146e7cb9cf6SBram Moolenaar # undef Py_BuildValue 147e7cb9cf6SBram Moolenaar # undef Py_InitModule4 148e7cb9cf6SBram Moolenaar # undef Py_InitModule4_64 149db913953SBram Moolenaar # undef PyObject_CallMethod 1509f3685a5SBram Moolenaar # undef PyObject_CallFunction 151e7cb9cf6SBram Moolenaar 152071d4279SBram Moolenaar /* 153071d4279SBram Moolenaar * Wrapper defines 154071d4279SBram Moolenaar */ 155071d4279SBram Moolenaar # define PyArg_Parse dll_PyArg_Parse 156071d4279SBram Moolenaar # define PyArg_ParseTuple dll_PyArg_ParseTuple 15719e60943SBram Moolenaar # define PyMem_Free dll_PyMem_Free 158db913953SBram Moolenaar # define PyMem_Malloc dll_PyMem_Malloc 159071d4279SBram Moolenaar # define PyDict_SetItemString dll_PyDict_SetItemString 160071d4279SBram Moolenaar # define PyErr_BadArgument dll_PyErr_BadArgument 161d5f729caSBram Moolenaar # define PyErr_NewException dll_PyErr_NewException 162071d4279SBram Moolenaar # define PyErr_Clear dll_PyErr_Clear 163c476e52fSBram Moolenaar # define PyErr_Format dll_PyErr_Format 1644d36987cSBram Moolenaar # define PyErr_PrintEx dll_PyErr_PrintEx 165071d4279SBram Moolenaar # define PyErr_NoMemory dll_PyErr_NoMemory 166071d4279SBram Moolenaar # define PyErr_Occurred dll_PyErr_Occurred 167071d4279SBram Moolenaar # define PyErr_SetNone dll_PyErr_SetNone 168071d4279SBram Moolenaar # define PyErr_SetString dll_PyErr_SetString 1694d188da2SBram Moolenaar # define PyErr_SetObject dll_PyErr_SetObject 170c09a6d6cSBram Moolenaar # define PyErr_ExceptionMatches dll_PyErr_ExceptionMatches 171071d4279SBram Moolenaar # define PyEval_InitThreads dll_PyEval_InitThreads 172071d4279SBram Moolenaar # define PyEval_RestoreThread dll_PyEval_RestoreThread 173071d4279SBram Moolenaar # define PyEval_SaveThread dll_PyEval_SaveThread 174071d4279SBram Moolenaar # ifdef PY_CAN_RECURSE 175071d4279SBram Moolenaar # define PyGILState_Ensure dll_PyGILState_Ensure 176071d4279SBram Moolenaar # define PyGILState_Release dll_PyGILState_Release 177071d4279SBram Moolenaar # endif 178071d4279SBram Moolenaar # define PyInt_AsLong dll_PyInt_AsLong 179071d4279SBram Moolenaar # define PyInt_FromLong dll_PyInt_FromLong 180db913953SBram Moolenaar # define PyLong_AsLong dll_PyLong_AsLong 181db913953SBram Moolenaar # define PyLong_FromLong dll_PyLong_FromLong 18266b7985eSBram Moolenaar # define PyBool_Type (*dll_PyBool_Type) 183071d4279SBram Moolenaar # define PyInt_Type (*dll_PyInt_Type) 184db913953SBram Moolenaar # define PyLong_Type (*dll_PyLong_Type) 185071d4279SBram Moolenaar # define PyList_GetItem dll_PyList_GetItem 1860ac9379aSBram Moolenaar # define PyList_Append dll_PyList_Append 187c09a6d6cSBram Moolenaar # define PyList_Insert dll_PyList_Insert 188071d4279SBram Moolenaar # define PyList_New dll_PyList_New 189071d4279SBram Moolenaar # define PyList_SetItem dll_PyList_SetItem 190071d4279SBram Moolenaar # define PyList_Size dll_PyList_Size 191071d4279SBram Moolenaar # define PyList_Type (*dll_PyList_Type) 192db913953SBram Moolenaar # define PySequence_Check dll_PySequence_Check 193db913953SBram Moolenaar # define PySequence_Size dll_PySequence_Size 194db913953SBram Moolenaar # define PySequence_GetItem dll_PySequence_GetItem 195a9922d62SBram Moolenaar # define PySequence_Fast dll_PySequence_Fast 196db913953SBram Moolenaar # define PyTuple_Size dll_PyTuple_Size 197db913953SBram Moolenaar # define PyTuple_GetItem dll_PyTuple_GetItem 198db913953SBram Moolenaar # define PyTuple_Type (*dll_PyTuple_Type) 199063a46baSBram Moolenaar # define PySlice_GetIndicesEx dll_PySlice_GetIndicesEx 200071d4279SBram Moolenaar # define PyImport_ImportModule dll_PyImport_ImportModule 2010ac9379aSBram Moolenaar # define PyDict_New dll_PyDict_New 202071d4279SBram Moolenaar # define PyDict_GetItemString dll_PyDict_GetItemString 203db913953SBram Moolenaar # define PyDict_Next dll_PyDict_Next 2043e734ea2SBram Moolenaar # define PyDict_Type (*dll_PyDict_Type) 205bcb40977SBram Moolenaar # ifdef PyMapping_Keys 206bcb40977SBram Moolenaar # define PY_NO_MAPPING_KEYS 207db913953SBram Moolenaar # else 208bcb40977SBram Moolenaar # define PyMapping_Keys dll_PyMapping_Keys 209db913953SBram Moolenaar # endif 210bcb40977SBram Moolenaar # define PyObject_GetItem dll_PyObject_GetItem 211db913953SBram Moolenaar # define PyObject_CallMethod dll_PyObject_CallMethod 212db913953SBram Moolenaar # define PyMapping_Check dll_PyMapping_Check 213db913953SBram Moolenaar # define PyIter_Next dll_PyIter_Next 214071d4279SBram Moolenaar # define PyModule_GetDict dll_PyModule_GetDict 215f9c9b32bSBram Moolenaar # define PyModule_AddObject dll_PyModule_AddObject 216071d4279SBram Moolenaar # define PyRun_SimpleString dll_PyRun_SimpleString 217db913953SBram Moolenaar # define PyRun_String dll_PyRun_String 218d620aa9bSBram Moolenaar # define PyObject_GetAttrString dll_PyObject_GetAttrString 219a9922d62SBram Moolenaar # define PyObject_HasAttrString dll_PyObject_HasAttrString 220d620aa9bSBram Moolenaar # define PyObject_SetAttrString dll_PyObject_SetAttrString 221d620aa9bSBram Moolenaar # define PyObject_CallFunctionObjArgs dll_PyObject_CallFunctionObjArgs 2229f3685a5SBram Moolenaar # define PyObject_CallFunction dll_PyObject_CallFunction 223f4258308SBram Moolenaar # define PyObject_Call dll_PyObject_Call 224141be8a5SBram Moolenaar # define PyObject_Repr dll_PyObject_Repr 225071d4279SBram Moolenaar # define PyString_AsString dll_PyString_AsString 226cdab9051SBram Moolenaar # define PyString_AsStringAndSize dll_PyString_AsStringAndSize 227071d4279SBram Moolenaar # define PyString_FromString dll_PyString_FromString 2281a3b5695SBram Moolenaar # define PyString_FromFormat dll_PyString_FromFormat 229071d4279SBram Moolenaar # define PyString_FromStringAndSize dll_PyString_FromStringAndSize 230071d4279SBram Moolenaar # define PyString_Size dll_PyString_Size 231071d4279SBram Moolenaar # define PyString_Type (*dll_PyString_Type) 232db913953SBram Moolenaar # define PyUnicode_Type (*dll_PyUnicode_Type) 233cc3e85f1SBram Moolenaar # undef PyUnicode_AsEncodedString 234cc3e85f1SBram Moolenaar # define PyUnicode_AsEncodedString py_PyUnicode_AsEncodedString 235db913953SBram Moolenaar # define PyFloat_AsDouble dll_PyFloat_AsDouble 236db913953SBram Moolenaar # define PyFloat_FromDouble dll_PyFloat_FromDouble 237db913953SBram Moolenaar # define PyFloat_Type (*dll_PyFloat_Type) 238141be8a5SBram Moolenaar # define PyNumber_Check dll_PyNumber_Check 239141be8a5SBram Moolenaar # define PyNumber_Long dll_PyNumber_Long 240db913953SBram Moolenaar # define PyImport_AddModule (*dll_PyImport_AddModule) 241071d4279SBram Moolenaar # define PySys_SetObject dll_PySys_SetObject 242c09a6d6cSBram Moolenaar # define PySys_GetObject dll_PySys_GetObject 243071d4279SBram Moolenaar # define PySys_SetArgv dll_PySys_SetArgv 244071d4279SBram Moolenaar # define PyType_Type (*dll_PyType_Type) 245063a46baSBram Moolenaar # define PySlice_Type (*dll_PySlice_Type) 24630fec7bcSBram Moolenaar # define PyType_Ready (*dll_PyType_Ready) 247a9922d62SBram Moolenaar # define PyType_GenericAlloc dll_PyType_GenericAlloc 248071d4279SBram Moolenaar # define Py_BuildValue dll_Py_BuildValue 249071d4279SBram Moolenaar # define Py_FindMethod dll_Py_FindMethod 250071d4279SBram Moolenaar # define Py_InitModule4 dll_Py_InitModule4 251644d37b8SBram Moolenaar # define Py_SetPythonHome dll_Py_SetPythonHome 252071d4279SBram Moolenaar # define Py_Initialize dll_Py_Initialize 2530e21a3f6SBram Moolenaar # define Py_Finalize dll_Py_Finalize 2540e21a3f6SBram Moolenaar # define Py_IsInitialized dll_Py_IsInitialized 255071d4279SBram Moolenaar # define _PyObject_New dll__PyObject_New 256774267bbSBram Moolenaar # define _PyObject_GC_New dll__PyObject_GC_New 2573e734ea2SBram Moolenaar # ifdef PyObject_GC_Del 2583e734ea2SBram Moolenaar # define Py_underscore_GC 2593e734ea2SBram Moolenaar # define _PyObject_GC_Del dll__PyObject_GC_Del 2603e734ea2SBram Moolenaar # define _PyObject_GC_UnTrack dll__PyObject_GC_UnTrack 2613e734ea2SBram Moolenaar # else 262774267bbSBram Moolenaar # define PyObject_GC_Del dll_PyObject_GC_Del 263774267bbSBram Moolenaar # define PyObject_GC_UnTrack dll_PyObject_GC_UnTrack 2643e734ea2SBram Moolenaar # endif 265e721122bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 266db913953SBram Moolenaar # define _PyObject_NextNotImplemented (*dll__PyObject_NextNotImplemented) 267e721122bSBram Moolenaar # endif 268071d4279SBram Moolenaar # define _Py_NoneStruct (*dll__Py_NoneStruct) 26966b7985eSBram Moolenaar # define _Py_ZeroStruct (*dll__Py_ZeroStruct) 27066b7985eSBram Moolenaar # define _Py_TrueStruct (*dll__Py_TrueStruct) 271071d4279SBram Moolenaar # define PyObject_Init dll__PyObject_Init 272db913953SBram Moolenaar # define PyObject_GetIter dll_PyObject_GetIter 27303db85b3SBram Moolenaar # define PyObject_IsTrue dll_PyObject_IsTrue 274071d4279SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000 275071d4279SBram Moolenaar # define PyType_IsSubtype dll_PyType_IsSubtype 2760014a53aSBram Moolenaar # ifdef Py_DEBUG 2770014a53aSBram Moolenaar # define _Py_NegativeRefcount dll__Py_NegativeRefcount 2780014a53aSBram Moolenaar # define _Py_RefTotal (*dll__Py_RefTotal) 2790014a53aSBram Moolenaar # define _Py_Dealloc dll__Py_Dealloc 2800014a53aSBram Moolenaar # endif 2813e734ea2SBram Moolenaar # endif 2823e734ea2SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000 2830014a53aSBram Moolenaar # if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC) 2840014a53aSBram Moolenaar # define _PyObject_DebugMalloc dll__PyObject_DebugMalloc 2850014a53aSBram Moolenaar # define _PyObject_DebugFree dll__PyObject_DebugFree 2860014a53aSBram Moolenaar # else 287071d4279SBram Moolenaar # define PyObject_Malloc dll_PyObject_Malloc 288071d4279SBram Moolenaar # define PyObject_Free dll_PyObject_Free 289071d4279SBram Moolenaar # endif 2900014a53aSBram Moolenaar # endif 2912afa3238SBram Moolenaar # ifdef PY_USE_CAPSULE 292db913953SBram Moolenaar # define PyCapsule_New dll_PyCapsule_New 293db913953SBram Moolenaar # define PyCapsule_GetPointer dll_PyCapsule_GetPointer 2942afa3238SBram Moolenaar # else 2952afa3238SBram Moolenaar # define PyCObject_FromVoidPtr dll_PyCObject_FromVoidPtr 2962afa3238SBram Moolenaar # define PyCObject_AsVoidPtr dll_PyCObject_AsVoidPtr 2972afa3238SBram Moolenaar # endif 29812a28d4bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 29912a28d4bSBram Moolenaar # define Py_NoSiteFlag (*dll_Py_NoSiteFlag) 30012a28d4bSBram Moolenaar # endif 301071d4279SBram Moolenaar 302071d4279SBram Moolenaar /* 303071d4279SBram Moolenaar * Pointers for dynamic link 304071d4279SBram Moolenaar */ 305071d4279SBram Moolenaar static int(*dll_PyArg_Parse)(PyObject *, char *, ...); 306071d4279SBram Moolenaar static int(*dll_PyArg_ParseTuple)(PyObject *, char *, ...); 30719e60943SBram Moolenaar static int(*dll_PyMem_Free)(void *); 308db913953SBram Moolenaar static void* (*dll_PyMem_Malloc)(size_t); 309071d4279SBram Moolenaar static int(*dll_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item); 310071d4279SBram Moolenaar static int(*dll_PyErr_BadArgument)(void); 311d5f729caSBram Moolenaar static PyObject *(*dll_PyErr_NewException)(char *, PyObject *, PyObject *); 312071d4279SBram Moolenaar static void(*dll_PyErr_Clear)(void); 313c476e52fSBram Moolenaar static PyObject*(*dll_PyErr_Format)(PyObject *, const char *, ...); 3144d36987cSBram Moolenaar static void(*dll_PyErr_PrintEx)(int); 315071d4279SBram Moolenaar static PyObject*(*dll_PyErr_NoMemory)(void); 316071d4279SBram Moolenaar static PyObject*(*dll_PyErr_Occurred)(void); 317071d4279SBram Moolenaar static void(*dll_PyErr_SetNone)(PyObject *); 318071d4279SBram Moolenaar static void(*dll_PyErr_SetString)(PyObject *, const char *); 3194d188da2SBram Moolenaar static void(*dll_PyErr_SetObject)(PyObject *, PyObject *); 320c09a6d6cSBram Moolenaar static int(*dll_PyErr_ExceptionMatches)(PyObject *); 321071d4279SBram Moolenaar static void(*dll_PyEval_InitThreads)(void); 322071d4279SBram Moolenaar static void(*dll_PyEval_RestoreThread)(PyThreadState *); 323071d4279SBram Moolenaar static PyThreadState*(*dll_PyEval_SaveThread)(void); 324071d4279SBram Moolenaar # ifdef PY_CAN_RECURSE 325071d4279SBram Moolenaar static PyGILState_STATE (*dll_PyGILState_Ensure)(void); 326071d4279SBram Moolenaar static void (*dll_PyGILState_Release)(PyGILState_STATE); 327071d4279SBram Moolenaar # endif 328071d4279SBram Moolenaar static long(*dll_PyInt_AsLong)(PyObject *); 329071d4279SBram Moolenaar static PyObject*(*dll_PyInt_FromLong)(long); 330db913953SBram Moolenaar static long(*dll_PyLong_AsLong)(PyObject *); 331db913953SBram Moolenaar static PyObject*(*dll_PyLong_FromLong)(long); 33266b7985eSBram Moolenaar static PyTypeObject* dll_PyBool_Type; 333071d4279SBram Moolenaar static PyTypeObject* dll_PyInt_Type; 334db913953SBram Moolenaar static PyTypeObject* dll_PyLong_Type; 3352c45e945SBram Moolenaar static PyObject*(*dll_PyList_GetItem)(PyObject *, PyInt); 336c09a6d6cSBram Moolenaar static int(*dll_PyList_Append)(PyObject *, PyObject *); 337d5e376ebSBram Moolenaar static int(*dll_PyList_Insert)(PyObject *, PyInt, PyObject *); 3382c45e945SBram Moolenaar static PyObject*(*dll_PyList_New)(PyInt size); 3392c45e945SBram Moolenaar static int(*dll_PyList_SetItem)(PyObject *, PyInt, PyObject *); 3402c45e945SBram Moolenaar static PyInt(*dll_PyList_Size)(PyObject *); 341071d4279SBram Moolenaar static PyTypeObject* dll_PyList_Type; 342db913953SBram Moolenaar static int (*dll_PySequence_Check)(PyObject *); 343db913953SBram Moolenaar static PyInt(*dll_PySequence_Size)(PyObject *); 344db913953SBram Moolenaar static PyObject*(*dll_PySequence_GetItem)(PyObject *, PyInt); 345a9922d62SBram Moolenaar static PyObject*(*dll_PySequence_Fast)(PyObject *, const char *); 346db913953SBram Moolenaar static PyInt(*dll_PyTuple_Size)(PyObject *); 347db913953SBram Moolenaar static PyObject*(*dll_PyTuple_GetItem)(PyObject *, PyInt); 348db913953SBram Moolenaar static PyTypeObject* dll_PyTuple_Type; 3495395e7afSBram Moolenaar static int (*dll_PySlice_GetIndicesEx)(PySliceObject *r, PyInt length, 350063a46baSBram Moolenaar PyInt *start, PyInt *stop, PyInt *step, 351063a46baSBram Moolenaar PyInt *slicelen); 352071d4279SBram Moolenaar static PyObject*(*dll_PyImport_ImportModule)(const char *); 3530ac9379aSBram Moolenaar static PyObject*(*dll_PyDict_New)(void); 354071d4279SBram Moolenaar static PyObject*(*dll_PyDict_GetItemString)(PyObject *, const char *); 3553e734ea2SBram Moolenaar static int (*dll_PyDict_Next)(PyObject *, PyInt *, PyObject **, PyObject **); 3563e734ea2SBram Moolenaar static PyTypeObject* dll_PyDict_Type; 357bcb40977SBram Moolenaar # ifndef PY_NO_MAPPING_KEYS 358bcb40977SBram Moolenaar static PyObject* (*dll_PyMapping_Keys)(PyObject *); 359db913953SBram Moolenaar # endif 360bcb40977SBram Moolenaar static PyObject* (*dll_PyObject_GetItem)(PyObject *, PyObject *); 361db913953SBram Moolenaar static PyObject* (*dll_PyObject_CallMethod)(PyObject *, char *, PyObject *); 362db913953SBram Moolenaar static int (*dll_PyMapping_Check)(PyObject *); 363db913953SBram Moolenaar static PyObject* (*dll_PyIter_Next)(PyObject *); 364071d4279SBram Moolenaar static PyObject*(*dll_PyModule_GetDict)(PyObject *); 365f9c9b32bSBram Moolenaar static int(*dll_PyModule_AddObject)(PyObject *, const char *, PyObject *); 366071d4279SBram Moolenaar static int(*dll_PyRun_SimpleString)(char *); 367db913953SBram Moolenaar static PyObject *(*dll_PyRun_String)(char *, int, PyObject *, PyObject *); 368d620aa9bSBram Moolenaar static PyObject* (*dll_PyObject_GetAttrString)(PyObject *, const char *); 369a9922d62SBram Moolenaar static int (*dll_PyObject_HasAttrString)(PyObject *, const char *); 3700b400087SBram Moolenaar static int (*dll_PyObject_SetAttrString)(PyObject *, const char *, PyObject *); 371d620aa9bSBram Moolenaar static PyObject* (*dll_PyObject_CallFunctionObjArgs)(PyObject *, ...); 3729f3685a5SBram Moolenaar static PyObject* (*dll_PyObject_CallFunction)(PyObject *, char *, ...); 373f4258308SBram Moolenaar static PyObject* (*dll_PyObject_Call)(PyObject *, PyObject *, PyObject *); 374141be8a5SBram Moolenaar static PyObject* (*dll_PyObject_Repr)(PyObject *); 375071d4279SBram Moolenaar static char*(*dll_PyString_AsString)(PyObject *); 376d5e376ebSBram Moolenaar static int(*dll_PyString_AsStringAndSize)(PyObject *, char **, PyInt *); 377071d4279SBram Moolenaar static PyObject*(*dll_PyString_FromString)(const char *); 3781a3b5695SBram Moolenaar static PyObject*(*dll_PyString_FromFormat)(const char *, ...); 3792c45e945SBram Moolenaar static PyObject*(*dll_PyString_FromStringAndSize)(const char *, PyInt); 3802c45e945SBram Moolenaar static PyInt(*dll_PyString_Size)(PyObject *); 381071d4279SBram Moolenaar static PyTypeObject* dll_PyString_Type; 382db913953SBram Moolenaar static PyTypeObject* dll_PyUnicode_Type; 383cc3e85f1SBram Moolenaar static PyObject *(*py_PyUnicode_AsEncodedString)(PyObject *, char *, char *); 384db913953SBram Moolenaar static double(*dll_PyFloat_AsDouble)(PyObject *); 385db913953SBram Moolenaar static PyObject*(*dll_PyFloat_FromDouble)(double); 386db913953SBram Moolenaar static PyTypeObject* dll_PyFloat_Type; 387141be8a5SBram Moolenaar static int(*dll_PyNumber_Check)(PyObject *); 388141be8a5SBram Moolenaar static PyObject*(*dll_PyNumber_Long)(PyObject *); 389071d4279SBram Moolenaar static int(*dll_PySys_SetObject)(char *, PyObject *); 390c09a6d6cSBram Moolenaar static PyObject *(*dll_PySys_GetObject)(char *); 391071d4279SBram Moolenaar static int(*dll_PySys_SetArgv)(int, char **); 392071d4279SBram Moolenaar static PyTypeObject* dll_PyType_Type; 393063a46baSBram Moolenaar static PyTypeObject* dll_PySlice_Type; 39430fec7bcSBram Moolenaar static int (*dll_PyType_Ready)(PyTypeObject *type); 395a9922d62SBram Moolenaar static PyObject* (*dll_PyType_GenericAlloc)(PyTypeObject *type, PyInt nitems); 396071d4279SBram Moolenaar static PyObject*(*dll_Py_BuildValue)(char *, ...); 397071d4279SBram Moolenaar static PyObject*(*dll_Py_FindMethod)(struct PyMethodDef[], PyObject *, char *); 398071d4279SBram Moolenaar static PyObject*(*dll_Py_InitModule4)(char *, struct PyMethodDef *, char *, PyObject *, int); 399db913953SBram Moolenaar static PyObject*(*dll_PyImport_AddModule)(char *); 400644d37b8SBram Moolenaar static void(*dll_Py_SetPythonHome)(char *home); 401071d4279SBram Moolenaar static void(*dll_Py_Initialize)(void); 4020e21a3f6SBram Moolenaar static void(*dll_Py_Finalize)(void); 4030e21a3f6SBram Moolenaar static int(*dll_Py_IsInitialized)(void); 404071d4279SBram Moolenaar static PyObject*(*dll__PyObject_New)(PyTypeObject *, PyObject *); 405774267bbSBram Moolenaar static PyObject*(*dll__PyObject_GC_New)(PyTypeObject *); 4063e734ea2SBram Moolenaar # ifdef Py_underscore_GC 4073e734ea2SBram Moolenaar static void(*dll__PyObject_GC_Del)(void *); 4083e734ea2SBram Moolenaar static void(*dll__PyObject_GC_UnTrack)(void *); 4093e734ea2SBram Moolenaar # else 410774267bbSBram Moolenaar static void(*dll_PyObject_GC_Del)(void *); 411774267bbSBram Moolenaar static void(*dll_PyObject_GC_UnTrack)(void *); 4123e734ea2SBram Moolenaar # endif 413071d4279SBram Moolenaar static PyObject*(*dll__PyObject_Init)(PyObject *, PyTypeObject *); 414db913953SBram Moolenaar static PyObject* (*dll_PyObject_GetIter)(PyObject *); 41503db85b3SBram Moolenaar static int (*dll_PyObject_IsTrue)(PyObject *); 416e721122bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 417db913953SBram Moolenaar static iternextfunc dll__PyObject_NextNotImplemented; 418e721122bSBram Moolenaar # endif 419071d4279SBram Moolenaar static PyObject* dll__Py_NoneStruct; 42066b7985eSBram Moolenaar static PyObject* _Py_ZeroStruct; 42166b7985eSBram Moolenaar static PyObject* dll__Py_TrueStruct; 422071d4279SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000 423071d4279SBram Moolenaar static int (*dll_PyType_IsSubtype)(PyTypeObject *, PyTypeObject *); 4240014a53aSBram Moolenaar # ifdef Py_DEBUG 4250014a53aSBram Moolenaar static void (*dll__Py_NegativeRefcount)(const char *fname, int lineno, PyObject *op); 4263e734ea2SBram Moolenaar static PyInt* dll__Py_RefTotal; 4270014a53aSBram Moolenaar static void (*dll__Py_Dealloc)(PyObject *obj); 4280014a53aSBram Moolenaar # endif 4293e734ea2SBram Moolenaar # endif 4303e734ea2SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000 4310014a53aSBram Moolenaar # if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC) 4320014a53aSBram Moolenaar static void (*dll__PyObject_DebugFree)(void*); 4330014a53aSBram Moolenaar static void* (*dll__PyObject_DebugMalloc)(size_t); 4340014a53aSBram Moolenaar # else 435071d4279SBram Moolenaar static void* (*dll_PyObject_Malloc)(size_t); 436071d4279SBram Moolenaar static void (*dll_PyObject_Free)(void*); 437071d4279SBram Moolenaar # endif 4380014a53aSBram Moolenaar # endif 4392afa3238SBram Moolenaar # ifdef PY_USE_CAPSULE 440db913953SBram Moolenaar static PyObject* (*dll_PyCapsule_New)(void *, char *, PyCapsule_Destructor); 441db913953SBram Moolenaar static void* (*dll_PyCapsule_GetPointer)(PyObject *, char *); 4422afa3238SBram Moolenaar # else 443221d6872SBram Moolenaar static PyObject* (*dll_PyCObject_FromVoidPtr)(void *cobj, void (*destr)(void *)); 444221d6872SBram Moolenaar static void* (*dll_PyCObject_AsVoidPtr)(PyObject *); 4452afa3238SBram Moolenaar # endif 44612a28d4bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 44712a28d4bSBram Moolenaar static int* dll_Py_NoSiteFlag; 44812a28d4bSBram Moolenaar # endif 449071d4279SBram Moolenaar 450071d4279SBram Moolenaar static HINSTANCE hinstPython = 0; /* Instance of python.dll */ 451071d4279SBram Moolenaar 452071d4279SBram Moolenaar /* Imported exception objects */ 453071d4279SBram Moolenaar static PyObject *imp_PyExc_AttributeError; 454071d4279SBram Moolenaar static PyObject *imp_PyExc_IndexError; 455af6abb9dSBram Moolenaar static PyObject *imp_PyExc_KeyError; 456071d4279SBram Moolenaar static PyObject *imp_PyExc_KeyboardInterrupt; 457071d4279SBram Moolenaar static PyObject *imp_PyExc_TypeError; 458071d4279SBram Moolenaar static PyObject *imp_PyExc_ValueError; 45941009374SBram Moolenaar static PyObject *imp_PyExc_SystemExit; 4608661b178SBram Moolenaar static PyObject *imp_PyExc_RuntimeError; 461c09a6d6cSBram Moolenaar static PyObject *imp_PyExc_ImportError; 462141be8a5SBram Moolenaar static PyObject *imp_PyExc_OverflowError; 463071d4279SBram Moolenaar 464071d4279SBram Moolenaar # define PyExc_AttributeError imp_PyExc_AttributeError 465071d4279SBram Moolenaar # define PyExc_IndexError imp_PyExc_IndexError 466af6abb9dSBram Moolenaar # define PyExc_KeyError imp_PyExc_KeyError 467071d4279SBram Moolenaar # define PyExc_KeyboardInterrupt imp_PyExc_KeyboardInterrupt 468071d4279SBram Moolenaar # define PyExc_TypeError imp_PyExc_TypeError 469071d4279SBram Moolenaar # define PyExc_ValueError imp_PyExc_ValueError 47041009374SBram Moolenaar # define PyExc_SystemExit imp_PyExc_SystemExit 4718661b178SBram Moolenaar # define PyExc_RuntimeError imp_PyExc_RuntimeError 472c09a6d6cSBram Moolenaar # define PyExc_ImportError imp_PyExc_ImportError 473141be8a5SBram Moolenaar # define PyExc_OverflowError imp_PyExc_OverflowError 474071d4279SBram Moolenaar 475071d4279SBram Moolenaar /* 476071d4279SBram Moolenaar * Table of name to function pointer of python. 477071d4279SBram Moolenaar */ 478071d4279SBram Moolenaar # define PYTHON_PROC FARPROC 479071d4279SBram Moolenaar static struct 480071d4279SBram Moolenaar { 481071d4279SBram Moolenaar char *name; 482071d4279SBram Moolenaar PYTHON_PROC *ptr; 483071d4279SBram Moolenaar } python_funcname_table[] = 484071d4279SBram Moolenaar { 485e8cdcef8SBram Moolenaar #ifndef PY_SSIZE_T_CLEAN 486071d4279SBram Moolenaar {"PyArg_Parse", (PYTHON_PROC*)&dll_PyArg_Parse}, 487071d4279SBram Moolenaar {"PyArg_ParseTuple", (PYTHON_PROC*)&dll_PyArg_ParseTuple}, 488e8cdcef8SBram Moolenaar {"Py_BuildValue", (PYTHON_PROC*)&dll_Py_BuildValue}, 489e8cdcef8SBram Moolenaar #else 490e8cdcef8SBram Moolenaar {"_PyArg_Parse_SizeT", (PYTHON_PROC*)&dll_PyArg_Parse}, 491e8cdcef8SBram Moolenaar {"_PyArg_ParseTuple_SizeT", (PYTHON_PROC*)&dll_PyArg_ParseTuple}, 492e8cdcef8SBram Moolenaar {"_Py_BuildValue_SizeT", (PYTHON_PROC*)&dll_Py_BuildValue}, 493e8cdcef8SBram Moolenaar #endif 49419e60943SBram Moolenaar {"PyMem_Free", (PYTHON_PROC*)&dll_PyMem_Free}, 495db913953SBram Moolenaar {"PyMem_Malloc", (PYTHON_PROC*)&dll_PyMem_Malloc}, 496071d4279SBram Moolenaar {"PyDict_SetItemString", (PYTHON_PROC*)&dll_PyDict_SetItemString}, 497071d4279SBram Moolenaar {"PyErr_BadArgument", (PYTHON_PROC*)&dll_PyErr_BadArgument}, 498d5f729caSBram Moolenaar {"PyErr_NewException", (PYTHON_PROC*)&dll_PyErr_NewException}, 499071d4279SBram Moolenaar {"PyErr_Clear", (PYTHON_PROC*)&dll_PyErr_Clear}, 500c476e52fSBram Moolenaar {"PyErr_Format", (PYTHON_PROC*)&dll_PyErr_Format}, 5014d36987cSBram Moolenaar {"PyErr_PrintEx", (PYTHON_PROC*)&dll_PyErr_PrintEx}, 502071d4279SBram Moolenaar {"PyErr_NoMemory", (PYTHON_PROC*)&dll_PyErr_NoMemory}, 503071d4279SBram Moolenaar {"PyErr_Occurred", (PYTHON_PROC*)&dll_PyErr_Occurred}, 504071d4279SBram Moolenaar {"PyErr_SetNone", (PYTHON_PROC*)&dll_PyErr_SetNone}, 505071d4279SBram Moolenaar {"PyErr_SetString", (PYTHON_PROC*)&dll_PyErr_SetString}, 5064d188da2SBram Moolenaar {"PyErr_SetObject", (PYTHON_PROC*)&dll_PyErr_SetObject}, 507c09a6d6cSBram Moolenaar {"PyErr_ExceptionMatches", (PYTHON_PROC*)&dll_PyErr_ExceptionMatches}, 508071d4279SBram Moolenaar {"PyEval_InitThreads", (PYTHON_PROC*)&dll_PyEval_InitThreads}, 509071d4279SBram Moolenaar {"PyEval_RestoreThread", (PYTHON_PROC*)&dll_PyEval_RestoreThread}, 510071d4279SBram Moolenaar {"PyEval_SaveThread", (PYTHON_PROC*)&dll_PyEval_SaveThread}, 511071d4279SBram Moolenaar # ifdef PY_CAN_RECURSE 512071d4279SBram Moolenaar {"PyGILState_Ensure", (PYTHON_PROC*)&dll_PyGILState_Ensure}, 513071d4279SBram Moolenaar {"PyGILState_Release", (PYTHON_PROC*)&dll_PyGILState_Release}, 514071d4279SBram Moolenaar # endif 515071d4279SBram Moolenaar {"PyInt_AsLong", (PYTHON_PROC*)&dll_PyInt_AsLong}, 516071d4279SBram Moolenaar {"PyInt_FromLong", (PYTHON_PROC*)&dll_PyInt_FromLong}, 517db913953SBram Moolenaar {"PyLong_AsLong", (PYTHON_PROC*)&dll_PyLong_AsLong}, 518db913953SBram Moolenaar {"PyLong_FromLong", (PYTHON_PROC*)&dll_PyLong_FromLong}, 51966b7985eSBram Moolenaar {"PyBool_Type", (PYTHON_PROC*)&dll_PyBool_Type}, 520071d4279SBram Moolenaar {"PyInt_Type", (PYTHON_PROC*)&dll_PyInt_Type}, 521db913953SBram Moolenaar {"PyLong_Type", (PYTHON_PROC*)&dll_PyLong_Type}, 522071d4279SBram Moolenaar {"PyList_GetItem", (PYTHON_PROC*)&dll_PyList_GetItem}, 5230ac9379aSBram Moolenaar {"PyList_Append", (PYTHON_PROC*)&dll_PyList_Append}, 524c09a6d6cSBram Moolenaar {"PyList_Insert", (PYTHON_PROC*)&dll_PyList_Insert}, 525071d4279SBram Moolenaar {"PyList_New", (PYTHON_PROC*)&dll_PyList_New}, 526071d4279SBram Moolenaar {"PyList_SetItem", (PYTHON_PROC*)&dll_PyList_SetItem}, 527071d4279SBram Moolenaar {"PyList_Size", (PYTHON_PROC*)&dll_PyList_Size}, 528071d4279SBram Moolenaar {"PyList_Type", (PYTHON_PROC*)&dll_PyList_Type}, 529db913953SBram Moolenaar {"PySequence_Size", (PYTHON_PROC*)&dll_PySequence_Size}, 530db913953SBram Moolenaar {"PySequence_Check", (PYTHON_PROC*)&dll_PySequence_Check}, 531a9922d62SBram Moolenaar {"PySequence_GetItem", (PYTHON_PROC*)&dll_PySequence_GetItem}, 532a9922d62SBram Moolenaar {"PySequence_Fast", (PYTHON_PROC*)&dll_PySequence_Fast}, 533db913953SBram Moolenaar {"PyTuple_GetItem", (PYTHON_PROC*)&dll_PyTuple_GetItem}, 534db913953SBram Moolenaar {"PyTuple_Size", (PYTHON_PROC*)&dll_PyTuple_Size}, 535db913953SBram Moolenaar {"PyTuple_Type", (PYTHON_PROC*)&dll_PyTuple_Type}, 536063a46baSBram Moolenaar {"PySlice_GetIndicesEx", (PYTHON_PROC*)&dll_PySlice_GetIndicesEx}, 537071d4279SBram Moolenaar {"PyImport_ImportModule", (PYTHON_PROC*)&dll_PyImport_ImportModule}, 538071d4279SBram Moolenaar {"PyDict_GetItemString", (PYTHON_PROC*)&dll_PyDict_GetItemString}, 539db913953SBram Moolenaar {"PyDict_Next", (PYTHON_PROC*)&dll_PyDict_Next}, 5400ac9379aSBram Moolenaar {"PyDict_New", (PYTHON_PROC*)&dll_PyDict_New}, 5413e734ea2SBram Moolenaar {"PyDict_Type", (PYTHON_PROC*)&dll_PyDict_Type}, 542bcb40977SBram Moolenaar # ifndef PY_NO_MAPPING_KEYS 543bcb40977SBram Moolenaar {"PyMapping_Keys", (PYTHON_PROC*)&dll_PyMapping_Keys}, 544db913953SBram Moolenaar # endif 545bcb40977SBram Moolenaar {"PyObject_GetItem", (PYTHON_PROC*)&dll_PyObject_GetItem}, 546db913953SBram Moolenaar {"PyObject_CallMethod", (PYTHON_PROC*)&dll_PyObject_CallMethod}, 547db913953SBram Moolenaar {"PyMapping_Check", (PYTHON_PROC*)&dll_PyMapping_Check}, 548db913953SBram Moolenaar {"PyIter_Next", (PYTHON_PROC*)&dll_PyIter_Next}, 549071d4279SBram Moolenaar {"PyModule_GetDict", (PYTHON_PROC*)&dll_PyModule_GetDict}, 550f9c9b32bSBram Moolenaar {"PyModule_AddObject", (PYTHON_PROC*)&dll_PyModule_AddObject}, 551071d4279SBram Moolenaar {"PyRun_SimpleString", (PYTHON_PROC*)&dll_PyRun_SimpleString}, 552db913953SBram Moolenaar {"PyRun_String", (PYTHON_PROC*)&dll_PyRun_String}, 553d620aa9bSBram Moolenaar {"PyObject_GetAttrString", (PYTHON_PROC*)&dll_PyObject_GetAttrString}, 554a9922d62SBram Moolenaar {"PyObject_HasAttrString", (PYTHON_PROC*)&dll_PyObject_HasAttrString}, 555d620aa9bSBram Moolenaar {"PyObject_SetAttrString", (PYTHON_PROC*)&dll_PyObject_SetAttrString}, 556d620aa9bSBram Moolenaar {"PyObject_CallFunctionObjArgs", (PYTHON_PROC*)&dll_PyObject_CallFunctionObjArgs}, 5579f3685a5SBram Moolenaar {"PyObject_CallFunction", (PYTHON_PROC*)&dll_PyObject_CallFunction}, 558f4258308SBram Moolenaar {"PyObject_Call", (PYTHON_PROC*)&dll_PyObject_Call}, 559141be8a5SBram Moolenaar {"PyObject_Repr", (PYTHON_PROC*)&dll_PyObject_Repr}, 560071d4279SBram Moolenaar {"PyString_AsString", (PYTHON_PROC*)&dll_PyString_AsString}, 561cdab9051SBram Moolenaar {"PyString_AsStringAndSize", (PYTHON_PROC*)&dll_PyString_AsStringAndSize}, 562071d4279SBram Moolenaar {"PyString_FromString", (PYTHON_PROC*)&dll_PyString_FromString}, 5631a3b5695SBram Moolenaar {"PyString_FromFormat", (PYTHON_PROC*)&dll_PyString_FromFormat}, 564071d4279SBram Moolenaar {"PyString_FromStringAndSize", (PYTHON_PROC*)&dll_PyString_FromStringAndSize}, 565071d4279SBram Moolenaar {"PyString_Size", (PYTHON_PROC*)&dll_PyString_Size}, 566071d4279SBram Moolenaar {"PyString_Type", (PYTHON_PROC*)&dll_PyString_Type}, 567db913953SBram Moolenaar {"PyUnicode_Type", (PYTHON_PROC*)&dll_PyUnicode_Type}, 568db913953SBram Moolenaar {"PyFloat_Type", (PYTHON_PROC*)&dll_PyFloat_Type}, 569db913953SBram Moolenaar {"PyFloat_AsDouble", (PYTHON_PROC*)&dll_PyFloat_AsDouble}, 570db913953SBram Moolenaar {"PyFloat_FromDouble", (PYTHON_PROC*)&dll_PyFloat_FromDouble}, 571db913953SBram Moolenaar {"PyImport_AddModule", (PYTHON_PROC*)&dll_PyImport_AddModule}, 572141be8a5SBram Moolenaar {"PyNumber_Check", (PYTHON_PROC*)&dll_PyNumber_Check}, 573141be8a5SBram Moolenaar {"PyNumber_Long", (PYTHON_PROC*)&dll_PyNumber_Long}, 574071d4279SBram Moolenaar {"PySys_SetObject", (PYTHON_PROC*)&dll_PySys_SetObject}, 575c09a6d6cSBram Moolenaar {"PySys_GetObject", (PYTHON_PROC*)&dll_PySys_GetObject}, 576071d4279SBram Moolenaar {"PySys_SetArgv", (PYTHON_PROC*)&dll_PySys_SetArgv}, 577071d4279SBram Moolenaar {"PyType_Type", (PYTHON_PROC*)&dll_PyType_Type}, 578063a46baSBram Moolenaar {"PySlice_Type", (PYTHON_PROC*)&dll_PySlice_Type}, 57930fec7bcSBram Moolenaar {"PyType_Ready", (PYTHON_PROC*)&dll_PyType_Ready}, 580a9922d62SBram Moolenaar {"PyType_GenericAlloc", (PYTHON_PROC*)&dll_PyType_GenericAlloc}, 581071d4279SBram Moolenaar {"Py_FindMethod", (PYTHON_PROC*)&dll_Py_FindMethod}, 582644d37b8SBram Moolenaar {"Py_SetPythonHome", (PYTHON_PROC*)&dll_Py_SetPythonHome}, 583071d4279SBram Moolenaar {"Py_Initialize", (PYTHON_PROC*)&dll_Py_Initialize}, 5840e21a3f6SBram Moolenaar {"Py_Finalize", (PYTHON_PROC*)&dll_Py_Finalize}, 5850e21a3f6SBram Moolenaar {"Py_IsInitialized", (PYTHON_PROC*)&dll_Py_IsInitialized}, 586071d4279SBram Moolenaar {"_PyObject_New", (PYTHON_PROC*)&dll__PyObject_New}, 587774267bbSBram Moolenaar {"_PyObject_GC_New", (PYTHON_PROC*)&dll__PyObject_GC_New}, 5883e734ea2SBram Moolenaar # ifdef Py_underscore_GC 5893e734ea2SBram Moolenaar {"_PyObject_GC_Del", (PYTHON_PROC*)&dll__PyObject_GC_Del}, 5903e734ea2SBram Moolenaar {"_PyObject_GC_UnTrack", (PYTHON_PROC*)&dll__PyObject_GC_UnTrack}, 5913e734ea2SBram Moolenaar # else 592774267bbSBram Moolenaar {"PyObject_GC_Del", (PYTHON_PROC*)&dll_PyObject_GC_Del}, 593774267bbSBram Moolenaar {"PyObject_GC_UnTrack", (PYTHON_PROC*)&dll_PyObject_GC_UnTrack}, 5943e734ea2SBram Moolenaar # endif 595071d4279SBram Moolenaar {"PyObject_Init", (PYTHON_PROC*)&dll__PyObject_Init}, 596db913953SBram Moolenaar {"PyObject_GetIter", (PYTHON_PROC*)&dll_PyObject_GetIter}, 59703db85b3SBram Moolenaar {"PyObject_IsTrue", (PYTHON_PROC*)&dll_PyObject_IsTrue}, 598e721122bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 599db913953SBram Moolenaar {"_PyObject_NextNotImplemented", (PYTHON_PROC*)&dll__PyObject_NextNotImplemented}, 600e721122bSBram Moolenaar # endif 601071d4279SBram Moolenaar {"_Py_NoneStruct", (PYTHON_PROC*)&dll__Py_NoneStruct}, 60266b7985eSBram Moolenaar {"_Py_ZeroStruct", (PYTHON_PROC*)&dll__Py_ZeroStruct}, 60366b7985eSBram Moolenaar {"_Py_TrueStruct", (PYTHON_PROC*)&dll__Py_TrueStruct}, 604071d4279SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000 6050014a53aSBram Moolenaar # ifdef Py_DEBUG 6060014a53aSBram Moolenaar {"_Py_NegativeRefcount", (PYTHON_PROC*)&dll__Py_NegativeRefcount}, 6070014a53aSBram Moolenaar {"_Py_RefTotal", (PYTHON_PROC*)&dll__Py_RefTotal}, 6080014a53aSBram Moolenaar {"_Py_Dealloc", (PYTHON_PROC*)&dll__Py_Dealloc}, 6090014a53aSBram Moolenaar # endif 6103e734ea2SBram Moolenaar {"PyType_IsSubtype", (PYTHON_PROC*)&dll_PyType_IsSubtype}, 6113e734ea2SBram Moolenaar # endif 6123e734ea2SBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000 6130014a53aSBram Moolenaar # if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC) 6140014a53aSBram Moolenaar {"_PyObject_DebugFree", (PYTHON_PROC*)&dll__PyObject_DebugFree}, 6150014a53aSBram Moolenaar {"_PyObject_DebugMalloc", (PYTHON_PROC*)&dll__PyObject_DebugMalloc}, 6160014a53aSBram Moolenaar # else 617071d4279SBram Moolenaar {"PyObject_Malloc", (PYTHON_PROC*)&dll_PyObject_Malloc}, 618071d4279SBram Moolenaar {"PyObject_Free", (PYTHON_PROC*)&dll_PyObject_Free}, 619071d4279SBram Moolenaar # endif 6200014a53aSBram Moolenaar # endif 6210014a53aSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000 \ 622a2aa31a9SBram Moolenaar && SIZEOF_SIZE_T != VIM_SIZEOF_INT 6230014a53aSBram Moolenaar # ifdef Py_DEBUG 6240014a53aSBram Moolenaar {"Py_InitModule4TraceRefs_64", (PYTHON_PROC*)&dll_Py_InitModule4}, 6250014a53aSBram Moolenaar # else 6260014a53aSBram Moolenaar {"Py_InitModule4_64", (PYTHON_PROC*)&dll_Py_InitModule4}, 6270014a53aSBram Moolenaar # endif 6280014a53aSBram Moolenaar # else 6290014a53aSBram Moolenaar # ifdef Py_DEBUG 6300014a53aSBram Moolenaar {"Py_InitModule4TraceRefs", (PYTHON_PROC*)&dll_Py_InitModule4}, 6310014a53aSBram Moolenaar # else 6320014a53aSBram Moolenaar {"Py_InitModule4", (PYTHON_PROC*)&dll_Py_InitModule4}, 6330014a53aSBram Moolenaar # endif 6340014a53aSBram Moolenaar # endif 6352afa3238SBram Moolenaar # ifdef PY_USE_CAPSULE 636db913953SBram Moolenaar {"PyCapsule_New", (PYTHON_PROC*)&dll_PyCapsule_New}, 637db913953SBram Moolenaar {"PyCapsule_GetPointer", (PYTHON_PROC*)&dll_PyCapsule_GetPointer}, 6382afa3238SBram Moolenaar # else 6392afa3238SBram Moolenaar {"PyCObject_FromVoidPtr", (PYTHON_PROC*)&dll_PyCObject_FromVoidPtr}, 6402afa3238SBram Moolenaar {"PyCObject_AsVoidPtr", (PYTHON_PROC*)&dll_PyCObject_AsVoidPtr}, 6412afa3238SBram Moolenaar # endif 64212a28d4bSBram Moolenaar # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 64312a28d4bSBram Moolenaar {"Py_NoSiteFlag", (PYTHON_PROC*)&dll_Py_NoSiteFlag}, 64412a28d4bSBram Moolenaar # endif 645071d4279SBram Moolenaar {"", NULL}, 646071d4279SBram Moolenaar }; 647071d4279SBram Moolenaar 648071d4279SBram Moolenaar /* 649071d4279SBram Moolenaar * Free python.dll 650071d4279SBram Moolenaar */ 651071d4279SBram Moolenaar static void 652071d4279SBram Moolenaar end_dynamic_python(void) 653071d4279SBram Moolenaar { 654071d4279SBram Moolenaar if (hinstPython) 655071d4279SBram Moolenaar { 656bd5e15fdSBram Moolenaar close_dll(hinstPython); 657071d4279SBram Moolenaar hinstPython = 0; 658071d4279SBram Moolenaar } 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; 670cc3e85f1SBram Moolenaar void *ucs_as_encoded_string; 671071d4279SBram Moolenaar 672644d37b8SBram Moolenaar #if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON3) 673b744b2faSBram Moolenaar /* Can't have Python and Python3 loaded at the same time. 674b744b2faSBram Moolenaar * It cause a crash, because RTLD_GLOBAL is needed for 675b744b2faSBram Moolenaar * standard C extension libraries of one or both python versions. */ 6764c3a326cSBram Moolenaar if (python3_loaded()) 6774c3a326cSBram Moolenaar { 6789dc93ae4SBram Moolenaar if (verbose) 679b744b2faSBram Moolenaar EMSG(_("E836: This Vim cannot execute :python after using :py3")); 6804c3a326cSBram Moolenaar return FAIL; 6814c3a326cSBram Moolenaar } 6824c3a326cSBram Moolenaar #endif 6834c3a326cSBram Moolenaar 684071d4279SBram Moolenaar if (hinstPython) 685071d4279SBram Moolenaar return OK; 686bd5e15fdSBram Moolenaar hinstPython = load_dll(libname); 687071d4279SBram Moolenaar if (!hinstPython) 688071d4279SBram Moolenaar { 689071d4279SBram Moolenaar if (verbose) 690071d4279SBram Moolenaar EMSG2(_(e_loadlib), libname); 691071d4279SBram Moolenaar return FAIL; 692071d4279SBram Moolenaar } 693071d4279SBram Moolenaar 694071d4279SBram Moolenaar for (i = 0; python_funcname_table[i].ptr; ++i) 695071d4279SBram Moolenaar { 696bd5e15fdSBram Moolenaar if ((*python_funcname_table[i].ptr = symbol_from_dll(hinstPython, 697071d4279SBram Moolenaar python_funcname_table[i].name)) == NULL) 698071d4279SBram Moolenaar { 699bd5e15fdSBram Moolenaar close_dll(hinstPython); 700071d4279SBram Moolenaar hinstPython = 0; 701071d4279SBram Moolenaar if (verbose) 702071d4279SBram Moolenaar EMSG2(_(e_loadfunc), python_funcname_table[i].name); 703071d4279SBram Moolenaar return FAIL; 704071d4279SBram Moolenaar } 705071d4279SBram Moolenaar } 706cc3e85f1SBram Moolenaar 707cc3e85f1SBram Moolenaar /* Load unicode functions separately as only the ucs2 or the ucs4 functions 708cc3e85f1SBram Moolenaar * will be present in the library. */ 709cc3e85f1SBram Moolenaar ucs_as_encoded_string = symbol_from_dll(hinstPython, 710cc3e85f1SBram Moolenaar "PyUnicodeUCS2_AsEncodedString"); 711cc3e85f1SBram Moolenaar if (ucs_as_encoded_string == NULL) 712cc3e85f1SBram Moolenaar ucs_as_encoded_string = symbol_from_dll(hinstPython, 713cc3e85f1SBram Moolenaar "PyUnicodeUCS4_AsEncodedString"); 714cc3e85f1SBram Moolenaar if (ucs_as_encoded_string != NULL) 715cc3e85f1SBram Moolenaar py_PyUnicode_AsEncodedString = ucs_as_encoded_string; 716cc3e85f1SBram Moolenaar else 717cc3e85f1SBram Moolenaar { 718cc3e85f1SBram Moolenaar close_dll(hinstPython); 719cc3e85f1SBram Moolenaar hinstPython = 0; 720cc3e85f1SBram Moolenaar if (verbose) 721cc3e85f1SBram Moolenaar EMSG2(_(e_loadfunc), "PyUnicode_UCSX_*"); 722cc3e85f1SBram Moolenaar return FAIL; 723cc3e85f1SBram Moolenaar } 724cc3e85f1SBram Moolenaar 725071d4279SBram Moolenaar return OK; 726071d4279SBram Moolenaar } 727071d4279SBram Moolenaar 728071d4279SBram Moolenaar /* 729071d4279SBram Moolenaar * If python is enabled (there is installed python on Windows system) return 730071d4279SBram Moolenaar * TRUE, else FALSE. 731071d4279SBram Moolenaar */ 732071d4279SBram Moolenaar int 733e7cb9cf6SBram Moolenaar python_enabled(int verbose) 734071d4279SBram Moolenaar { 735*25e4fcdeSBram Moolenaar return python_runtime_link_init((char *)p_pydll, verbose) == OK; 736071d4279SBram Moolenaar } 737071d4279SBram Moolenaar 738ca8a4dfeSBram Moolenaar /* 739ca8a4dfeSBram Moolenaar * Load the standard Python exceptions - don't import the symbols from the 740071d4279SBram Moolenaar * DLL, as this can cause errors (importing data symbols is not reliable). 741071d4279SBram Moolenaar */ 742071d4279SBram Moolenaar static void 743ca8a4dfeSBram Moolenaar get_exceptions(void) 744071d4279SBram Moolenaar { 745071d4279SBram Moolenaar PyObject *exmod = PyImport_ImportModule("exceptions"); 746071d4279SBram Moolenaar PyObject *exdict = PyModule_GetDict(exmod); 747071d4279SBram Moolenaar imp_PyExc_AttributeError = PyDict_GetItemString(exdict, "AttributeError"); 748071d4279SBram Moolenaar imp_PyExc_IndexError = PyDict_GetItemString(exdict, "IndexError"); 749af6abb9dSBram Moolenaar imp_PyExc_KeyError = PyDict_GetItemString(exdict, "KeyError"); 750071d4279SBram Moolenaar imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt"); 751071d4279SBram Moolenaar imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError"); 752071d4279SBram Moolenaar imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError"); 75341009374SBram Moolenaar imp_PyExc_SystemExit = PyDict_GetItemString(exdict, "SystemExit"); 7548661b178SBram Moolenaar imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError"); 755c09a6d6cSBram Moolenaar imp_PyExc_ImportError = PyDict_GetItemString(exdict, "ImportError"); 756141be8a5SBram Moolenaar imp_PyExc_OverflowError = PyDict_GetItemString(exdict, "OverflowError"); 757071d4279SBram Moolenaar Py_XINCREF(imp_PyExc_AttributeError); 758071d4279SBram Moolenaar Py_XINCREF(imp_PyExc_IndexError); 759af6abb9dSBram Moolenaar Py_XINCREF(imp_PyExc_KeyError); 760071d4279SBram Moolenaar Py_XINCREF(imp_PyExc_KeyboardInterrupt); 761071d4279SBram Moolenaar Py_XINCREF(imp_PyExc_TypeError); 762071d4279SBram Moolenaar Py_XINCREF(imp_PyExc_ValueError); 76341009374SBram Moolenaar Py_XINCREF(imp_PyExc_SystemExit); 7648661b178SBram Moolenaar Py_XINCREF(imp_PyExc_RuntimeError); 765c09a6d6cSBram Moolenaar Py_XINCREF(imp_PyExc_ImportError); 766141be8a5SBram Moolenaar Py_XINCREF(imp_PyExc_OverflowError); 767071d4279SBram Moolenaar Py_XDECREF(exmod); 768071d4279SBram Moolenaar } 769071d4279SBram Moolenaar #endif /* DYNAMIC_PYTHON */ 770071d4279SBram Moolenaar 771db913953SBram Moolenaar static int initialised = 0; 772db913953SBram Moolenaar #define PYINITIALISED initialised 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 823071d4279SBram Moolenaar /****************************************************** 824071d4279SBram Moolenaar * Internal function prototypes. 825071d4279SBram Moolenaar */ 826071d4279SBram Moolenaar 827071d4279SBram Moolenaar static int PythonMod_Init(void); 828071d4279SBram Moolenaar 829071d4279SBram Moolenaar 830071d4279SBram Moolenaar /****************************************************** 831071d4279SBram Moolenaar * 1. Python interpreter main program. 832071d4279SBram Moolenaar */ 833071d4279SBram Moolenaar 834071d4279SBram Moolenaar #if PYTHON_API_VERSION < 1007 /* Python 1.4 */ 835071d4279SBram Moolenaar typedef PyObject PyThreadState; 8369ba0eb85SBram Moolenaar #endif 837071d4279SBram Moolenaar 83871700b89SBram Moolenaar #ifndef PY_CAN_RECURSE 839071d4279SBram Moolenaar static PyThreadState *saved_python_thread = NULL; 840071d4279SBram Moolenaar 841071d4279SBram Moolenaar /* 842071d4279SBram Moolenaar * Suspend a thread of the Python interpreter, other threads are allowed to 843071d4279SBram Moolenaar * run. 844071d4279SBram Moolenaar */ 845293ee4d4SBram Moolenaar static void 846293ee4d4SBram Moolenaar Python_SaveThread(void) 847071d4279SBram Moolenaar { 848071d4279SBram Moolenaar saved_python_thread = PyEval_SaveThread(); 849071d4279SBram Moolenaar } 850071d4279SBram Moolenaar 851071d4279SBram Moolenaar /* 852071d4279SBram Moolenaar * Restore a thread of the Python interpreter, waits for other threads to 853071d4279SBram Moolenaar * block. 854071d4279SBram Moolenaar */ 855293ee4d4SBram Moolenaar static void 856293ee4d4SBram Moolenaar Python_RestoreThread(void) 857071d4279SBram Moolenaar { 858071d4279SBram Moolenaar PyEval_RestoreThread(saved_python_thread); 859071d4279SBram Moolenaar saved_python_thread = NULL; 8609ba0eb85SBram Moolenaar } 86171700b89SBram Moolenaar #endif 862071d4279SBram Moolenaar 863071d4279SBram Moolenaar void 864071d4279SBram Moolenaar python_end() 865071d4279SBram Moolenaar { 866a5792f58SBram Moolenaar static int recurse = 0; 867a5792f58SBram Moolenaar 868a5792f58SBram Moolenaar /* If a crash occurs while doing this, don't try again. */ 869a5792f58SBram Moolenaar if (recurse != 0) 870a5792f58SBram Moolenaar return; 871a5792f58SBram Moolenaar 872a5792f58SBram Moolenaar ++recurse; 873a5792f58SBram Moolenaar 874071d4279SBram Moolenaar #ifdef DYNAMIC_PYTHON 8750e21a3f6SBram Moolenaar if (hinstPython && Py_IsInitialized()) 8769ba0eb85SBram Moolenaar { 87771700b89SBram Moolenaar # ifdef PY_CAN_RECURSE 87871700b89SBram Moolenaar PyGILState_Ensure(); 87971700b89SBram Moolenaar # else 8809ba0eb85SBram Moolenaar Python_RestoreThread(); /* enter python */ 88171700b89SBram Moolenaar # endif 8820e21a3f6SBram Moolenaar Py_Finalize(); 8839ba0eb85SBram Moolenaar } 884071d4279SBram Moolenaar end_dynamic_python(); 8850e21a3f6SBram Moolenaar #else 8860e21a3f6SBram Moolenaar if (Py_IsInitialized()) 8879ba0eb85SBram Moolenaar { 88871700b89SBram Moolenaar # ifdef PY_CAN_RECURSE 88971700b89SBram Moolenaar PyGILState_Ensure(); 89071700b89SBram Moolenaar # else 8919ba0eb85SBram Moolenaar Python_RestoreThread(); /* enter python */ 89271700b89SBram Moolenaar # endif 8930e21a3f6SBram Moolenaar Py_Finalize(); 8949ba0eb85SBram Moolenaar } 895071d4279SBram Moolenaar #endif 896a5792f58SBram Moolenaar 897a5792f58SBram Moolenaar --recurse; 898071d4279SBram Moolenaar } 899071d4279SBram Moolenaar 9004c3a326cSBram Moolenaar #if (defined(DYNAMIC_PYTHON) && defined(FEAT_PYTHON3)) || defined(PROTO) 9014c3a326cSBram Moolenaar int 9024c3a326cSBram Moolenaar python_loaded() 9034c3a326cSBram Moolenaar { 9044c3a326cSBram Moolenaar return (hinstPython != 0); 9054c3a326cSBram Moolenaar } 9064c3a326cSBram Moolenaar #endif 9074c3a326cSBram 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 { 920071d4279SBram 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 925644d37b8SBram Moolenaar #ifdef PYTHON_HOME 9261000565cSBram Moolenaar # ifdef DYNAMIC_PYTHON 9271000565cSBram Moolenaar if (mch_getenv((char_u *)"PYTHONHOME") == NULL) 9281000565cSBram Moolenaar # endif 929644d37b8SBram Moolenaar Py_SetPythonHome(PYTHON_HOME); 930644d37b8SBram Moolenaar #endif 931644d37b8SBram Moolenaar 932170bf1aeSBram Moolenaar init_structs(); 933170bf1aeSBram Moolenaar 93412a28d4bSBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 93512a28d4bSBram Moolenaar /* Disable implicit 'import site', because it may cause Vim to exit 93612a28d4bSBram Moolenaar * when it can't be found. */ 93712a28d4bSBram Moolenaar Py_NoSiteFlag++; 93812a28d4bSBram Moolenaar #endif 93912a28d4bSBram Moolenaar 940071d4279SBram Moolenaar #if !defined(MACOS) || defined(MACOS_X_UNIX) 941071d4279SBram Moolenaar Py_Initialize(); 942071d4279SBram Moolenaar #else 943071d4279SBram Moolenaar PyMac_Initialize(); 944071d4279SBram Moolenaar #endif 94512a28d4bSBram Moolenaar 94612a28d4bSBram Moolenaar #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000 94712a28d4bSBram Moolenaar /* 'import site' explicitly. */ 94812a28d4bSBram Moolenaar site = PyImport_ImportModule("site"); 94912a28d4bSBram Moolenaar if (site == NULL) 95012a28d4bSBram Moolenaar { 95112a28d4bSBram Moolenaar EMSG(_("E887: Sorry, this command is disabled, the Python's site module could not be loaded.")); 95212a28d4bSBram Moolenaar goto fail; 95312a28d4bSBram Moolenaar } 95412a28d4bSBram Moolenaar Py_DECREF(site); 95512a28d4bSBram Moolenaar #endif 95612a28d4bSBram Moolenaar 95702366255SBram Moolenaar /* Initialise threads, and below save the state using 95876d711c3SBram Moolenaar * PyEval_SaveThread. Without the call to PyEval_SaveThread, thread 95902366255SBram Moolenaar * specific state (such as the system trace hook), will be lost 96002366255SBram Moolenaar * between invocations of Python code. */ 961071d4279SBram Moolenaar PyEval_InitThreads(); 962071d4279SBram Moolenaar #ifdef DYNAMIC_PYTHON 963071d4279SBram Moolenaar get_exceptions(); 964071d4279SBram Moolenaar #endif 965071d4279SBram Moolenaar 9661dc28783SBram Moolenaar if (PythonIO_Init_io()) 967071d4279SBram Moolenaar goto fail; 968071d4279SBram Moolenaar 969071d4279SBram Moolenaar if (PythonMod_Init()) 970071d4279SBram Moolenaar goto fail; 971071d4279SBram Moolenaar 972db913953SBram Moolenaar globals = PyModule_GetDict(PyImport_AddModule("__main__")); 973db913953SBram Moolenaar 9749774ecc8SBram Moolenaar /* Remove the element from sys.path that was added because of our 9759774ecc8SBram Moolenaar * argv[0] value in PythonMod_Init(). Previously we used an empty 97684a05accSBram Moolenaar * string, but depending on the OS we then get an empty entry or 9779774ecc8SBram Moolenaar * the current directory in sys.path. */ 9789774ecc8SBram Moolenaar PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)"); 9799774ecc8SBram Moolenaar 98076d711c3SBram Moolenaar /* lock is created and acquired in PyEval_InitThreads() and thread 98176d711c3SBram Moolenaar * state is created in Py_Initialize() 98276d711c3SBram Moolenaar * there _PyGILState_NoteThreadState() also sets gilcounter to 1 98376d711c3SBram Moolenaar * (python must have threads enabled!) 98476d711c3SBram Moolenaar * so the following does both: unlock GIL and save thread state in TLS 98576d711c3SBram Moolenaar * without deleting thread state 98676d711c3SBram Moolenaar */ 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: 998071d4279SBram Moolenaar /* We call PythonIO_Flush() here to print any Python errors. 999071d4279SBram Moolenaar * This is OK, as it is possible to call this function even 10001dc28783SBram Moolenaar * if PythonIO_Init_io() has not completed successfully (it will 1001071d4279SBram Moolenaar * not do anything in this case). 1002071d4279SBram Moolenaar */ 1003071d4279SBram Moolenaar PythonIO_Flush(); 1004071d4279SBram Moolenaar return -1; 1005071d4279SBram Moolenaar } 1006071d4279SBram Moolenaar 1007071d4279SBram Moolenaar /* 1008071d4279SBram Moolenaar * External interface 1009071d4279SBram Moolenaar */ 1010071d4279SBram Moolenaar static void 1011b52f4c02SBram Moolenaar DoPyCommand(const char *cmd, rangeinitializer init_range, runner run, void *arg) 1012071d4279SBram Moolenaar { 10139ba0eb85SBram Moolenaar #ifndef PY_CAN_RECURSE 1014071d4279SBram Moolenaar static int recursive = 0; 1015071d4279SBram Moolenaar #endif 1016071d4279SBram Moolenaar #if defined(MACOS) && !defined(MACOS_X_UNIX) 1017071d4279SBram Moolenaar GrafPtr oldPort; 1018071d4279SBram Moolenaar #endif 1019071d4279SBram Moolenaar #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) 1020071d4279SBram Moolenaar char *saved_locale; 1021071d4279SBram Moolenaar #endif 102271700b89SBram Moolenaar #ifdef PY_CAN_RECURSE 102371700b89SBram Moolenaar PyGILState_STATE pygilstate; 102471700b89SBram Moolenaar #endif 1025071d4279SBram Moolenaar 1026071d4279SBram Moolenaar #ifndef PY_CAN_RECURSE 1027071d4279SBram Moolenaar if (recursive) 1028071d4279SBram Moolenaar { 1029071d4279SBram Moolenaar EMSG(_("E659: Cannot invoke Python recursively")); 1030071d4279SBram Moolenaar return; 1031071d4279SBram Moolenaar } 1032071d4279SBram Moolenaar ++recursive; 1033071d4279SBram Moolenaar #endif 1034071d4279SBram Moolenaar 1035071d4279SBram Moolenaar #if defined(MACOS) && !defined(MACOS_X_UNIX) 1036071d4279SBram Moolenaar GetPort(&oldPort); 1037071d4279SBram Moolenaar /* Check if the Python library is available */ 1038071d4279SBram Moolenaar if ((Ptr)PyMac_Initialize == (Ptr)kUnresolvedCFragSymbolAddress) 1039071d4279SBram Moolenaar goto theend; 1040071d4279SBram Moolenaar #endif 1041071d4279SBram Moolenaar if (Python_Init()) 1042071d4279SBram Moolenaar goto theend; 1043071d4279SBram Moolenaar 1044b52f4c02SBram Moolenaar init_range(arg); 1045b52f4c02SBram Moolenaar 1046071d4279SBram Moolenaar Python_Release_Vim(); /* leave vim */ 1047071d4279SBram Moolenaar 1048071d4279SBram Moolenaar #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) 1049071d4279SBram Moolenaar /* Python only works properly when the LC_NUMERIC locale is "C". */ 1050071d4279SBram Moolenaar saved_locale = setlocale(LC_NUMERIC, NULL); 1051071d4279SBram Moolenaar if (saved_locale == NULL || STRCMP(saved_locale, "C") == 0) 1052071d4279SBram Moolenaar saved_locale = NULL; 1053071d4279SBram Moolenaar else 1054071d4279SBram Moolenaar { 1055071d4279SBram Moolenaar /* Need to make a copy, value may change when setting new locale. */ 1056e9ba516bSBram Moolenaar saved_locale = (char *) PY_STRSAVE(saved_locale); 1057071d4279SBram Moolenaar (void)setlocale(LC_NUMERIC, "C"); 1058071d4279SBram Moolenaar } 1059071d4279SBram Moolenaar #endif 1060071d4279SBram Moolenaar 106171700b89SBram Moolenaar #ifdef PY_CAN_RECURSE 106271700b89SBram Moolenaar pygilstate = PyGILState_Ensure(); 106371700b89SBram Moolenaar #else 1064071d4279SBram Moolenaar Python_RestoreThread(); /* enter python */ 106571700b89SBram Moolenaar #endif 1066071d4279SBram Moolenaar 10672a0f3d3fSBram Moolenaar run((char *) cmd, arg 10682a0f3d3fSBram Moolenaar #ifdef PY_CAN_RECURSE 10692a0f3d3fSBram Moolenaar , &pygilstate 10702a0f3d3fSBram Moolenaar #endif 10712a0f3d3fSBram Moolenaar ); 1072071d4279SBram Moolenaar 107371700b89SBram Moolenaar #ifdef PY_CAN_RECURSE 107471700b89SBram Moolenaar PyGILState_Release(pygilstate); 107571700b89SBram Moolenaar #else 1076071d4279SBram Moolenaar Python_SaveThread(); /* leave python */ 107771700b89SBram Moolenaar #endif 1078071d4279SBram Moolenaar 1079071d4279SBram Moolenaar #if defined(HAVE_LOCALE_H) || defined(X_LOCALE) 1080071d4279SBram Moolenaar if (saved_locale != NULL) 1081071d4279SBram Moolenaar { 1082071d4279SBram Moolenaar (void)setlocale(LC_NUMERIC, saved_locale); 1083e9ba516bSBram Moolenaar PyMem_Free(saved_locale); 1084071d4279SBram Moolenaar } 1085071d4279SBram Moolenaar #endif 1086071d4279SBram Moolenaar 1087071d4279SBram Moolenaar Python_Lock_Vim(); /* enter vim */ 1088071d4279SBram Moolenaar PythonIO_Flush(); 1089071d4279SBram Moolenaar #if defined(MACOS) && !defined(MACOS_X_UNIX) 1090071d4279SBram Moolenaar SetPort(oldPort); 1091071d4279SBram Moolenaar #endif 1092071d4279SBram Moolenaar 1093071d4279SBram Moolenaar theend: 1094071d4279SBram Moolenaar #ifndef PY_CAN_RECURSE 1095071d4279SBram Moolenaar --recursive; 1096071d4279SBram Moolenaar #endif 1097db913953SBram Moolenaar return; 1098071d4279SBram Moolenaar } 1099071d4279SBram Moolenaar 1100071d4279SBram Moolenaar /* 1101071d4279SBram Moolenaar * ":python" 1102071d4279SBram Moolenaar */ 1103071d4279SBram Moolenaar void 1104071d4279SBram Moolenaar ex_python(exarg_T *eap) 1105071d4279SBram Moolenaar { 1106071d4279SBram Moolenaar char_u *script; 1107071d4279SBram Moolenaar 1108071d4279SBram Moolenaar script = script_get(eap, eap->arg); 1109071d4279SBram Moolenaar if (!eap->skip) 1110071d4279SBram Moolenaar { 1111b52f4c02SBram Moolenaar DoPyCommand(script == NULL ? (char *) eap->arg : (char *) script, 1112b52f4c02SBram Moolenaar (rangeinitializer) init_range_cmd, 1113b52f4c02SBram Moolenaar (runner) run_cmd, 1114b52f4c02SBram Moolenaar (void *) eap); 1115071d4279SBram Moolenaar } 1116071d4279SBram Moolenaar vim_free(script); 1117071d4279SBram Moolenaar } 1118071d4279SBram Moolenaar 1119071d4279SBram Moolenaar #define BUFFER_SIZE 1024 1120071d4279SBram Moolenaar 1121071d4279SBram Moolenaar /* 1122071d4279SBram Moolenaar * ":pyfile" 1123071d4279SBram Moolenaar */ 1124071d4279SBram Moolenaar void 1125071d4279SBram Moolenaar ex_pyfile(exarg_T *eap) 1126071d4279SBram Moolenaar { 1127071d4279SBram Moolenaar static char buffer[BUFFER_SIZE]; 1128071d4279SBram Moolenaar const char *file = (char *)eap->arg; 1129071d4279SBram Moolenaar char *p; 1130071d4279SBram Moolenaar 1131071d4279SBram Moolenaar /* Have to do it like this. PyRun_SimpleFile requires you to pass a 1132071d4279SBram Moolenaar * stdio file pointer, but Vim and the Python DLL are compiled with 1133071d4279SBram Moolenaar * different options under Windows, meaning that stdio pointers aren't 1134071d4279SBram Moolenaar * compatible between the two. Yuk. 1135071d4279SBram Moolenaar * 1136071d4279SBram Moolenaar * Put the string "execfile('file')" into buffer. But, we need to 1137071d4279SBram Moolenaar * escape any backslashes or single quotes in the file name, so that 1138071d4279SBram Moolenaar * Python won't mangle the file name. 1139071d4279SBram Moolenaar */ 1140071d4279SBram Moolenaar strcpy(buffer, "execfile('"); 1141071d4279SBram Moolenaar p = buffer + 10; /* size of "execfile('" */ 1142071d4279SBram Moolenaar 1143071d4279SBram Moolenaar while (*file && p < buffer + (BUFFER_SIZE - 3)) 1144071d4279SBram Moolenaar { 1145071d4279SBram Moolenaar if (*file == '\\' || *file == '\'') 1146071d4279SBram Moolenaar *p++ = '\\'; 1147071d4279SBram Moolenaar *p++ = *file++; 1148071d4279SBram Moolenaar } 1149071d4279SBram Moolenaar 1150071d4279SBram Moolenaar /* If we didn't finish the file name, we hit a buffer overflow */ 1151071d4279SBram Moolenaar if (*file != '\0') 1152071d4279SBram Moolenaar return; 1153071d4279SBram Moolenaar 1154071d4279SBram Moolenaar /* Put in the terminating "')" and a null */ 1155071d4279SBram Moolenaar *p++ = '\''; 1156071d4279SBram Moolenaar *p++ = ')'; 1157071d4279SBram Moolenaar *p++ = '\0'; 1158071d4279SBram Moolenaar 1159071d4279SBram Moolenaar /* Execute the file */ 1160b52f4c02SBram Moolenaar DoPyCommand(buffer, 1161b52f4c02SBram Moolenaar (rangeinitializer) init_range_cmd, 1162b52f4c02SBram Moolenaar (runner) run_cmd, 1163b52f4c02SBram Moolenaar (void *) eap); 1164071d4279SBram Moolenaar } 1165071d4279SBram Moolenaar 1166d620aa9bSBram Moolenaar void 1167d620aa9bSBram Moolenaar ex_pydo(exarg_T *eap) 1168d620aa9bSBram Moolenaar { 1169b52f4c02SBram Moolenaar DoPyCommand((char *)eap->arg, 1170b52f4c02SBram Moolenaar (rangeinitializer) init_range_cmd, 1171b52f4c02SBram Moolenaar (runner)run_do, 1172b52f4c02SBram Moolenaar (void *)eap); 1173d620aa9bSBram Moolenaar } 1174d620aa9bSBram Moolenaar 1175071d4279SBram Moolenaar /****************************************************** 1176071d4279SBram Moolenaar * 2. Python output stream: writes output via [e]msg(). 1177071d4279SBram Moolenaar */ 1178071d4279SBram Moolenaar 1179071d4279SBram Moolenaar /* Implementation functions 1180071d4279SBram Moolenaar */ 1181071d4279SBram Moolenaar 1182071d4279SBram Moolenaar static PyObject * 1183071d4279SBram Moolenaar OutputGetattr(PyObject *self, char *name) 1184071d4279SBram Moolenaar { 1185071d4279SBram Moolenaar if (strcmp(name, "softspace") == 0) 1186071d4279SBram Moolenaar return PyInt_FromLong(((OutputObject *)(self))->softspace); 1187dd8aca66SBram Moolenaar else if (strcmp(name, "__members__") == 0) 1188dd8aca66SBram Moolenaar return ObjectDir(NULL, OutputAttrs); 1189071d4279SBram Moolenaar 1190071d4279SBram Moolenaar return Py_FindMethod(OutputMethods, self, name); 1191071d4279SBram Moolenaar } 1192071d4279SBram Moolenaar 1193071d4279SBram Moolenaar /****************************************************** 1194071d4279SBram Moolenaar * 3. Implementation of the Vim module for Python 1195071d4279SBram Moolenaar */ 1196071d4279SBram Moolenaar 1197071d4279SBram Moolenaar /* Window type - Implementation functions 1198071d4279SBram Moolenaar * -------------------------------------- 1199071d4279SBram Moolenaar */ 1200071d4279SBram Moolenaar 1201071d4279SBram Moolenaar #define WindowType_Check(obj) ((obj)->ob_type == &WindowType) 1202071d4279SBram Moolenaar 1203071d4279SBram Moolenaar /* Buffer type - Implementation functions 1204071d4279SBram Moolenaar * -------------------------------------- 1205071d4279SBram Moolenaar */ 1206071d4279SBram Moolenaar 1207071d4279SBram Moolenaar #define BufferType_Check(obj) ((obj)->ob_type == &BufferType) 1208071d4279SBram Moolenaar 12092c45e945SBram Moolenaar static PyInt BufferAssItem(PyObject *, PyInt, PyObject *); 12102c45e945SBram Moolenaar static PyInt BufferAssSlice(PyObject *, PyInt, PyInt, PyObject *); 1211071d4279SBram Moolenaar 1212071d4279SBram Moolenaar /* Line range type - Implementation functions 1213071d4279SBram Moolenaar * -------------------------------------- 1214071d4279SBram Moolenaar */ 1215071d4279SBram Moolenaar 1216071d4279SBram Moolenaar #define RangeType_Check(obj) ((obj)->ob_type == &RangeType) 1217071d4279SBram Moolenaar 12182c45e945SBram Moolenaar static PyInt RangeAssItem(PyObject *, PyInt, PyObject *); 12192c45e945SBram Moolenaar static PyInt RangeAssSlice(PyObject *, PyInt, PyInt, PyObject *); 1220071d4279SBram Moolenaar 1221071d4279SBram Moolenaar /* Current objects type - Implementation functions 1222071d4279SBram Moolenaar * ----------------------------------------------- 1223071d4279SBram Moolenaar */ 1224071d4279SBram Moolenaar 1225071d4279SBram Moolenaar static PySequenceMethods BufferAsSeq = { 12262c45e945SBram Moolenaar (PyInquiry) BufferLength, /* sq_length, len(x) */ 122777fceb89SBram Moolenaar (binaryfunc) 0, /* BufferConcat, sq_concat, x+y */ 122877fceb89SBram Moolenaar (PyIntArgFunc) 0, /* BufferRepeat, sq_repeat, x*n */ 12292c45e945SBram Moolenaar (PyIntArgFunc) BufferItem, /* sq_item, x[i] */ 12302c45e945SBram Moolenaar (PyIntIntArgFunc) BufferSlice, /* sq_slice, x[i:j] */ 12312c45e945SBram Moolenaar (PyIntObjArgProc) BufferAssItem, /* sq_ass_item, x[i]=v */ 12322c45e945SBram Moolenaar (PyIntIntObjArgProc) BufferAssSlice, /* sq_ass_slice, x[i:j]=v */ 12334d1da49cSBram Moolenaar (objobjproc) 0, 12344d1da49cSBram Moolenaar (binaryfunc) 0, 1235071d4279SBram Moolenaar 0, 1236071d4279SBram Moolenaar }; 1237071d4279SBram Moolenaar 1238071d4279SBram Moolenaar /* Buffer object - Implementation 1239071d4279SBram Moolenaar */ 1240071d4279SBram Moolenaar 1241071d4279SBram Moolenaar static PyObject * 1242071d4279SBram Moolenaar BufferGetattr(PyObject *self, char *name) 1243071d4279SBram Moolenaar { 12444d1da49cSBram Moolenaar PyObject *r; 1245071d4279SBram Moolenaar 12469e822c00SBram Moolenaar if ((r = BufferAttrValid((BufferObject *)(self), name))) 12479e822c00SBram Moolenaar return r; 12489e822c00SBram Moolenaar 12494d1da49cSBram Moolenaar if (CheckBuffer((BufferObject *)(self))) 1250071d4279SBram Moolenaar return NULL; 1251071d4279SBram Moolenaar 12524d1da49cSBram Moolenaar r = BufferAttr((BufferObject *)(self), name); 12534d1da49cSBram Moolenaar if (r || PyErr_Occurred()) 12544d1da49cSBram Moolenaar return r; 1255071d4279SBram Moolenaar else 1256071d4279SBram Moolenaar return Py_FindMethod(BufferMethods, self, name); 1257071d4279SBram Moolenaar } 1258071d4279SBram Moolenaar 1259071d4279SBram Moolenaar /******************/ 1260071d4279SBram Moolenaar 12612c45e945SBram Moolenaar static PyInt 12622c45e945SBram Moolenaar BufferAssItem(PyObject *self, PyInt n, PyObject *val) 1263071d4279SBram Moolenaar { 12648f1723deSBram Moolenaar return RBAsItem((BufferObject *)(self), n, val, 1, -1, NULL); 1265071d4279SBram Moolenaar } 1266071d4279SBram Moolenaar 12672c45e945SBram Moolenaar static PyInt 12682c45e945SBram Moolenaar BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val) 1269071d4279SBram Moolenaar { 12708f1723deSBram Moolenaar return RBAsSlice((BufferObject *)(self), lo, hi, val, 1, -1, NULL); 1271071d4279SBram Moolenaar } 1272071d4279SBram Moolenaar 1273071d4279SBram Moolenaar static PySequenceMethods RangeAsSeq = { 12742c45e945SBram Moolenaar (PyInquiry) RangeLength, /* sq_length, len(x) */ 1275071d4279SBram Moolenaar (binaryfunc) 0, /* RangeConcat, */ /* sq_concat, x+y */ 12762c45e945SBram Moolenaar (PyIntArgFunc) 0, /* RangeRepeat, */ /* sq_repeat, x*n */ 12772c45e945SBram Moolenaar (PyIntArgFunc) RangeItem, /* sq_item, x[i] */ 12782c45e945SBram Moolenaar (PyIntIntArgFunc) RangeSlice, /* sq_slice, x[i:j] */ 12792c45e945SBram Moolenaar (PyIntObjArgProc) RangeAssItem, /* sq_ass_item, x[i]=v */ 12802c45e945SBram Moolenaar (PyIntIntObjArgProc) RangeAssSlice, /* sq_ass_slice, x[i:j]=v */ 12814d1da49cSBram Moolenaar (objobjproc) 0, 12824d1da49cSBram Moolenaar #if PY_MAJOR_VERSION >= 2 12834d1da49cSBram Moolenaar (binaryfunc) 0, 12844d1da49cSBram Moolenaar 0, 12854d1da49cSBram Moolenaar #endif 1286071d4279SBram Moolenaar }; 1287071d4279SBram Moolenaar 1288071d4279SBram Moolenaar /* Line range object - Implementation 1289071d4279SBram Moolenaar */ 1290071d4279SBram Moolenaar 1291071d4279SBram Moolenaar static PyObject * 1292071d4279SBram Moolenaar RangeGetattr(PyObject *self, char *name) 1293071d4279SBram Moolenaar { 1294071d4279SBram Moolenaar if (strcmp(name, "start") == 0) 1295e7cb9cf6SBram Moolenaar return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->start - 1); 1296071d4279SBram Moolenaar else if (strcmp(name, "end") == 0) 1297e7cb9cf6SBram Moolenaar return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->end - 1); 1298dd8aca66SBram Moolenaar else if (strcmp(name, "__members__") == 0) 1299dd8aca66SBram Moolenaar return ObjectDir(NULL, RangeAttrs); 1300071d4279SBram Moolenaar else 1301071d4279SBram Moolenaar return Py_FindMethod(RangeMethods, self, name); 1302071d4279SBram Moolenaar } 1303071d4279SBram Moolenaar 1304071d4279SBram Moolenaar /****************/ 1305071d4279SBram Moolenaar 13062c45e945SBram Moolenaar static PyInt 13072c45e945SBram Moolenaar RangeAssItem(PyObject *self, PyInt n, PyObject *val) 1308071d4279SBram Moolenaar { 1309ca8a4dfeSBram Moolenaar return RBAsItem(((RangeObject *)(self))->buf, n, val, 1310071d4279SBram Moolenaar ((RangeObject *)(self))->start, 1311071d4279SBram Moolenaar ((RangeObject *)(self))->end, 1312071d4279SBram Moolenaar &((RangeObject *)(self))->end); 1313071d4279SBram Moolenaar } 1314071d4279SBram Moolenaar 13152c45e945SBram Moolenaar static PyInt 13162c45e945SBram Moolenaar RangeAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val) 1317071d4279SBram Moolenaar { 131819e60943SBram Moolenaar return RBAsSlice(((RangeObject *)(self))->buf, lo, hi, val, 1319071d4279SBram Moolenaar ((RangeObject *)(self))->start, 1320071d4279SBram Moolenaar ((RangeObject *)(self))->end, 1321071d4279SBram Moolenaar &((RangeObject *)(self))->end); 1322071d4279SBram Moolenaar } 1323071d4279SBram Moolenaar 13245e538ecdSBram Moolenaar /* TabPage object - Implementation 13255e538ecdSBram Moolenaar */ 13265e538ecdSBram Moolenaar 13275e538ecdSBram Moolenaar static PyObject * 13285e538ecdSBram Moolenaar TabPageGetattr(PyObject *self, char *name) 13295e538ecdSBram Moolenaar { 13305e538ecdSBram Moolenaar PyObject *r; 13315e538ecdSBram Moolenaar 13329e822c00SBram Moolenaar if ((r = TabPageAttrValid((TabPageObject *)(self), name))) 13339e822c00SBram Moolenaar return r; 13349e822c00SBram Moolenaar 13355e538ecdSBram Moolenaar if (CheckTabPage((TabPageObject *)(self))) 13365e538ecdSBram Moolenaar return NULL; 13375e538ecdSBram Moolenaar 13385e538ecdSBram Moolenaar r = TabPageAttr((TabPageObject *)(self), name); 13395e538ecdSBram Moolenaar if (r || PyErr_Occurred()) 13405e538ecdSBram Moolenaar return r; 13415e538ecdSBram Moolenaar else 13425e538ecdSBram Moolenaar return Py_FindMethod(TabPageMethods, self, name); 13435e538ecdSBram Moolenaar } 13445e538ecdSBram Moolenaar 1345071d4279SBram Moolenaar /* Window object - Implementation 1346071d4279SBram Moolenaar */ 1347071d4279SBram Moolenaar 1348071d4279SBram Moolenaar static PyObject * 1349071d4279SBram Moolenaar WindowGetattr(PyObject *self, char *name) 1350071d4279SBram Moolenaar { 13514d1da49cSBram Moolenaar PyObject *r; 1352071d4279SBram Moolenaar 13539e822c00SBram Moolenaar if ((r = WindowAttrValid((WindowObject *)(self), name))) 13549e822c00SBram Moolenaar return r; 13559e822c00SBram Moolenaar 13564d1da49cSBram Moolenaar if (CheckWindow((WindowObject *)(self))) 1357071d4279SBram Moolenaar return NULL; 1358071d4279SBram Moolenaar 13594d1da49cSBram Moolenaar r = WindowAttr((WindowObject *)(self), name); 13604d1da49cSBram Moolenaar if (r || PyErr_Occurred()) 13614d1da49cSBram Moolenaar return r; 1362071d4279SBram Moolenaar else 1363071d4279SBram Moolenaar return Py_FindMethod(WindowMethods, self, name); 1364071d4279SBram Moolenaar } 1365071d4279SBram Moolenaar 13665e538ecdSBram Moolenaar /* Tab page list object - Definitions 13675e538ecdSBram Moolenaar */ 13685e538ecdSBram Moolenaar 13695e538ecdSBram Moolenaar static PySequenceMethods TabListAsSeq = { 13705e538ecdSBram Moolenaar (PyInquiry) TabListLength, /* sq_length, len(x) */ 13715e538ecdSBram Moolenaar (binaryfunc) 0, /* sq_concat, x+y */ 13725e538ecdSBram Moolenaar (PyIntArgFunc) 0, /* sq_repeat, x*n */ 13735e538ecdSBram Moolenaar (PyIntArgFunc) TabListItem, /* sq_item, x[i] */ 13745e538ecdSBram Moolenaar (PyIntIntArgFunc) 0, /* sq_slice, x[i:j] */ 13755e538ecdSBram Moolenaar (PyIntObjArgProc) 0, /* sq_ass_item, x[i]=v */ 13765e538ecdSBram Moolenaar (PyIntIntObjArgProc) 0, /* sq_ass_slice, x[i:j]=v */ 13775e538ecdSBram Moolenaar (objobjproc) 0, 13785e538ecdSBram Moolenaar #if PY_MAJOR_VERSION >= 2 13795e538ecdSBram Moolenaar (binaryfunc) 0, 13805e538ecdSBram Moolenaar 0, 13815e538ecdSBram Moolenaar #endif 13825e538ecdSBram Moolenaar }; 13835e538ecdSBram Moolenaar 1384071d4279SBram Moolenaar /* Window list object - Definitions 1385071d4279SBram Moolenaar */ 1386071d4279SBram Moolenaar 1387071d4279SBram Moolenaar static PySequenceMethods WinListAsSeq = { 13882c45e945SBram Moolenaar (PyInquiry) WinListLength, /* sq_length, len(x) */ 1389071d4279SBram Moolenaar (binaryfunc) 0, /* sq_concat, x+y */ 13902c45e945SBram Moolenaar (PyIntArgFunc) 0, /* sq_repeat, x*n */ 13912c45e945SBram Moolenaar (PyIntArgFunc) WinListItem, /* sq_item, x[i] */ 13922c45e945SBram Moolenaar (PyIntIntArgFunc) 0, /* sq_slice, x[i:j] */ 13932c45e945SBram Moolenaar (PyIntObjArgProc) 0, /* sq_ass_item, x[i]=v */ 13942c45e945SBram Moolenaar (PyIntIntObjArgProc) 0, /* sq_ass_slice, x[i:j]=v */ 13954d1da49cSBram Moolenaar (objobjproc) 0, 13964d1da49cSBram Moolenaar #if PY_MAJOR_VERSION >= 2 13974d1da49cSBram Moolenaar (binaryfunc) 0, 13984d1da49cSBram Moolenaar 0, 13994d1da49cSBram Moolenaar #endif 1400071d4279SBram Moolenaar }; 1401071d4279SBram Moolenaar 1402071d4279SBram Moolenaar /* External interface 1403071d4279SBram Moolenaar */ 1404071d4279SBram Moolenaar 1405071d4279SBram Moolenaar void 1406071d4279SBram Moolenaar python_buffer_free(buf_T *buf) 1407071d4279SBram Moolenaar { 1408971db467SBram Moolenaar if (BUF_PYTHON_REF(buf) != NULL) 1409071d4279SBram Moolenaar { 1410971db467SBram Moolenaar BufferObject *bp = BUF_PYTHON_REF(buf); 1411071d4279SBram Moolenaar bp->buf = INVALID_BUFFER_VALUE; 1412971db467SBram Moolenaar BUF_PYTHON_REF(buf) = NULL; 1413071d4279SBram Moolenaar } 1414071d4279SBram Moolenaar } 1415071d4279SBram Moolenaar 1416071d4279SBram Moolenaar #if defined(FEAT_WINDOWS) || defined(PROTO) 1417071d4279SBram Moolenaar void 1418071d4279SBram Moolenaar python_window_free(win_T *win) 1419071d4279SBram Moolenaar { 1420971db467SBram Moolenaar if (WIN_PYTHON_REF(win) != NULL) 1421071d4279SBram Moolenaar { 1422971db467SBram Moolenaar WindowObject *wp = WIN_PYTHON_REF(win); 1423071d4279SBram Moolenaar wp->win = INVALID_WINDOW_VALUE; 1424971db467SBram Moolenaar WIN_PYTHON_REF(win) = NULL; 1425071d4279SBram Moolenaar } 1426071d4279SBram Moolenaar } 14275e538ecdSBram Moolenaar 14285e538ecdSBram Moolenaar void 14295e538ecdSBram Moolenaar python_tabpage_free(tabpage_T *tab) 14305e538ecdSBram Moolenaar { 14315e538ecdSBram Moolenaar if (TAB_PYTHON_REF(tab) != NULL) 14325e538ecdSBram Moolenaar { 14335e538ecdSBram Moolenaar TabPageObject *tp = TAB_PYTHON_REF(tab); 14345e538ecdSBram Moolenaar tp->tab = INVALID_TABPAGE_VALUE; 14355e538ecdSBram Moolenaar TAB_PYTHON_REF(tab) = NULL; 14365e538ecdSBram Moolenaar } 14375e538ecdSBram Moolenaar } 1438071d4279SBram Moolenaar #endif 1439071d4279SBram Moolenaar 14401dc28783SBram Moolenaar static int 1441071d4279SBram Moolenaar PythonMod_Init(void) 1442071d4279SBram Moolenaar { 14439774ecc8SBram Moolenaar /* The special value is removed from sys.path in Python_Init(). */ 14449774ecc8SBram Moolenaar static char *(argv[2]) = {"/must>not&exist/foo", NULL}; 1445071d4279SBram Moolenaar 14461dc28783SBram Moolenaar if (init_types()) 14471dc28783SBram Moolenaar return -1; 1448071d4279SBram Moolenaar 1449071d4279SBram Moolenaar /* Set sys.argv[] to avoid a crash in warn(). */ 1450071d4279SBram Moolenaar PySys_SetArgv(1, argv); 1451071d4279SBram Moolenaar 1452c09a6d6cSBram Moolenaar vim_module = Py_InitModule4("vim", VimMethods, (char *)NULL, 1453c09a6d6cSBram Moolenaar (PyObject *)NULL, PYTHON_API_VERSION); 1454071d4279SBram Moolenaar 1455dee2e315SBram Moolenaar if (populate_module(vim_module)) 1456c09a6d6cSBram Moolenaar return -1; 1457c09a6d6cSBram Moolenaar 1458c09a6d6cSBram Moolenaar if (init_sys_path()) 1459c09a6d6cSBram Moolenaar return -1; 1460c09a6d6cSBram Moolenaar 1461c09a6d6cSBram Moolenaar return 0; 1462071d4279SBram Moolenaar } 1463071d4279SBram Moolenaar 1464071d4279SBram Moolenaar /************************************************************************* 1465071d4279SBram Moolenaar * 4. Utility functions for handling the interface between Vim and Python. 1466071d4279SBram Moolenaar */ 1467071d4279SBram Moolenaar 1468071d4279SBram Moolenaar /* Convert a Vim line into a Python string. 1469071d4279SBram Moolenaar * All internal newlines are replaced by null characters. 1470071d4279SBram Moolenaar * 1471071d4279SBram Moolenaar * On errors, the Python exception data is set, and NULL is returned. 1472071d4279SBram Moolenaar */ 1473071d4279SBram Moolenaar static PyObject * 1474071d4279SBram Moolenaar LineToString(const char *str) 1475071d4279SBram Moolenaar { 1476071d4279SBram Moolenaar PyObject *result; 14772c45e945SBram Moolenaar PyInt len = strlen(str); 1478071d4279SBram Moolenaar char *p; 1479071d4279SBram Moolenaar 1480071d4279SBram Moolenaar /* Allocate an Python string object, with uninitialised contents. We 1481071d4279SBram Moolenaar * must do it this way, so that we can modify the string in place 1482071d4279SBram Moolenaar * later. See the Python source, Objects/stringobject.c for details. 1483071d4279SBram Moolenaar */ 1484071d4279SBram Moolenaar result = PyString_FromStringAndSize(NULL, len); 1485071d4279SBram Moolenaar if (result == NULL) 1486071d4279SBram Moolenaar return NULL; 1487071d4279SBram Moolenaar 1488071d4279SBram Moolenaar p = PyString_AsString(result); 1489071d4279SBram Moolenaar 1490071d4279SBram Moolenaar while (*str) 1491071d4279SBram Moolenaar { 1492071d4279SBram Moolenaar if (*str == '\n') 1493071d4279SBram Moolenaar *p = '\0'; 1494071d4279SBram Moolenaar else 1495071d4279SBram Moolenaar *p = *str; 1496071d4279SBram Moolenaar 1497071d4279SBram Moolenaar ++p; 1498071d4279SBram Moolenaar ++str; 1499071d4279SBram Moolenaar } 1500071d4279SBram Moolenaar 1501071d4279SBram Moolenaar return result; 1502071d4279SBram Moolenaar } 1503071d4279SBram Moolenaar 1504db913953SBram Moolenaar static PyObject * 1505db913953SBram Moolenaar DictionaryGetattr(PyObject *self, char *name) 1506db913953SBram Moolenaar { 150766b7985eSBram Moolenaar DictionaryObject *this = ((DictionaryObject *) (self)); 150866b7985eSBram Moolenaar 150966b7985eSBram Moolenaar if (strcmp(name, "locked") == 0) 151066b7985eSBram Moolenaar return PyInt_FromLong(this->dict->dv_lock); 151166b7985eSBram Moolenaar else if (strcmp(name, "scope") == 0) 151266b7985eSBram Moolenaar return PyInt_FromLong(this->dict->dv_scope); 1513dd8aca66SBram Moolenaar else if (strcmp(name, "__members__") == 0) 1514dd8aca66SBram Moolenaar return ObjectDir(NULL, DictionaryAttrs); 151566b7985eSBram Moolenaar 1516db913953SBram Moolenaar return Py_FindMethod(DictionaryMethods, self, name); 1517db913953SBram Moolenaar } 1518db913953SBram Moolenaar 1519db913953SBram Moolenaar static PyObject * 1520db913953SBram Moolenaar ListGetattr(PyObject *self, char *name) 1521db913953SBram Moolenaar { 152266b7985eSBram Moolenaar if (strcmp(name, "locked") == 0) 152366b7985eSBram Moolenaar return PyInt_FromLong(((ListObject *)(self))->list->lv_lock); 1524dd8aca66SBram Moolenaar else if (strcmp(name, "__members__") == 0) 1525dd8aca66SBram Moolenaar return ObjectDir(NULL, ListAttrs); 152666b7985eSBram Moolenaar 1527db913953SBram Moolenaar return Py_FindMethod(ListMethods, self, name); 1528db913953SBram Moolenaar } 1529db913953SBram Moolenaar 1530db913953SBram Moolenaar static PyObject * 1531db913953SBram Moolenaar FunctionGetattr(PyObject *self, char *name) 1532db913953SBram Moolenaar { 1533db913953SBram Moolenaar FunctionObject *this = (FunctionObject *)(self); 1534db913953SBram Moolenaar 1535db913953SBram Moolenaar if (strcmp(name, "name") == 0) 1536db913953SBram Moolenaar return PyString_FromString((char *)(this->name)); 1537dd8aca66SBram Moolenaar else if (strcmp(name, "__members__") == 0) 1538dd8aca66SBram Moolenaar return ObjectDir(NULL, FunctionAttrs); 1539db913953SBram Moolenaar else 1540db913953SBram Moolenaar return Py_FindMethod(FunctionMethods, self, name); 1541db913953SBram Moolenaar } 1542db913953SBram Moolenaar 1543db913953SBram Moolenaar void 1544db913953SBram Moolenaar do_pyeval (char_u *str, typval_T *rettv) 1545db913953SBram Moolenaar { 1546b52f4c02SBram Moolenaar DoPyCommand((char *) str, 1547b52f4c02SBram Moolenaar (rangeinitializer) init_range_eval, 1548b52f4c02SBram Moolenaar (runner) run_eval, 1549b52f4c02SBram Moolenaar (void *) rettv); 1550db913953SBram Moolenaar switch(rettv->v_type) 1551db913953SBram Moolenaar { 1552db913953SBram Moolenaar case VAR_DICT: ++rettv->vval.v_dict->dv_refcount; break; 1553db913953SBram Moolenaar case VAR_LIST: ++rettv->vval.v_list->lv_refcount; break; 1554db913953SBram Moolenaar case VAR_FUNC: func_ref(rettv->vval.v_string); break; 155577fceb89SBram Moolenaar case VAR_UNKNOWN: 155677fceb89SBram Moolenaar rettv->v_type = VAR_NUMBER; 155777fceb89SBram Moolenaar rettv->vval.v_number = 0; 155877fceb89SBram Moolenaar break; 1559db913953SBram Moolenaar } 1560db913953SBram Moolenaar } 1561071d4279SBram Moolenaar 1562071d4279SBram Moolenaar /* Don't generate a prototype for the next function, it generates an error on 1563071d4279SBram Moolenaar * newer Python versions. */ 1564071d4279SBram Moolenaar #if PYTHON_API_VERSION < 1007 /* Python 1.4 */ && !defined(PROTO) 1565071d4279SBram Moolenaar 1566071d4279SBram Moolenaar char * 1567071d4279SBram Moolenaar Py_GetProgramName(void) 1568071d4279SBram Moolenaar { 1569071d4279SBram Moolenaar return "vim"; 1570071d4279SBram Moolenaar } 1571071d4279SBram Moolenaar #endif /* Python 1.4 */ 1572170bf1aeSBram Moolenaar 15732459a5ecSBram Moolenaar int 1574db913953SBram Moolenaar set_ref_in_python (int copyID) 1575db913953SBram Moolenaar { 15762459a5ecSBram Moolenaar return set_ref_in_py(copyID); 1577db913953SBram Moolenaar } 1578