xref: /vim-8.2.3635/src/if_python.c (revision 84a05acc)
1 /* vi:set ts=8 sts=4 sw=4 noet:
2  *
3  * VIM - Vi IMproved	by Bram Moolenaar
4  *
5  * Do ":help uganda"  in Vim to read copying and usage conditions.
6  * Do ":help credits" in Vim to see a list of people who contributed.
7  * See README.txt for an overview of the Vim source code.
8  */
9 /*
10  * Python extensions by Paul Moore.
11  * Changes for Unix by David Leonard.
12  *
13  * This consists of four parts:
14  * 1. Python interpreter main program
15  * 2. Python output stream: writes output via [e]msg().
16  * 3. Implementation of the Vim module for Python
17  * 4. Utility functions for handling the interface between Vim and Python.
18  */
19 
20 #include "vim.h"
21 
22 #include <limits.h>
23 
24 /* Python.h defines _POSIX_THREADS itself (if needed) */
25 #ifdef _POSIX_THREADS
26 # undef _POSIX_THREADS
27 #endif
28 
29 #if defined(_WIN32) && defined(HAVE_FCNTL_H)
30 # undef HAVE_FCNTL_H
31 #endif
32 
33 #ifdef _DEBUG
34 # undef _DEBUG
35 #endif
36 
37 #ifdef HAVE_STDARG_H
38 # undef HAVE_STDARG_H	/* Python's config.h defines it as well. */
39 #endif
40 #ifdef _POSIX_C_SOURCE
41 # undef _POSIX_C_SOURCE	/* pyconfig.h defines it as well. */
42 #endif
43 #ifdef _XOPEN_SOURCE
44 # undef _XOPEN_SOURCE	/* pyconfig.h defines it as well. */
45 #endif
46 
47 #include <Python.h>
48 #if defined(MACOS) && !defined(MACOS_X_UNIX)
49 # include "macglue.h"
50 # include <CodeFragments.h>
51 #endif
52 #undef main /* Defined in python.h - aargh */
53 #undef HAVE_FCNTL_H /* Clash with os_win32.h */
54 
55 #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000
56 # define PY_SSIZE_T_CLEAN
57 #endif
58 
59 static void init_structs(void);
60 
61 #define PyBytes_FromString PyString_FromString
62 #define PyBytes_Check PyString_Check
63 
64 /* No-op conversion functions, use with care! */
65 #define PyString_AsBytes(obj) (obj)
66 #define PyString_FreeBytes(obj)
67 
68 #if !defined(FEAT_PYTHON) && defined(PROTO)
69 /* Use this to be able to generate prototypes without python being used. */
70 # define PyObject Py_ssize_t
71 # define PyThreadState Py_ssize_t
72 # define PyTypeObject Py_ssize_t
73 struct PyMethodDef { Py_ssize_t a; };
74 # define PySequenceMethods Py_ssize_t
75 #endif
76 
77 #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
78 # define PY_USE_CAPSULE
79 #endif
80 
81 #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000
82 # define PyInt Py_ssize_t
83 # define PyInquiry lenfunc
84 # define PyIntArgFunc ssizeargfunc
85 # define PyIntIntArgFunc ssizessizeargfunc
86 # define PyIntObjArgProc ssizeobjargproc
87 # define PyIntIntObjArgProc ssizessizeobjargproc
88 # define Py_ssize_t_fmt "n"
89 #else
90 # define PyInt int
91 # define lenfunc inquiry
92 # define PyInquiry inquiry
93 # define PyIntArgFunc intargfunc
94 # define PyIntIntArgFunc intintargfunc
95 # define PyIntObjArgProc intobjargproc
96 # define PyIntIntObjArgProc intintobjargproc
97 # define Py_ssize_t_fmt "i"
98 #endif
99 
100 /* Parser flags */
101 #define single_input	256
102 #define file_input	257
103 #define eval_input	258
104 
105 #if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x020300F0
106   /* Python 2.3: can invoke ":python" recursively. */
107 # define PY_CAN_RECURSE
108 #endif
109 
110 # if defined(DYNAMIC_PYTHON) || defined(PROTO)
111 #  ifndef DYNAMIC_PYTHON
112 #   define HINSTANCE long_u		/* for generating prototypes */
113 #  endif
114 
115 # ifndef WIN3264
116 #  include <dlfcn.h>
117 #  define FARPROC void*
118 #  define HINSTANCE void*
119 #  if defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)
120 #   define load_dll(n) dlopen((n), RTLD_LAZY)
121 #  else
122 #   define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
123 #  endif
124 #  define close_dll dlclose
125 #  define symbol_from_dll dlsym
126 # else
127 #  define load_dll vimLoadLib
128 #  define close_dll FreeLibrary
129 #  define symbol_from_dll GetProcAddress
130 # endif
131 
132 /* This makes if_python.c compile without warnings against Python 2.5
133  * on Win32 and Win64. */
134 # undef PyRun_SimpleString
135 # undef PyRun_String
136 # undef PyArg_Parse
137 # undef PyArg_ParseTuple
138 # undef Py_BuildValue
139 # undef Py_InitModule4
140 # undef Py_InitModule4_64
141 # undef PyObject_CallMethod
142 
143 /*
144  * Wrapper defines
145  */
146 # define PyArg_Parse dll_PyArg_Parse
147 # define PyArg_ParseTuple dll_PyArg_ParseTuple
148 # define PyMem_Free dll_PyMem_Free
149 # define PyMem_Malloc dll_PyMem_Malloc
150 # define PyDict_SetItemString dll_PyDict_SetItemString
151 # define PyErr_BadArgument dll_PyErr_BadArgument
152 # define PyErr_Clear dll_PyErr_Clear
153 # define PyErr_PrintEx dll_PyErr_PrintEx
154 # define PyErr_NoMemory dll_PyErr_NoMemory
155 # define PyErr_Occurred dll_PyErr_Occurred
156 # define PyErr_SetNone dll_PyErr_SetNone
157 # define PyErr_SetString dll_PyErr_SetString
158 # define PyEval_InitThreads dll_PyEval_InitThreads
159 # define PyEval_RestoreThread dll_PyEval_RestoreThread
160 # define PyEval_SaveThread dll_PyEval_SaveThread
161 # ifdef PY_CAN_RECURSE
162 #  define PyGILState_Ensure dll_PyGILState_Ensure
163 #  define PyGILState_Release dll_PyGILState_Release
164 # endif
165 # define PyInt_AsLong dll_PyInt_AsLong
166 # define PyInt_FromLong dll_PyInt_FromLong
167 # define PyLong_AsLong dll_PyLong_AsLong
168 # define PyLong_FromLong dll_PyLong_FromLong
169 # define PyBool_Type (*dll_PyBool_Type)
170 # define PyInt_Type (*dll_PyInt_Type)
171 # define PyLong_Type (*dll_PyLong_Type)
172 # define PyList_GetItem dll_PyList_GetItem
173 # define PyList_Append dll_PyList_Append
174 # define PyList_New dll_PyList_New
175 # define PyList_SetItem dll_PyList_SetItem
176 # define PyList_Size dll_PyList_Size
177 # define PyList_Type (*dll_PyList_Type)
178 # define PySequence_Check dll_PySequence_Check
179 # define PySequence_Size dll_PySequence_Size
180 # define PySequence_GetItem dll_PySequence_GetItem
181 # define PyTuple_Size dll_PyTuple_Size
182 # define PyTuple_GetItem dll_PyTuple_GetItem
183 # define PyTuple_Type (*dll_PyTuple_Type)
184 # define PyImport_ImportModule dll_PyImport_ImportModule
185 # define PyDict_New dll_PyDict_New
186 # define PyDict_GetItemString dll_PyDict_GetItemString
187 # define PyDict_Next dll_PyDict_Next
188 # ifdef PyMapping_Items
189 #  define PY_NO_MAPPING_ITEMS
190 # else
191 #  define PyMapping_Items dll_PyMapping_Items
192 # endif
193 # define PyObject_CallMethod dll_PyObject_CallMethod
194 # define PyMapping_Check dll_PyMapping_Check
195 # define PyIter_Next dll_PyIter_Next
196 # define PyModule_GetDict dll_PyModule_GetDict
197 # define PyRun_SimpleString dll_PyRun_SimpleString
198 # define PyRun_String dll_PyRun_String
199 # define PyString_AsString dll_PyString_AsString
200 # define PyString_AsStringAndSize dll_PyString_AsStringAndSize
201 # define PyString_FromString dll_PyString_FromString
202 # define PyString_FromStringAndSize dll_PyString_FromStringAndSize
203 # define PyString_Size dll_PyString_Size
204 # define PyString_Type (*dll_PyString_Type)
205 # define PyUnicode_Type (*dll_PyUnicode_Type)
206 # undef PyUnicode_AsEncodedString
207 # define PyUnicode_AsEncodedString py_PyUnicode_AsEncodedString
208 # define PyFloat_AsDouble dll_PyFloat_AsDouble
209 # define PyFloat_FromDouble dll_PyFloat_FromDouble
210 # define PyFloat_Type (*dll_PyFloat_Type)
211 # define PyImport_AddModule (*dll_PyImport_AddModule)
212 # define PySys_SetObject dll_PySys_SetObject
213 # define PySys_SetArgv dll_PySys_SetArgv
214 # define PyType_Type (*dll_PyType_Type)
215 # define PyType_Ready (*dll_PyType_Ready)
216 # define Py_BuildValue dll_Py_BuildValue
217 # define Py_FindMethod dll_Py_FindMethod
218 # define Py_InitModule4 dll_Py_InitModule4
219 # define Py_SetPythonHome dll_Py_SetPythonHome
220 # define Py_Initialize dll_Py_Initialize
221 # define Py_Finalize dll_Py_Finalize
222 # define Py_IsInitialized dll_Py_IsInitialized
223 # define _PyObject_New dll__PyObject_New
224 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
225 #  define _PyObject_NextNotImplemented (*dll__PyObject_NextNotImplemented)
226 # endif
227 # define _Py_NoneStruct (*dll__Py_NoneStruct)
228 # define _Py_ZeroStruct (*dll__Py_ZeroStruct)
229 # define _Py_TrueStruct (*dll__Py_TrueStruct)
230 # define PyObject_Init dll__PyObject_Init
231 # define PyObject_GetIter dll_PyObject_GetIter
232 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000
233 #  define PyType_IsSubtype dll_PyType_IsSubtype
234 # endif
235 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000
236 #  define PyObject_Malloc dll_PyObject_Malloc
237 #  define PyObject_Free dll_PyObject_Free
238 # endif
239 # ifdef PY_USE_CAPSULE
240 #  define PyCapsule_New dll_PyCapsule_New
241 #  define PyCapsule_GetPointer dll_PyCapsule_GetPointer
242 # else
243 #  define PyCObject_FromVoidPtr dll_PyCObject_FromVoidPtr
244 #  define PyCObject_AsVoidPtr dll_PyCObject_AsVoidPtr
245 # endif
246 
247 /*
248  * Pointers for dynamic link
249  */
250 static int(*dll_PyArg_Parse)(PyObject *, char *, ...);
251 static int(*dll_PyArg_ParseTuple)(PyObject *, char *, ...);
252 static int(*dll_PyMem_Free)(void *);
253 static void* (*dll_PyMem_Malloc)(size_t);
254 static int(*dll_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item);
255 static int(*dll_PyErr_BadArgument)(void);
256 static void(*dll_PyErr_Clear)(void);
257 static void(*dll_PyErr_PrintEx)(int);
258 static PyObject*(*dll_PyErr_NoMemory)(void);
259 static PyObject*(*dll_PyErr_Occurred)(void);
260 static void(*dll_PyErr_SetNone)(PyObject *);
261 static void(*dll_PyErr_SetString)(PyObject *, const char *);
262 static void(*dll_PyEval_InitThreads)(void);
263 static void(*dll_PyEval_RestoreThread)(PyThreadState *);
264 static PyThreadState*(*dll_PyEval_SaveThread)(void);
265 # ifdef PY_CAN_RECURSE
266 static PyGILState_STATE	(*dll_PyGILState_Ensure)(void);
267 static void (*dll_PyGILState_Release)(PyGILState_STATE);
268 # endif
269 static long(*dll_PyInt_AsLong)(PyObject *);
270 static PyObject*(*dll_PyInt_FromLong)(long);
271 static long(*dll_PyLong_AsLong)(PyObject *);
272 static PyObject*(*dll_PyLong_FromLong)(long);
273 static PyTypeObject* dll_PyBool_Type;
274 static PyTypeObject* dll_PyInt_Type;
275 static PyTypeObject* dll_PyLong_Type;
276 static PyObject*(*dll_PyList_GetItem)(PyObject *, PyInt);
277 static PyObject*(*dll_PyList_Append)(PyObject *, PyObject *);
278 static PyObject*(*dll_PyList_New)(PyInt size);
279 static int(*dll_PyList_SetItem)(PyObject *, PyInt, PyObject *);
280 static PyInt(*dll_PyList_Size)(PyObject *);
281 static PyTypeObject* dll_PyList_Type;
282 static int (*dll_PySequence_Check)(PyObject *);
283 static PyInt(*dll_PySequence_Size)(PyObject *);
284 static PyObject*(*dll_PySequence_GetItem)(PyObject *, PyInt);
285 static PyInt(*dll_PyTuple_Size)(PyObject *);
286 static PyObject*(*dll_PyTuple_GetItem)(PyObject *, PyInt);
287 static PyTypeObject* dll_PyTuple_Type;
288 static PyObject*(*dll_PyImport_ImportModule)(const char *);
289 static PyObject*(*dll_PyDict_New)(void);
290 static PyObject*(*dll_PyDict_GetItemString)(PyObject *, const char *);
291 static int (*dll_PyDict_Next)(PyObject *, Py_ssize_t *, PyObject **, PyObject **);
292 # ifndef PY_NO_MAPPING_ITEMS
293 static PyObject* (*dll_PyMapping_Items)(PyObject *);
294 # endif
295 static PyObject* (*dll_PyObject_CallMethod)(PyObject *, char *, PyObject *);
296 static int (*dll_PyMapping_Check)(PyObject *);
297 static PyObject* (*dll_PyIter_Next)(PyObject *);
298 static PyObject*(*dll_PyModule_GetDict)(PyObject *);
299 static int(*dll_PyRun_SimpleString)(char *);
300 static PyObject *(*dll_PyRun_String)(char *, int, PyObject *, PyObject *);
301 static char*(*dll_PyString_AsString)(PyObject *);
302 static int(*dll_PyString_AsStringAndSize)(PyObject *, char **, int *);
303 static PyObject*(*dll_PyString_FromString)(const char *);
304 static PyObject*(*dll_PyString_FromStringAndSize)(const char *, PyInt);
305 static PyInt(*dll_PyString_Size)(PyObject *);
306 static PyTypeObject* dll_PyString_Type;
307 static PyTypeObject* dll_PyUnicode_Type;
308 static PyObject *(*py_PyUnicode_AsEncodedString)(PyObject *, char *, char *);
309 static double(*dll_PyFloat_AsDouble)(PyObject *);
310 static PyObject*(*dll_PyFloat_FromDouble)(double);
311 static PyTypeObject* dll_PyFloat_Type;
312 static int(*dll_PySys_SetObject)(char *, PyObject *);
313 static int(*dll_PySys_SetArgv)(int, char **);
314 static PyTypeObject* dll_PyType_Type;
315 static int (*dll_PyType_Ready)(PyTypeObject *type);
316 static PyObject*(*dll_Py_BuildValue)(char *, ...);
317 static PyObject*(*dll_Py_FindMethod)(struct PyMethodDef[], PyObject *, char *);
318 static PyObject*(*dll_Py_InitModule4)(char *, struct PyMethodDef *, char *, PyObject *, int);
319 static PyObject*(*dll_PyImport_AddModule)(char *);
320 static void(*dll_Py_SetPythonHome)(char *home);
321 static void(*dll_Py_Initialize)(void);
322 static void(*dll_Py_Finalize)(void);
323 static int(*dll_Py_IsInitialized)(void);
324 static PyObject*(*dll__PyObject_New)(PyTypeObject *, PyObject *);
325 static PyObject*(*dll__PyObject_Init)(PyObject *, PyTypeObject *);
326 static PyObject* (*dll_PyObject_GetIter)(PyObject *);
327 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
328 static iternextfunc dll__PyObject_NextNotImplemented;
329 # endif
330 static PyObject* dll__Py_NoneStruct;
331 static PyObject* _Py_ZeroStruct;
332 static PyObject* dll__Py_TrueStruct;
333 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000
334 static int (*dll_PyType_IsSubtype)(PyTypeObject *, PyTypeObject *);
335 # endif
336 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000
337 static void* (*dll_PyObject_Malloc)(size_t);
338 static void (*dll_PyObject_Free)(void*);
339 # endif
340 # ifdef PY_USE_CAPSULE
341 static PyObject* (*dll_PyCapsule_New)(void *, char *, PyCapsule_Destructor);
342 static void* (*dll_PyCapsule_GetPointer)(PyObject *, char *);
343 # else
344 static PyObject* (*dll_PyCObject_FromVoidPtr)(void *cobj, void (*destr)(void *));
345 static void* (*dll_PyCObject_AsVoidPtr)(PyObject *);
346 # endif
347 
348 static HINSTANCE hinstPython = 0; /* Instance of python.dll */
349 
350 /* Imported exception objects */
351 static PyObject *imp_PyExc_AttributeError;
352 static PyObject *imp_PyExc_IndexError;
353 static PyObject *imp_PyExc_KeyError;
354 static PyObject *imp_PyExc_KeyboardInterrupt;
355 static PyObject *imp_PyExc_TypeError;
356 static PyObject *imp_PyExc_ValueError;
357 
358 # define PyExc_AttributeError imp_PyExc_AttributeError
359 # define PyExc_IndexError imp_PyExc_IndexError
360 # define PyExc_KeyError imp_PyExc_KeyError
361 # define PyExc_KeyboardInterrupt imp_PyExc_KeyboardInterrupt
362 # define PyExc_TypeError imp_PyExc_TypeError
363 # define PyExc_ValueError imp_PyExc_ValueError
364 
365 /*
366  * Table of name to function pointer of python.
367  */
368 # define PYTHON_PROC FARPROC
369 static struct
370 {
371     char *name;
372     PYTHON_PROC *ptr;
373 } python_funcname_table[] =
374 {
375 #ifndef PY_SSIZE_T_CLEAN
376     {"PyArg_Parse", (PYTHON_PROC*)&dll_PyArg_Parse},
377     {"PyArg_ParseTuple", (PYTHON_PROC*)&dll_PyArg_ParseTuple},
378     {"Py_BuildValue", (PYTHON_PROC*)&dll_Py_BuildValue},
379 #else
380     {"_PyArg_Parse_SizeT", (PYTHON_PROC*)&dll_PyArg_Parse},
381     {"_PyArg_ParseTuple_SizeT", (PYTHON_PROC*)&dll_PyArg_ParseTuple},
382     {"_Py_BuildValue_SizeT", (PYTHON_PROC*)&dll_Py_BuildValue},
383 #endif
384     {"PyMem_Free", (PYTHON_PROC*)&dll_PyMem_Free},
385     {"PyMem_Malloc", (PYTHON_PROC*)&dll_PyMem_Malloc},
386     {"PyDict_SetItemString", (PYTHON_PROC*)&dll_PyDict_SetItemString},
387     {"PyErr_BadArgument", (PYTHON_PROC*)&dll_PyErr_BadArgument},
388     {"PyErr_Clear", (PYTHON_PROC*)&dll_PyErr_Clear},
389     {"PyErr_PrintEx", (PYTHON_PROC*)&dll_PyErr_PrintEx},
390     {"PyErr_NoMemory", (PYTHON_PROC*)&dll_PyErr_NoMemory},
391     {"PyErr_Occurred", (PYTHON_PROC*)&dll_PyErr_Occurred},
392     {"PyErr_SetNone", (PYTHON_PROC*)&dll_PyErr_SetNone},
393     {"PyErr_SetString", (PYTHON_PROC*)&dll_PyErr_SetString},
394     {"PyEval_InitThreads", (PYTHON_PROC*)&dll_PyEval_InitThreads},
395     {"PyEval_RestoreThread", (PYTHON_PROC*)&dll_PyEval_RestoreThread},
396     {"PyEval_SaveThread", (PYTHON_PROC*)&dll_PyEval_SaveThread},
397 # ifdef PY_CAN_RECURSE
398     {"PyGILState_Ensure", (PYTHON_PROC*)&dll_PyGILState_Ensure},
399     {"PyGILState_Release", (PYTHON_PROC*)&dll_PyGILState_Release},
400 # endif
401     {"PyInt_AsLong", (PYTHON_PROC*)&dll_PyInt_AsLong},
402     {"PyInt_FromLong", (PYTHON_PROC*)&dll_PyInt_FromLong},
403     {"PyLong_AsLong", (PYTHON_PROC*)&dll_PyLong_AsLong},
404     {"PyLong_FromLong", (PYTHON_PROC*)&dll_PyLong_FromLong},
405     {"PyBool_Type", (PYTHON_PROC*)&dll_PyBool_Type},
406     {"PyInt_Type", (PYTHON_PROC*)&dll_PyInt_Type},
407     {"PyLong_Type", (PYTHON_PROC*)&dll_PyLong_Type},
408     {"PyList_GetItem", (PYTHON_PROC*)&dll_PyList_GetItem},
409     {"PyList_Append", (PYTHON_PROC*)&dll_PyList_Append},
410     {"PyList_New", (PYTHON_PROC*)&dll_PyList_New},
411     {"PyList_SetItem", (PYTHON_PROC*)&dll_PyList_SetItem},
412     {"PyList_Size", (PYTHON_PROC*)&dll_PyList_Size},
413     {"PyList_Type", (PYTHON_PROC*)&dll_PyList_Type},
414     {"PySequence_GetItem", (PYTHON_PROC*)&dll_PySequence_GetItem},
415     {"PySequence_Size", (PYTHON_PROC*)&dll_PySequence_Size},
416     {"PySequence_Check", (PYTHON_PROC*)&dll_PySequence_Check},
417     {"PyTuple_GetItem", (PYTHON_PROC*)&dll_PyTuple_GetItem},
418     {"PyTuple_Size", (PYTHON_PROC*)&dll_PyTuple_Size},
419     {"PyTuple_Type", (PYTHON_PROC*)&dll_PyTuple_Type},
420     {"PyImport_ImportModule", (PYTHON_PROC*)&dll_PyImport_ImportModule},
421     {"PyDict_GetItemString", (PYTHON_PROC*)&dll_PyDict_GetItemString},
422     {"PyDict_Next", (PYTHON_PROC*)&dll_PyDict_Next},
423     {"PyDict_New", (PYTHON_PROC*)&dll_PyDict_New},
424 # ifndef PY_NO_MAPPING_ITEMS
425     {"PyMapping_Items", (PYTHON_PROC*)&dll_PyMapping_Items},
426 # endif
427     {"PyObject_CallMethod", (PYTHON_PROC*)&dll_PyObject_CallMethod},
428     {"PyMapping_Check", (PYTHON_PROC*)&dll_PyMapping_Check},
429     {"PyIter_Next", (PYTHON_PROC*)&dll_PyIter_Next},
430     {"PyModule_GetDict", (PYTHON_PROC*)&dll_PyModule_GetDict},
431     {"PyRun_SimpleString", (PYTHON_PROC*)&dll_PyRun_SimpleString},
432     {"PyRun_String", (PYTHON_PROC*)&dll_PyRun_String},
433     {"PyString_AsString", (PYTHON_PROC*)&dll_PyString_AsString},
434     {"PyString_AsStringAndSize", (PYTHON_PROC*)&dll_PyString_AsStringAndSize},
435     {"PyString_FromString", (PYTHON_PROC*)&dll_PyString_FromString},
436     {"PyString_FromStringAndSize", (PYTHON_PROC*)&dll_PyString_FromStringAndSize},
437     {"PyString_Size", (PYTHON_PROC*)&dll_PyString_Size},
438     {"PyString_Type", (PYTHON_PROC*)&dll_PyString_Type},
439     {"PyUnicode_Type", (PYTHON_PROC*)&dll_PyUnicode_Type},
440     {"PyFloat_Type", (PYTHON_PROC*)&dll_PyFloat_Type},
441     {"PyFloat_AsDouble", (PYTHON_PROC*)&dll_PyFloat_AsDouble},
442     {"PyFloat_FromDouble", (PYTHON_PROC*)&dll_PyFloat_FromDouble},
443     {"PyImport_AddModule", (PYTHON_PROC*)&dll_PyImport_AddModule},
444     {"PySys_SetObject", (PYTHON_PROC*)&dll_PySys_SetObject},
445     {"PySys_SetArgv", (PYTHON_PROC*)&dll_PySys_SetArgv},
446     {"PyType_Type", (PYTHON_PROC*)&dll_PyType_Type},
447     {"PyType_Ready", (PYTHON_PROC*)&dll_PyType_Ready},
448     {"Py_FindMethod", (PYTHON_PROC*)&dll_Py_FindMethod},
449 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000 \
450 	&& SIZEOF_SIZE_T != SIZEOF_INT
451     {"Py_InitModule4_64", (PYTHON_PROC*)&dll_Py_InitModule4},
452 # else
453     {"Py_InitModule4", (PYTHON_PROC*)&dll_Py_InitModule4},
454 # endif
455     {"Py_SetPythonHome", (PYTHON_PROC*)&dll_Py_SetPythonHome},
456     {"Py_Initialize", (PYTHON_PROC*)&dll_Py_Initialize},
457     {"Py_Finalize", (PYTHON_PROC*)&dll_Py_Finalize},
458     {"Py_IsInitialized", (PYTHON_PROC*)&dll_Py_IsInitialized},
459     {"_PyObject_New", (PYTHON_PROC*)&dll__PyObject_New},
460     {"PyObject_Init", (PYTHON_PROC*)&dll__PyObject_Init},
461     {"PyObject_GetIter", (PYTHON_PROC*)&dll_PyObject_GetIter},
462 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02070000
463     {"_PyObject_NextNotImplemented", (PYTHON_PROC*)&dll__PyObject_NextNotImplemented},
464 # endif
465     {"_Py_NoneStruct", (PYTHON_PROC*)&dll__Py_NoneStruct},
466     {"_Py_ZeroStruct", (PYTHON_PROC*)&dll__Py_ZeroStruct},
467     {"_Py_TrueStruct", (PYTHON_PROC*)&dll__Py_TrueStruct},
468 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02020000
469     {"PyType_IsSubtype", (PYTHON_PROC*)&dll_PyType_IsSubtype},
470 # endif
471 # if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02030000
472     {"PyObject_Malloc", (PYTHON_PROC*)&dll_PyObject_Malloc},
473     {"PyObject_Free", (PYTHON_PROC*)&dll_PyObject_Free},
474 # endif
475 # ifdef PY_USE_CAPSULE
476     {"PyCapsule_New", (PYTHON_PROC*)&dll_PyCapsule_New},
477     {"PyCapsule_GetPointer", (PYTHON_PROC*)&dll_PyCapsule_GetPointer},
478 # else
479     {"PyCObject_FromVoidPtr", (PYTHON_PROC*)&dll_PyCObject_FromVoidPtr},
480     {"PyCObject_AsVoidPtr", (PYTHON_PROC*)&dll_PyCObject_AsVoidPtr},
481 # endif
482     {"", NULL},
483 };
484 
485 /*
486  * Free python.dll
487  */
488     static void
489 end_dynamic_python(void)
490 {
491     if (hinstPython)
492     {
493 	close_dll(hinstPython);
494 	hinstPython = 0;
495     }
496 }
497 
498 /*
499  * Load library and get all pointers.
500  * Parameter 'libname' provides name of DLL.
501  * Return OK or FAIL.
502  */
503     static int
504 python_runtime_link_init(char *libname, int verbose)
505 {
506     int i;
507     void *ucs_as_encoded_string;
508 
509 #if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON3)
510     /* Can't have Python and Python3 loaded at the same time.
511      * It cause a crash, because RTLD_GLOBAL is needed for
512      * standard C extension libraries of one or both python versions. */
513     if (python3_loaded())
514     {
515 	if (verbose)
516 	    EMSG(_("E836: This Vim cannot execute :python after using :py3"));
517 	return FAIL;
518     }
519 #endif
520 
521     if (hinstPython)
522 	return OK;
523     hinstPython = load_dll(libname);
524     if (!hinstPython)
525     {
526 	if (verbose)
527 	    EMSG2(_(e_loadlib), libname);
528 	return FAIL;
529     }
530 
531     for (i = 0; python_funcname_table[i].ptr; ++i)
532     {
533 	if ((*python_funcname_table[i].ptr = symbol_from_dll(hinstPython,
534 			python_funcname_table[i].name)) == NULL)
535 	{
536 	    close_dll(hinstPython);
537 	    hinstPython = 0;
538 	    if (verbose)
539 		EMSG2(_(e_loadfunc), python_funcname_table[i].name);
540 	    return FAIL;
541 	}
542     }
543 
544     /* Load unicode functions separately as only the ucs2 or the ucs4 functions
545      * will be present in the library. */
546     ucs_as_encoded_string = symbol_from_dll(hinstPython,
547 					     "PyUnicodeUCS2_AsEncodedString");
548     if (ucs_as_encoded_string == NULL)
549 	ucs_as_encoded_string = symbol_from_dll(hinstPython,
550 					     "PyUnicodeUCS4_AsEncodedString");
551     if (ucs_as_encoded_string != NULL)
552 	py_PyUnicode_AsEncodedString = ucs_as_encoded_string;
553     else
554     {
555 	close_dll(hinstPython);
556 	hinstPython = 0;
557 	if (verbose)
558 	    EMSG2(_(e_loadfunc), "PyUnicode_UCSX_*");
559 	return FAIL;
560     }
561 
562     return OK;
563 }
564 
565 /*
566  * If python is enabled (there is installed python on Windows system) return
567  * TRUE, else FALSE.
568  */
569     int
570 python_enabled(int verbose)
571 {
572     return python_runtime_link_init(DYNAMIC_PYTHON_DLL, verbose) == OK;
573 }
574 
575 /*
576  * Load the standard Python exceptions - don't import the symbols from the
577  * DLL, as this can cause errors (importing data symbols is not reliable).
578  */
579     static void
580 get_exceptions(void)
581 {
582     PyObject *exmod = PyImport_ImportModule("exceptions");
583     PyObject *exdict = PyModule_GetDict(exmod);
584     imp_PyExc_AttributeError = PyDict_GetItemString(exdict, "AttributeError");
585     imp_PyExc_IndexError = PyDict_GetItemString(exdict, "IndexError");
586     imp_PyExc_KeyError = PyDict_GetItemString(exdict, "KeyError");
587     imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt");
588     imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError");
589     imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError");
590     Py_XINCREF(imp_PyExc_AttributeError);
591     Py_XINCREF(imp_PyExc_IndexError);
592     Py_XINCREF(imp_PyExc_KeyError);
593     Py_XINCREF(imp_PyExc_KeyboardInterrupt);
594     Py_XINCREF(imp_PyExc_TypeError);
595     Py_XINCREF(imp_PyExc_ValueError);
596     Py_XDECREF(exmod);
597 }
598 #endif /* DYNAMIC_PYTHON */
599 
600 static PyObject *BufferNew (buf_T *);
601 static PyObject *WindowNew(win_T *);
602 static PyObject *DictionaryNew(dict_T *);
603 static PyObject *LineToString(const char *);
604 
605 static int initialised = 0;
606 #define PYINITIALISED initialised
607 
608 #define DICTKEY_GET(err) \
609     if (!PyString_Check(keyObject)) \
610     { \
611 	PyErr_SetString(PyExc_TypeError, _("only string keys are allowed")); \
612 	return err; \
613     } \
614     if (PyString_AsStringAndSize(keyObject, (char **) &key, NULL) == -1) \
615 	return err;
616 
617 #define DICTKEY_UNREF
618 #define DICTKEY_DECL
619 
620 #define DESTRUCTOR_FINISH(self) Py_DECREF(self);
621 
622 static PyObject *OutputGetattr(PyObject *, char *);
623 static PyObject *BufferGetattr(PyObject *, char *);
624 static PyObject *WindowGetattr(PyObject *, char *);
625 static PyObject *RangeGetattr(PyObject *, char *);
626 static PyObject *DictionaryGetattr(PyObject *, char*);
627 static PyObject *ListGetattr(PyObject *, char *);
628 static PyObject *FunctionGetattr(PyObject *, char *);
629 
630 /*
631  * Include the code shared with if_python3.c
632  */
633 #include "if_py_both.h"
634 
635 
636 /******************************************************
637  * Internal function prototypes.
638  */
639 
640 static PyObject *globals;
641 
642 static void PythonIO_Flush(void);
643 static int PythonIO_Init(void);
644 static int PythonMod_Init(void);
645 
646 /* Utility functions for the vim/python interface
647  * ----------------------------------------------
648  */
649 
650 static int SetBufferLineList(buf_T *, PyInt, PyInt, PyObject *, PyInt *);
651 
652 
653 /******************************************************
654  * 1. Python interpreter main program.
655  */
656 
657 #if PYTHON_API_VERSION < 1007 /* Python 1.4 */
658 typedef PyObject PyThreadState;
659 #endif
660 
661 #ifdef PY_CAN_RECURSE
662 static PyGILState_STATE pygilstate = PyGILState_UNLOCKED;
663 #else
664 static PyThreadState *saved_python_thread = NULL;
665 #endif
666 
667 /*
668  * Suspend a thread of the Python interpreter, other threads are allowed to
669  * run.
670  */
671     static void
672 Python_SaveThread(void)
673 {
674 #ifdef PY_CAN_RECURSE
675     PyGILState_Release(pygilstate);
676 #else
677     saved_python_thread = PyEval_SaveThread();
678 #endif
679 }
680 
681 /*
682  * Restore a thread of the Python interpreter, waits for other threads to
683  * block.
684  */
685     static void
686 Python_RestoreThread(void)
687 {
688 #ifdef PY_CAN_RECURSE
689     pygilstate = PyGILState_Ensure();
690 #else
691     PyEval_RestoreThread(saved_python_thread);
692     saved_python_thread = NULL;
693 #endif
694 }
695 
696     void
697 python_end()
698 {
699     static int recurse = 0;
700 
701     /* If a crash occurs while doing this, don't try again. */
702     if (recurse != 0)
703 	return;
704 
705     ++recurse;
706 
707 #ifdef DYNAMIC_PYTHON
708     if (hinstPython && Py_IsInitialized())
709     {
710 	Python_RestoreThread();	    /* enter python */
711 	Py_Finalize();
712     }
713     end_dynamic_python();
714 #else
715     if (Py_IsInitialized())
716     {
717 	Python_RestoreThread();	    /* enter python */
718 	Py_Finalize();
719     }
720 #endif
721 
722     --recurse;
723 }
724 
725 #if (defined(DYNAMIC_PYTHON) && defined(FEAT_PYTHON3)) || defined(PROTO)
726     int
727 python_loaded()
728 {
729     return (hinstPython != 0);
730 }
731 #endif
732 
733     static int
734 Python_Init(void)
735 {
736     if (!initialised)
737     {
738 #ifdef DYNAMIC_PYTHON
739 	if (!python_enabled(TRUE))
740 	{
741 	    EMSG(_("E263: Sorry, this command is disabled, the Python library could not be loaded."));
742 	    goto fail;
743 	}
744 #endif
745 
746 #ifdef PYTHON_HOME
747 	Py_SetPythonHome(PYTHON_HOME);
748 #endif
749 
750 	init_structs();
751 
752 #if !defined(MACOS) || defined(MACOS_X_UNIX)
753 	Py_Initialize();
754 #else
755 	PyMac_Initialize();
756 #endif
757 	/* Initialise threads, and below save the state using
758 	 * PyEval_SaveThread.  Without the call to PyEval_SaveThread, thread
759 	 * specific state (such as the system trace hook), will be lost
760 	 * between invocations of Python code. */
761 	PyEval_InitThreads();
762 #ifdef DYNAMIC_PYTHON
763 	get_exceptions();
764 #endif
765 
766 	if (PythonIO_Init())
767 	    goto fail;
768 
769 	if (PythonMod_Init())
770 	    goto fail;
771 
772 	globals = PyModule_GetDict(PyImport_AddModule("__main__"));
773 
774 	/* Remove the element from sys.path that was added because of our
775 	 * argv[0] value in PythonMod_Init().  Previously we used an empty
776 	 * string, but depending on the OS we then get an empty entry or
777 	 * the current directory in sys.path. */
778 	PyRun_SimpleString("import sys; sys.path = filter(lambda x: x != '/must>not&exist', sys.path)");
779 
780 	/* lock is created and acquired in PyEval_InitThreads() and thread
781 	 * state is created in Py_Initialize()
782 	 * there _PyGILState_NoteThreadState() also sets gilcounter to 1
783 	 * (python must have threads enabled!)
784 	 * so the following does both: unlock GIL and save thread state in TLS
785 	 * without deleting thread state
786 	 */
787 	PyEval_SaveThread();
788 
789 	initialised = 1;
790     }
791 
792     return 0;
793 
794 fail:
795     /* We call PythonIO_Flush() here to print any Python errors.
796      * This is OK, as it is possible to call this function even
797      * if PythonIO_Init() has not completed successfully (it will
798      * not do anything in this case).
799      */
800     PythonIO_Flush();
801     return -1;
802 }
803 
804 /*
805  * External interface
806  */
807     static void
808 DoPythonCommand(exarg_T *eap, const char *cmd, typval_T *rettv)
809 {
810 #ifndef PY_CAN_RECURSE
811     static int		recursive = 0;
812 #endif
813 #if defined(MACOS) && !defined(MACOS_X_UNIX)
814     GrafPtr		oldPort;
815 #endif
816 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
817     char		*saved_locale;
818 #endif
819 
820 #ifndef PY_CAN_RECURSE
821     if (recursive)
822     {
823 	EMSG(_("E659: Cannot invoke Python recursively"));
824 	return;
825     }
826     ++recursive;
827 #endif
828 
829 #if defined(MACOS) && !defined(MACOS_X_UNIX)
830     GetPort(&oldPort);
831     /* Check if the Python library is available */
832     if ((Ptr)PyMac_Initialize == (Ptr)kUnresolvedCFragSymbolAddress)
833 	goto theend;
834 #endif
835     if (Python_Init())
836 	goto theend;
837 
838     if (rettv == NULL)
839     {
840 	RangeStart = eap->line1;
841 	RangeEnd = eap->line2;
842     }
843     else
844     {
845 	RangeStart = (PyInt) curwin->w_cursor.lnum;
846 	RangeEnd = RangeStart;
847     }
848     Python_Release_Vim();	    /* leave vim */
849 
850 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
851     /* Python only works properly when the LC_NUMERIC locale is "C". */
852     saved_locale = setlocale(LC_NUMERIC, NULL);
853     if (saved_locale == NULL || STRCMP(saved_locale, "C") == 0)
854 	saved_locale = NULL;
855     else
856     {
857 	/* Need to make a copy, value may change when setting new locale. */
858 	saved_locale = (char *)vim_strsave((char_u *)saved_locale);
859 	(void)setlocale(LC_NUMERIC, "C");
860     }
861 #endif
862 
863     Python_RestoreThread();	    /* enter python */
864 
865     if (rettv == NULL)
866 	PyRun_SimpleString((char *)(cmd));
867     else
868     {
869 	PyObject	*r;
870 
871 	r = PyRun_String((char *)(cmd), Py_eval_input, globals, globals);
872 	if (r == NULL)
873 	{
874 	    if (PyErr_Occurred() && !msg_silent)
875 		PyErr_PrintEx(0);
876 	    EMSG(_("E858: Eval did not return a valid python object"));
877 	}
878 	else
879 	{
880 	    if (ConvertFromPyObject(r, rettv) == -1)
881 		EMSG(_("E859: Failed to convert returned python object to vim value"));
882 	    Py_DECREF(r);
883 	}
884 	PyErr_Clear();
885     }
886 
887     Python_SaveThread();	    /* leave python */
888 
889 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
890     if (saved_locale != NULL)
891     {
892 	(void)setlocale(LC_NUMERIC, saved_locale);
893 	vim_free(saved_locale);
894     }
895 #endif
896 
897     Python_Lock_Vim();		    /* enter vim */
898     PythonIO_Flush();
899 #if defined(MACOS) && !defined(MACOS_X_UNIX)
900     SetPort(oldPort);
901 #endif
902 
903 theend:
904 #ifndef PY_CAN_RECURSE
905     --recursive;
906 #endif
907     return;
908 }
909 
910 /*
911  * ":python"
912  */
913     void
914 ex_python(exarg_T *eap)
915 {
916     char_u *script;
917 
918     script = script_get(eap, eap->arg);
919     if (!eap->skip)
920     {
921 	if (script == NULL)
922 	    DoPythonCommand(eap, (char *)eap->arg, NULL);
923 	else
924 	    DoPythonCommand(eap, (char *)script, NULL);
925     }
926     vim_free(script);
927 }
928 
929 #define BUFFER_SIZE 1024
930 
931 /*
932  * ":pyfile"
933  */
934     void
935 ex_pyfile(exarg_T *eap)
936 {
937     static char buffer[BUFFER_SIZE];
938     const char *file = (char *)eap->arg;
939     char *p;
940 
941     /* Have to do it like this. PyRun_SimpleFile requires you to pass a
942      * stdio file pointer, but Vim and the Python DLL are compiled with
943      * different options under Windows, meaning that stdio pointers aren't
944      * compatible between the two. Yuk.
945      *
946      * Put the string "execfile('file')" into buffer. But, we need to
947      * escape any backslashes or single quotes in the file name, so that
948      * Python won't mangle the file name.
949      */
950     strcpy(buffer, "execfile('");
951     p = buffer + 10; /* size of "execfile('" */
952 
953     while (*file && p < buffer + (BUFFER_SIZE - 3))
954     {
955 	if (*file == '\\' || *file == '\'')
956 	    *p++ = '\\';
957 	*p++ = *file++;
958     }
959 
960     /* If we didn't finish the file name, we hit a buffer overflow */
961     if (*file != '\0')
962 	return;
963 
964     /* Put in the terminating "')" and a null */
965     *p++ = '\'';
966     *p++ = ')';
967     *p++ = '\0';
968 
969     /* Execute the file */
970     DoPythonCommand(eap, buffer, NULL);
971 }
972 
973 /******************************************************
974  * 2. Python output stream: writes output via [e]msg().
975  */
976 
977 /* Implementation functions
978  */
979 
980     static PyObject *
981 OutputGetattr(PyObject *self, char *name)
982 {
983     if (strcmp(name, "softspace") == 0)
984 	return PyInt_FromLong(((OutputObject *)(self))->softspace);
985 
986     return Py_FindMethod(OutputMethods, self, name);
987 }
988 
989 /***************/
990 
991     static int
992 PythonIO_Init(void)
993 {
994     /* Fixups... */
995     PyType_Ready(&OutputType);
996 
997     return PythonIO_Init_io();
998 }
999 
1000 /******************************************************
1001  * 3. Implementation of the Vim module for Python
1002  */
1003 
1004 static PyObject *ConvertToPyObject(typval_T *);
1005 static int ConvertFromPyObject(PyObject *, typval_T *);
1006 
1007 /* Window type - Implementation functions
1008  * --------------------------------------
1009  */
1010 
1011 #define WindowType_Check(obj) ((obj)->ob_type == &WindowType)
1012 
1013 /* Buffer type - Implementation functions
1014  * --------------------------------------
1015  */
1016 
1017 #define BufferType_Check(obj) ((obj)->ob_type == &BufferType)
1018 
1019 static PyInt BufferLength(PyObject *);
1020 static PyObject *BufferItem(PyObject *, PyInt);
1021 static PyObject *BufferSlice(PyObject *, PyInt, PyInt);
1022 static PyInt BufferAssItem(PyObject *, PyInt, PyObject *);
1023 static PyInt BufferAssSlice(PyObject *, PyInt, PyInt, PyObject *);
1024 
1025 /* Line range type - Implementation functions
1026  * --------------------------------------
1027  */
1028 
1029 #define RangeType_Check(obj) ((obj)->ob_type == &RangeType)
1030 
1031 static PyInt RangeAssItem(PyObject *, PyInt, PyObject *);
1032 static PyInt RangeAssSlice(PyObject *, PyInt, PyInt, PyObject *);
1033 
1034 /* Current objects type - Implementation functions
1035  * -----------------------------------------------
1036  */
1037 
1038 static PySequenceMethods BufferAsSeq = {
1039     (PyInquiry)		BufferLength,	    /* sq_length,    len(x)   */
1040     (binaryfunc)	0,		    /* BufferConcat, sq_concat, x+y */
1041     (PyIntArgFunc)	0,		    /* BufferRepeat, sq_repeat, x*n */
1042     (PyIntArgFunc)	BufferItem,	    /* sq_item,      x[i]     */
1043     (PyIntIntArgFunc)	BufferSlice,	    /* sq_slice,     x[i:j]   */
1044     (PyIntObjArgProc)	BufferAssItem,	    /* sq_ass_item,  x[i]=v   */
1045     (PyIntIntObjArgProc) BufferAssSlice,    /* sq_ass_slice, x[i:j]=v */
1046     (objobjproc)	0,
1047 #if PY_MAJOR_VERSION >= 2
1048     (binaryfunc)	0,
1049     0,
1050 #endif
1051 };
1052 
1053 /* Buffer object - Implementation
1054  */
1055 
1056     static PyObject *
1057 BufferNew(buf_T *buf)
1058 {
1059     /* We need to handle deletion of buffers underneath us.
1060      * If we add a "b_python_ref" field to the buf_T structure,
1061      * then we can get at it in buf_freeall() in vim. We then
1062      * need to create only ONE Python object per buffer - if
1063      * we try to create a second, just INCREF the existing one
1064      * and return it. The (single) Python object referring to
1065      * the buffer is stored in "b_python_ref".
1066      * Question: what to do on a buf_freeall(). We'll probably
1067      * have to either delete the Python object (DECREF it to
1068      * zero - a bad idea, as it leaves dangling refs!) or
1069      * set the buf_T * value to an invalid value (-1?), which
1070      * means we need checks in all access functions... Bah.
1071      */
1072 
1073     BufferObject *self;
1074 
1075     if (buf->b_python_ref != NULL)
1076     {
1077 	self = buf->b_python_ref;
1078 	Py_INCREF(self);
1079     }
1080     else
1081     {
1082 	self = PyObject_NEW(BufferObject, &BufferType);
1083 	if (self == NULL)
1084 	    return NULL;
1085 	self->buf = buf;
1086 	buf->b_python_ref = self;
1087     }
1088 
1089     return (PyObject *)(self);
1090 }
1091 
1092     static PyObject *
1093 BufferGetattr(PyObject *self, char *name)
1094 {
1095     PyObject *r;
1096 
1097     if (CheckBuffer((BufferObject *)(self)))
1098 	return NULL;
1099 
1100     r = BufferAttr((BufferObject *)(self), name);
1101     if (r || PyErr_Occurred())
1102 	return r;
1103     else
1104 	return Py_FindMethod(BufferMethods, self, name);
1105 }
1106 
1107 /******************/
1108 
1109     static PyInt
1110 BufferLength(PyObject *self)
1111 {
1112     /* HOW DO WE SIGNAL AN ERROR FROM THIS FUNCTION? */
1113     if (CheckBuffer((BufferObject *)(self)))
1114 	return -1; /* ??? */
1115 
1116     return (((BufferObject *)(self))->buf->b_ml.ml_line_count);
1117 }
1118 
1119     static PyObject *
1120 BufferItem(PyObject *self, PyInt n)
1121 {
1122     return RBItem((BufferObject *)(self), n, 1,
1123 		  (int)((BufferObject *)(self))->buf->b_ml.ml_line_count);
1124 }
1125 
1126     static PyObject *
1127 BufferSlice(PyObject *self, PyInt lo, PyInt hi)
1128 {
1129     return RBSlice((BufferObject *)(self), lo, hi, 1,
1130 		   (int)((BufferObject *)(self))->buf->b_ml.ml_line_count);
1131 }
1132 
1133     static PyInt
1134 BufferAssItem(PyObject *self, PyInt n, PyObject *val)
1135 {
1136     return RBAsItem((BufferObject *)(self), n, val, 1,
1137 		     (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1138 		     NULL);
1139 }
1140 
1141     static PyInt
1142 BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
1143 {
1144     return RBAsSlice((BufferObject *)(self), lo, hi, val, 1,
1145 		      (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1146 		      NULL);
1147 }
1148 
1149 static PySequenceMethods RangeAsSeq = {
1150     (PyInquiry)		RangeLength,	      /* sq_length,    len(x)   */
1151     (binaryfunc)	0, /* RangeConcat, */ /* sq_concat,    x+y      */
1152     (PyIntArgFunc)	0, /* RangeRepeat, */ /* sq_repeat,    x*n      */
1153     (PyIntArgFunc)	RangeItem,	      /* sq_item,      x[i]     */
1154     (PyIntIntArgFunc)	RangeSlice,	      /* sq_slice,     x[i:j]   */
1155     (PyIntObjArgProc)	RangeAssItem,	      /* sq_ass_item,  x[i]=v   */
1156     (PyIntIntObjArgProc) RangeAssSlice,	      /* sq_ass_slice, x[i:j]=v */
1157     (objobjproc)	0,
1158 #if PY_MAJOR_VERSION >= 2
1159     (binaryfunc)	0,
1160     0,
1161 #endif
1162 };
1163 
1164 /* Line range object - Implementation
1165  */
1166 
1167     static PyObject *
1168 RangeGetattr(PyObject *self, char *name)
1169 {
1170     if (strcmp(name, "start") == 0)
1171 	return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->start - 1);
1172     else if (strcmp(name, "end") == 0)
1173 	return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->end - 1);
1174     else
1175 	return Py_FindMethod(RangeMethods, self, name);
1176 }
1177 
1178 /****************/
1179 
1180     static PyInt
1181 RangeAssItem(PyObject *self, PyInt n, PyObject *val)
1182 {
1183     return RBAsItem(((RangeObject *)(self))->buf, n, val,
1184 		     ((RangeObject *)(self))->start,
1185 		     ((RangeObject *)(self))->end,
1186 		     &((RangeObject *)(self))->end);
1187 }
1188 
1189     static PyInt
1190 RangeAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
1191 {
1192     return RBAsSlice(((RangeObject *)(self))->buf, lo, hi, val,
1193 		      ((RangeObject *)(self))->start,
1194 		      ((RangeObject *)(self))->end,
1195 		      &((RangeObject *)(self))->end);
1196 }
1197 
1198 /* Buffer list object - Definitions
1199  */
1200 
1201 static PySequenceMethods BufListAsSeq = {
1202     (PyInquiry)		BufListLength,	    /* sq_length,    len(x)   */
1203     (binaryfunc)	0,		    /* sq_concat,    x+y      */
1204     (PyIntArgFunc)	0,		    /* sq_repeat,    x*n      */
1205     (PyIntArgFunc)	BufListItem,	    /* sq_item,      x[i]     */
1206     (PyIntIntArgFunc)	0,		    /* sq_slice,     x[i:j]   */
1207     (PyIntObjArgProc)	0,		    /* sq_ass_item,  x[i]=v   */
1208     (PyIntIntObjArgProc) 0,		    /* sq_ass_slice, x[i:j]=v */
1209     (objobjproc)	0,
1210 #if PY_MAJOR_VERSION >= 2
1211     (binaryfunc)	0,
1212     0,
1213 #endif
1214 };
1215 
1216 /* Window object - Implementation
1217  */
1218 
1219     static PyObject *
1220 WindowNew(win_T *win)
1221 {
1222     /* We need to handle deletion of windows underneath us.
1223      * If we add a "w_python_ref" field to the win_T structure,
1224      * then we can get at it in win_free() in vim. We then
1225      * need to create only ONE Python object per window - if
1226      * we try to create a second, just INCREF the existing one
1227      * and return it. The (single) Python object referring to
1228      * the window is stored in "w_python_ref".
1229      * On a win_free() we set the Python object's win_T* field
1230      * to an invalid value. We trap all uses of a window
1231      * object, and reject them if the win_T* field is invalid.
1232      */
1233 
1234     WindowObject *self;
1235 
1236     if (win->w_python_ref)
1237     {
1238 	self = win->w_python_ref;
1239 	Py_INCREF(self);
1240     }
1241     else
1242     {
1243 	self = PyObject_NEW(WindowObject, &WindowType);
1244 	if (self == NULL)
1245 	    return NULL;
1246 	self->win = win;
1247 	win->w_python_ref = self;
1248     }
1249 
1250     return (PyObject *)(self);
1251 }
1252 
1253     static PyObject *
1254 WindowGetattr(PyObject *self, char *name)
1255 {
1256     PyObject *r;
1257 
1258     if (CheckWindow((WindowObject *)(self)))
1259 	return NULL;
1260 
1261     r = WindowAttr((WindowObject *)(self), name);
1262     if (r || PyErr_Occurred())
1263 	return r;
1264     else
1265 	return Py_FindMethod(WindowMethods, self, name);
1266 }
1267 
1268 /* Window list object - Definitions
1269  */
1270 
1271 static PySequenceMethods WinListAsSeq = {
1272     (PyInquiry)		WinListLength,	    /* sq_length,    len(x)   */
1273     (binaryfunc)	0,		    /* sq_concat,    x+y      */
1274     (PyIntArgFunc)	0,		    /* sq_repeat,    x*n      */
1275     (PyIntArgFunc)	WinListItem,	    /* sq_item,      x[i]     */
1276     (PyIntIntArgFunc)	0,		    /* sq_slice,     x[i:j]   */
1277     (PyIntObjArgProc)	0,		    /* sq_ass_item,  x[i]=v   */
1278     (PyIntIntObjArgProc) 0,		    /* sq_ass_slice, x[i:j]=v */
1279     (objobjproc)	0,
1280 #if PY_MAJOR_VERSION >= 2
1281     (binaryfunc)	0,
1282     0,
1283 #endif
1284 };
1285 
1286 /* External interface
1287  */
1288 
1289     void
1290 python_buffer_free(buf_T *buf)
1291 {
1292     if (buf->b_python_ref != NULL)
1293     {
1294 	BufferObject *bp = buf->b_python_ref;
1295 	bp->buf = INVALID_BUFFER_VALUE;
1296 	buf->b_python_ref = NULL;
1297     }
1298 }
1299 
1300 #if defined(FEAT_WINDOWS) || defined(PROTO)
1301     void
1302 python_window_free(win_T *win)
1303 {
1304     if (win->w_python_ref != NULL)
1305     {
1306 	WindowObject *wp = win->w_python_ref;
1307 	wp->win = INVALID_WINDOW_VALUE;
1308 	win->w_python_ref = NULL;
1309     }
1310 }
1311 #endif
1312 
1313 static BufListObject TheBufferList =
1314 {
1315     PyObject_HEAD_INIT(&BufListType)
1316 };
1317 
1318 static WinListObject TheWindowList =
1319 {
1320     PyObject_HEAD_INIT(&WinListType)
1321 };
1322 
1323 static CurrentObject TheCurrent =
1324 {
1325     PyObject_HEAD_INIT(&CurrentType)
1326 };
1327 
1328     static int
1329 PythonMod_Init(void)
1330 {
1331     PyObject *mod;
1332     PyObject *dict;
1333     PyObject *tmp;
1334     /* The special value is removed from sys.path in Python_Init(). */
1335     static char *(argv[2]) = {"/must>not&exist/foo", NULL};
1336 
1337     /* Fixups... */
1338     PyType_Ready(&BufferType);
1339     PyType_Ready(&RangeType);
1340     PyType_Ready(&WindowType);
1341     PyType_Ready(&BufListType);
1342     PyType_Ready(&WinListType);
1343     PyType_Ready(&CurrentType);
1344     PyType_Ready(&OptionsType);
1345 
1346     /* Set sys.argv[] to avoid a crash in warn(). */
1347     PySys_SetArgv(1, argv);
1348 
1349     mod = Py_InitModule4("vim", VimMethods, (char *)NULL, (PyObject *)NULL, PYTHON_API_VERSION);
1350     dict = PyModule_GetDict(mod);
1351 
1352     VimError = Py_BuildValue("s", "vim.error");
1353 
1354     PyDict_SetItemString(dict, "error", VimError);
1355     PyDict_SetItemString(dict, "buffers", (PyObject *)(void *)&TheBufferList);
1356     PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent);
1357     PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList);
1358     tmp = DictionaryNew(&globvardict);
1359     PyDict_SetItemString(dict, "vars",    tmp);
1360     Py_DECREF(tmp);
1361     tmp = DictionaryNew(&vimvardict);
1362     PyDict_SetItemString(dict, "vvars",   tmp);
1363     Py_DECREF(tmp);
1364     tmp = OptionsNew(SREQ_GLOBAL, NULL, dummy_check, NULL);
1365     PyDict_SetItemString(dict, "options", tmp);
1366     Py_DECREF(tmp);
1367     PyDict_SetItemString(dict, "VAR_LOCKED",    PyInt_FromLong(VAR_LOCKED));
1368     PyDict_SetItemString(dict, "VAR_FIXED",     PyInt_FromLong(VAR_FIXED));
1369     PyDict_SetItemString(dict, "VAR_SCOPE",     PyInt_FromLong(VAR_SCOPE));
1370     PyDict_SetItemString(dict, "VAR_DEF_SCOPE", PyInt_FromLong(VAR_DEF_SCOPE));
1371 
1372     if (PyErr_Occurred())
1373 	return -1;
1374 
1375     return 0;
1376 }
1377 
1378 /*************************************************************************
1379  * 4. Utility functions for handling the interface between Vim and Python.
1380  */
1381 
1382 /* Convert a Vim line into a Python string.
1383  * All internal newlines are replaced by null characters.
1384  *
1385  * On errors, the Python exception data is set, and NULL is returned.
1386  */
1387     static PyObject *
1388 LineToString(const char *str)
1389 {
1390     PyObject *result;
1391     PyInt len = strlen(str);
1392     char *p;
1393 
1394     /* Allocate an Python string object, with uninitialised contents. We
1395      * must do it this way, so that we can modify the string in place
1396      * later. See the Python source, Objects/stringobject.c for details.
1397      */
1398     result = PyString_FromStringAndSize(NULL, len);
1399     if (result == NULL)
1400 	return NULL;
1401 
1402     p = PyString_AsString(result);
1403 
1404     while (*str)
1405     {
1406 	if (*str == '\n')
1407 	    *p = '\0';
1408 	else
1409 	    *p = *str;
1410 
1411 	++p;
1412 	++str;
1413     }
1414 
1415     return result;
1416 }
1417 
1418     static PyObject *
1419 DictionaryGetattr(PyObject *self, char *name)
1420 {
1421     DictionaryObject	*this = ((DictionaryObject *) (self));
1422 
1423     if (strcmp(name, "locked") == 0)
1424 	return PyInt_FromLong(this->dict->dv_lock);
1425     else if (strcmp(name, "scope") == 0)
1426 	return PyInt_FromLong(this->dict->dv_scope);
1427 
1428     return Py_FindMethod(DictionaryMethods, self, name);
1429 }
1430 
1431 static PySequenceMethods ListAsSeq = {
1432     (PyInquiry)			ListLength,
1433     (binaryfunc)		0,
1434     (PyIntArgFunc)		0,
1435     (PyIntArgFunc)		ListItem,
1436     (PyIntIntArgFunc)		ListSlice,
1437     (PyIntObjArgProc)		ListAssItem,
1438     (PyIntIntObjArgProc)	ListAssSlice,
1439     (objobjproc)		0,
1440 #if PY_MAJOR_VERSION >= 2
1441     (binaryfunc)		ListConcatInPlace,
1442     0,
1443 #endif
1444 };
1445 
1446     static PyObject *
1447 ListGetattr(PyObject *self, char *name)
1448 {
1449     if (strcmp(name, "locked") == 0)
1450 	return PyInt_FromLong(((ListObject *)(self))->list->lv_lock);
1451 
1452     return Py_FindMethod(ListMethods, self, name);
1453 }
1454 
1455     static PyObject *
1456 FunctionGetattr(PyObject *self, char *name)
1457 {
1458     FunctionObject	*this = (FunctionObject *)(self);
1459 
1460     if (strcmp(name, "name") == 0)
1461 	return PyString_FromString((char *)(this->name));
1462     else
1463 	return Py_FindMethod(FunctionMethods, self, name);
1464 }
1465 
1466     void
1467 do_pyeval (char_u *str, typval_T *rettv)
1468 {
1469     DoPythonCommand(NULL, (char *) str, rettv);
1470     switch(rettv->v_type)
1471     {
1472 	case VAR_DICT: ++rettv->vval.v_dict->dv_refcount; break;
1473 	case VAR_LIST: ++rettv->vval.v_list->lv_refcount; break;
1474 	case VAR_FUNC: func_ref(rettv->vval.v_string);    break;
1475 	case VAR_UNKNOWN:
1476 	    rettv->v_type = VAR_NUMBER;
1477 	    rettv->vval.v_number = 0;
1478 	    break;
1479     }
1480 }
1481 
1482 /* Don't generate a prototype for the next function, it generates an error on
1483  * newer Python versions. */
1484 #if PYTHON_API_VERSION < 1007 /* Python 1.4 */ && !defined(PROTO)
1485 
1486     char *
1487 Py_GetProgramName(void)
1488 {
1489     return "vim";
1490 }
1491 #endif /* Python 1.4 */
1492 
1493     void
1494 set_ref_in_python (int copyID)
1495 {
1496     set_ref_in_py(copyID);
1497 }
1498