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