xref: /vim-8.2.3635/src/if_python3.c (revision 6be7f873)
1 /* vi:set ts=8 sts=4 sw=4:
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 /*
21  * Roland Puntaier 2009/sept/16:
22  * Adaptations to support both python3.x and python2.x
23  */
24 
25 /* uncomment this if used with the debug version of python */
26 /* #define Py_DEBUG */
27 
28 #include "vim.h"
29 
30 #include <limits.h>
31 
32 /* Python.h defines _POSIX_THREADS itself (if needed) */
33 #ifdef _POSIX_THREADS
34 # undef _POSIX_THREADS
35 #endif
36 
37 #if defined(_WIN32) && defined(HAVE_FCNTL_H)
38 # undef HAVE_FCNTL_H
39 #endif
40 
41 #ifdef _DEBUG
42 # undef _DEBUG
43 #endif
44 
45 #define PY_SSIZE_T_CLEAN
46 
47 #ifdef F_BLANK
48 # undef F_BLANK
49 #endif
50 
51 #ifdef HAVE_STDARG_H
52 # undef HAVE_STDARG_H   /* Python's config.h defines it as well. */
53 #endif
54 #ifdef _POSIX_C_SOURCE  /* defined in feature.h */
55 # undef _POSIX_C_SOURCE
56 #endif
57 #ifdef _XOPEN_SOURCE
58 # undef _XOPEN_SOURCE	/* pyconfig.h defines it as well. */
59 #endif
60 
61 #include <Python.h>
62 #if defined(MACOS) && !defined(MACOS_X_UNIX)
63 # include "macglue.h"
64 # include <CodeFragments.h>
65 #endif
66 #undef main /* Defined in python.h - aargh */
67 #undef HAVE_FCNTL_H /* Clash with os_win32.h */
68 
69 static void init_structs(void);
70 
71 /* The "surrogateescape" error handler is new in Python 3.1 */
72 #if PY_VERSION_HEX >= 0x030100f0
73 # define CODEC_ERROR_HANDLER "surrogateescape"
74 #else
75 # define CODEC_ERROR_HANDLER NULL
76 #endif
77 
78 #define PyInt Py_ssize_t
79 #define PyString_Check(obj) PyUnicode_Check(obj)
80 #define PyString_AsBytes(obj) PyUnicode_AsEncodedString(obj, (char *)ENC_OPT, CODEC_ERROR_HANDLER);
81 #define PyString_FreeBytes(obj) Py_XDECREF(bytes)
82 #define PyString_AsString(obj) PyBytes_AsString(obj)
83 #define PyString_Size(obj) PyBytes_GET_SIZE(bytes)
84 #define PyString_FromString(repr) PyUnicode_FromString(repr)
85 
86 #if defined(DYNAMIC_PYTHON3) || defined(PROTO)
87 
88 # ifndef WIN3264
89 #  include <dlfcn.h>
90 #  define FARPROC void*
91 #  define HINSTANCE void*
92 #  if defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)
93 #   define load_dll(n) dlopen((n), RTLD_LAZY)
94 #  else
95 #   define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
96 #  endif
97 #  define close_dll dlclose
98 #  define symbol_from_dll dlsym
99 # else
100 #  define load_dll vimLoadLib
101 #  define close_dll FreeLibrary
102 #  define symbol_from_dll GetProcAddress
103 # endif
104 /*
105  * Wrapper defines
106  */
107 # undef PyArg_Parse
108 # define PyArg_Parse py3_PyArg_Parse
109 # undef PyArg_ParseTuple
110 # define PyArg_ParseTuple py3_PyArg_ParseTuple
111 # define PyMem_Free py3_PyMem_Free
112 # define PyDict_SetItemString py3_PyDict_SetItemString
113 # define PyErr_BadArgument py3_PyErr_BadArgument
114 # define PyErr_Clear py3_PyErr_Clear
115 # define PyErr_NoMemory py3_PyErr_NoMemory
116 # define PyErr_Occurred py3_PyErr_Occurred
117 # define PyErr_SetNone py3_PyErr_SetNone
118 # define PyErr_SetString py3_PyErr_SetString
119 # define PyEval_InitThreads py3_PyEval_InitThreads
120 # define PyEval_RestoreThread py3_PyEval_RestoreThread
121 # define PyEval_SaveThread py3_PyEval_SaveThread
122 # define PyGILState_Ensure py3_PyGILState_Ensure
123 # define PyGILState_Release py3_PyGILState_Release
124 # define PyLong_AsLong py3_PyLong_AsLong
125 # define PyLong_FromLong py3_PyLong_FromLong
126 # define PyList_GetItem py3_PyList_GetItem
127 # define PyList_Append py3_PyList_Append
128 # define PyList_New py3_PyList_New
129 # define PyList_SetItem py3_PyList_SetItem
130 # define PyList_Size py3_PyList_Size
131 # define PySlice_GetIndicesEx py3_PySlice_GetIndicesEx
132 # define PyImport_ImportModule py3_PyImport_ImportModule
133 # define PyObject_Init py3__PyObject_Init
134 # define PyDict_New py3_PyDict_New
135 # define PyDict_GetItemString py3_PyDict_GetItemString
136 # define PyModule_GetDict py3_PyModule_GetDict
137 #undef PyRun_SimpleString
138 # define PyRun_SimpleString py3_PyRun_SimpleString
139 # define PySys_SetObject py3_PySys_SetObject
140 # define PySys_SetArgv py3_PySys_SetArgv
141 # define PyType_Type (*py3_PyType_Type)
142 # define PyType_Ready py3_PyType_Ready
143 #undef Py_BuildValue
144 # define Py_BuildValue py3_Py_BuildValue
145 # define Py_SetPythonHome py3_Py_SetPythonHome
146 # define Py_Initialize py3_Py_Initialize
147 # define Py_Finalize py3_Py_Finalize
148 # define Py_IsInitialized py3_Py_IsInitialized
149 # define _Py_NoneStruct (*py3__Py_NoneStruct)
150 # define PyModule_AddObject py3_PyModule_AddObject
151 # define PyImport_AppendInittab py3_PyImport_AppendInittab
152 # define _PyUnicode_AsString py3__PyUnicode_AsString
153 # undef PyUnicode_AsEncodedString
154 # define PyUnicode_AsEncodedString py3_PyUnicode_AsEncodedString
155 # undef PyBytes_AsString
156 # define PyBytes_AsString py3_PyBytes_AsString
157 # define PyObject_GenericGetAttr py3_PyObject_GenericGetAttr
158 # define PySlice_Type (*py3_PySlice_Type)
159 # define PyErr_NewException py3_PyErr_NewException
160 # ifdef Py_DEBUG
161 #  define _Py_NegativeRefcount py3__Py_NegativeRefcount
162 #  define _Py_RefTotal (*py3__Py_RefTotal)
163 #  define _Py_Dealloc py3__Py_Dealloc
164 #  define _PyObject_DebugMalloc py3__PyObject_DebugMalloc
165 #  define _PyObject_DebugFree py3__PyObject_DebugFree
166 # else
167 #  define PyObject_Malloc py3_PyObject_Malloc
168 #  define PyObject_Free py3_PyObject_Free
169 # endif
170 # define PyType_GenericAlloc py3_PyType_GenericAlloc
171 # define PyType_GenericNew py3_PyType_GenericNew
172 # define PyModule_Create2 py3_PyModule_Create2
173 # undef PyUnicode_FromString
174 # define PyUnicode_FromString py3_PyUnicode_FromString
175 # undef PyUnicode_Decode
176 # define PyUnicode_Decode py3_PyUnicode_Decode
177 
178 # ifdef Py_DEBUG
179 #  undef PyObject_NEW
180 #  define PyObject_NEW(type, typeobj) \
181 ( (type *) PyObject_Init( \
182 	(PyObject *) _PyObject_DebugMalloc( _PyObject_SIZE(typeobj) ), (typeobj)) )
183 # endif
184 
185 /*
186  * Pointers for dynamic link
187  */
188 static int (*py3_PySys_SetArgv)(int, wchar_t **);
189 static void (*py3_Py_SetPythonHome)(wchar_t *home);
190 static void (*py3_Py_Initialize)(void);
191 static PyObject* (*py3_PyList_New)(Py_ssize_t size);
192 static PyGILState_STATE (*py3_PyGILState_Ensure)(void);
193 static void (*py3_PyGILState_Release)(PyGILState_STATE);
194 static int (*py3_PySys_SetObject)(char *, PyObject *);
195 static PyObject* (*py3_PyList_Append)(PyObject *, PyObject *);
196 static Py_ssize_t (*py3_PyList_Size)(PyObject *);
197 static int (*py3_PySlice_GetIndicesEx)(PyObject *r, Py_ssize_t length,
198 		     Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength);
199 static PyObject* (*py3_PyErr_NoMemory)(void);
200 static void (*py3_Py_Finalize)(void);
201 static void (*py3_PyErr_SetString)(PyObject *, const char *);
202 static int (*py3_PyRun_SimpleString)(char *);
203 static PyObject* (*py3_PyList_GetItem)(PyObject *, Py_ssize_t);
204 static PyObject* (*py3_PyImport_ImportModule)(const char *);
205 static int (*py3_PyErr_BadArgument)(void);
206 static PyTypeObject* py3_PyType_Type;
207 static PyObject* (*py3_PyErr_Occurred)(void);
208 static PyObject* (*py3_PyModule_GetDict)(PyObject *);
209 static int (*py3_PyList_SetItem)(PyObject *, Py_ssize_t, PyObject *);
210 static PyObject* (*py3_PyDict_GetItemString)(PyObject *, const char *);
211 static PyObject* (*py3_PyLong_FromLong)(long);
212 static PyObject* (*py3_PyDict_New)(void);
213 static PyObject* (*py3_Py_BuildValue)(char *, ...);
214 static int (*py3_PyType_Ready)(PyTypeObject *type);
215 static int (*py3_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item);
216 static PyObject* (*py3_PyUnicode_FromString)(const char *u);
217 static PyObject* (*py3_PyUnicode_Decode)(const char *u, Py_ssize_t size,
218 	const char *encoding, const char *errors);
219 static long (*py3_PyLong_AsLong)(PyObject *);
220 static void (*py3_PyErr_SetNone)(PyObject *);
221 static void (*py3_PyEval_InitThreads)(void);
222 static void(*py3_PyEval_RestoreThread)(PyThreadState *);
223 static PyThreadState*(*py3_PyEval_SaveThread)(void);
224 static int (*py3_PyArg_Parse)(PyObject *, char *, ...);
225 static int (*py3_PyArg_ParseTuple)(PyObject *, char *, ...);
226 static int (*py3_PyMem_Free)(void *);
227 static int (*py3_Py_IsInitialized)(void);
228 static void (*py3_PyErr_Clear)(void);
229 static PyObject*(*py3__PyObject_Init)(PyObject *, PyTypeObject *);
230 static PyObject* py3__Py_NoneStruct;
231 static int (*py3_PyModule_AddObject)(PyObject *m, const char *name, PyObject *o);
232 static int (*py3_PyImport_AppendInittab)(const char *name, PyObject* (*initfunc)(void));
233 static char* (*py3__PyUnicode_AsString)(PyObject *unicode);
234 static PyObject* (*py3_PyUnicode_AsEncodedString)(PyObject *unicode, const char* encoding, const char* errors);
235 static char* (*py3_PyBytes_AsString)(PyObject *bytes);
236 static PyObject* (*py3_PyObject_GenericGetAttr)(PyObject *obj, PyObject *name);
237 static PyObject* (*py3_PyModule_Create2)(struct PyModuleDef* module, int module_api_version);
238 static PyObject* (*py3_PyType_GenericAlloc)(PyTypeObject *type, Py_ssize_t nitems);
239 static PyObject* (*py3_PyType_GenericNew)(PyTypeObject *type, PyObject *args, PyObject *kwds);
240 static PyTypeObject* py3_PySlice_Type;
241 static PyObject* (*py3_PyErr_NewException)(char *name, PyObject *base, PyObject *dict);
242 # ifdef Py_DEBUG
243     static void (*py3__Py_NegativeRefcount)(const char *fname, int lineno, PyObject *op);
244     static Py_ssize_t* py3__Py_RefTotal;
245     static void (*py3__Py_Dealloc)(PyObject *obj);
246     static void (*py3__PyObject_DebugFree)(void*);
247     static void* (*py3__PyObject_DebugMalloc)(size_t);
248 # else
249     static void (*py3_PyObject_Free)(void*);
250     static void* (*py3_PyObject_Malloc)(size_t);
251 # endif
252 
253 static HINSTANCE hinstPy3 = 0; /* Instance of python.dll */
254 
255 /* Imported exception objects */
256 static PyObject *p3imp_PyExc_AttributeError;
257 static PyObject *p3imp_PyExc_IndexError;
258 static PyObject *p3imp_PyExc_KeyboardInterrupt;
259 static PyObject *p3imp_PyExc_TypeError;
260 static PyObject *p3imp_PyExc_ValueError;
261 
262 # define PyExc_AttributeError p3imp_PyExc_AttributeError
263 # define PyExc_IndexError p3imp_PyExc_IndexError
264 # define PyExc_KeyboardInterrupt p3imp_PyExc_KeyboardInterrupt
265 # define PyExc_TypeError p3imp_PyExc_TypeError
266 # define PyExc_ValueError p3imp_PyExc_ValueError
267 
268 /*
269  * Table of name to function pointer of python.
270  */
271 # define PYTHON_PROC FARPROC
272 static struct
273 {
274     char *name;
275     PYTHON_PROC *ptr;
276 } py3_funcname_table[] =
277 {
278     {"PySys_SetArgv", (PYTHON_PROC*)&py3_PySys_SetArgv},
279     {"Py_SetPythonHome", (PYTHON_PROC*)&py3_Py_SetPythonHome},
280     {"Py_Initialize", (PYTHON_PROC*)&py3_Py_Initialize},
281     {"PyArg_ParseTuple", (PYTHON_PROC*)&py3_PyArg_ParseTuple},
282     {"PyMem_Free", (PYTHON_PROC*)&py3_PyMem_Free},
283     {"PyList_New", (PYTHON_PROC*)&py3_PyList_New},
284     {"PyGILState_Ensure", (PYTHON_PROC*)&py3_PyGILState_Ensure},
285     {"PyGILState_Release", (PYTHON_PROC*)&py3_PyGILState_Release},
286     {"PySys_SetObject", (PYTHON_PROC*)&py3_PySys_SetObject},
287     {"PyList_Append", (PYTHON_PROC*)&py3_PyList_Append},
288     {"PyList_Size", (PYTHON_PROC*)&py3_PyList_Size},
289     {"PySlice_GetIndicesEx", (PYTHON_PROC*)&py3_PySlice_GetIndicesEx},
290     {"PyErr_NoMemory", (PYTHON_PROC*)&py3_PyErr_NoMemory},
291     {"Py_Finalize", (PYTHON_PROC*)&py3_Py_Finalize},
292     {"PyErr_SetString", (PYTHON_PROC*)&py3_PyErr_SetString},
293     {"PyRun_SimpleString", (PYTHON_PROC*)&py3_PyRun_SimpleString},
294     {"PyList_GetItem", (PYTHON_PROC*)&py3_PyList_GetItem},
295     {"PyImport_ImportModule", (PYTHON_PROC*)&py3_PyImport_ImportModule},
296     {"PyErr_BadArgument", (PYTHON_PROC*)&py3_PyErr_BadArgument},
297     {"PyType_Type", (PYTHON_PROC*)&py3_PyType_Type},
298     {"PyErr_Occurred", (PYTHON_PROC*)&py3_PyErr_Occurred},
299     {"PyModule_GetDict", (PYTHON_PROC*)&py3_PyModule_GetDict},
300     {"PyList_SetItem", (PYTHON_PROC*)&py3_PyList_SetItem},
301     {"PyDict_GetItemString", (PYTHON_PROC*)&py3_PyDict_GetItemString},
302     {"PyLong_FromLong", (PYTHON_PROC*)&py3_PyLong_FromLong},
303     {"PyDict_New", (PYTHON_PROC*)&py3_PyDict_New},
304     {"Py_BuildValue", (PYTHON_PROC*)&py3_Py_BuildValue},
305     {"PyType_Ready", (PYTHON_PROC*)&py3_PyType_Ready},
306     {"PyDict_SetItemString", (PYTHON_PROC*)&py3_PyDict_SetItemString},
307     {"PyLong_AsLong", (PYTHON_PROC*)&py3_PyLong_AsLong},
308     {"PyErr_SetNone", (PYTHON_PROC*)&py3_PyErr_SetNone},
309     {"PyEval_InitThreads", (PYTHON_PROC*)&py3_PyEval_InitThreads},
310     {"PyEval_RestoreThread", (PYTHON_PROC*)&py3_PyEval_RestoreThread},
311     {"PyEval_SaveThread", (PYTHON_PROC*)&py3_PyEval_SaveThread},
312     {"PyArg_Parse", (PYTHON_PROC*)&py3_PyArg_Parse},
313     {"Py_IsInitialized", (PYTHON_PROC*)&py3_Py_IsInitialized},
314     {"_Py_NoneStruct", (PYTHON_PROC*)&py3__Py_NoneStruct},
315     {"PyErr_Clear", (PYTHON_PROC*)&py3_PyErr_Clear},
316     {"PyObject_Init", (PYTHON_PROC*)&py3__PyObject_Init},
317     {"PyModule_AddObject", (PYTHON_PROC*)&py3_PyModule_AddObject},
318     {"PyImport_AppendInittab", (PYTHON_PROC*)&py3_PyImport_AppendInittab},
319     {"_PyUnicode_AsString", (PYTHON_PROC*)&py3__PyUnicode_AsString},
320     {"PyBytes_AsString", (PYTHON_PROC*)&py3_PyBytes_AsString},
321     {"PyObject_GenericGetAttr", (PYTHON_PROC*)&py3_PyObject_GenericGetAttr},
322     {"PyModule_Create2", (PYTHON_PROC*)&py3_PyModule_Create2},
323     {"PyType_GenericAlloc", (PYTHON_PROC*)&py3_PyType_GenericAlloc},
324     {"PyType_GenericNew", (PYTHON_PROC*)&py3_PyType_GenericNew},
325     {"PySlice_Type", (PYTHON_PROC*)&py3_PySlice_Type},
326     {"PyErr_NewException", (PYTHON_PROC*)&py3_PyErr_NewException},
327 # ifdef Py_DEBUG
328     {"_Py_NegativeRefcount", (PYTHON_PROC*)&py3__Py_NegativeRefcount},
329     {"_Py_RefTotal", (PYTHON_PROC*)&py3__Py_RefTotal},
330     {"_Py_Dealloc", (PYTHON_PROC*)&py3__Py_Dealloc},
331     {"_PyObject_DebugFree", (PYTHON_PROC*)&py3__PyObject_DebugFree},
332     {"_PyObject_DebugMalloc", (PYTHON_PROC*)&py3__PyObject_DebugMalloc},
333 # else
334     {"PyObject_Malloc", (PYTHON_PROC*)&py3_PyObject_Malloc},
335     {"PyObject_Free", (PYTHON_PROC*)&py3_PyObject_Free},
336 # endif
337     {"", NULL},
338 };
339 
340 /*
341  * Free python.dll
342  */
343     static void
344 end_dynamic_python3(void)
345 {
346     if (hinstPy3 != 0)
347     {
348 	close_dll(hinstPy3);
349 	hinstPy3 = 0;
350     }
351 }
352 
353 /*
354  * Load library and get all pointers.
355  * Parameter 'libname' provides name of DLL.
356  * Return OK or FAIL.
357  */
358     static int
359 py3_runtime_link_init(char *libname, int verbose)
360 {
361     int i;
362     void *ucs_from_string, *ucs_decode, *ucs_as_encoded_string;
363 
364 # if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON)
365     /* Can't have Python and Python3 loaded at the same time.
366      * It cause a crash, because RTLD_GLOBAL is needed for
367      * standard C extension libraries of one or both python versions. */
368     if (python_loaded())
369     {
370 	if (verbose)
371 	    EMSG(_("E837: This Vim cannot execute :py3 after using :python"));
372 	return FAIL;
373     }
374 # endif
375 
376     if (hinstPy3 != 0)
377 	return OK;
378     hinstPy3 = load_dll(libname);
379 
380     if (!hinstPy3)
381     {
382 	if (verbose)
383 	    EMSG2(_(e_loadlib), libname);
384 	return FAIL;
385     }
386 
387     for (i = 0; py3_funcname_table[i].ptr; ++i)
388     {
389 	if ((*py3_funcname_table[i].ptr = symbol_from_dll(hinstPy3,
390 			py3_funcname_table[i].name)) == NULL)
391 	{
392 	    close_dll(hinstPy3);
393 	    hinstPy3 = 0;
394 	    if (verbose)
395 		EMSG2(_(e_loadfunc), py3_funcname_table[i].name);
396 	    return FAIL;
397 	}
398     }
399 
400     /* Load unicode functions separately as only the ucs2 or the ucs4 functions
401      * will be present in the library. */
402     ucs_from_string = symbol_from_dll(hinstPy3, "PyUnicodeUCS2_FromString");
403     ucs_decode = symbol_from_dll(hinstPy3,
404 	    "PyUnicodeUCS2_Decode");
405     ucs_as_encoded_string = symbol_from_dll(hinstPy3,
406 	    "PyUnicodeUCS2_AsEncodedString");
407     if (!ucs_from_string || !ucs_decode || !ucs_as_encoded_string)
408     {
409 	ucs_from_string = symbol_from_dll(hinstPy3,
410 		"PyUnicodeUCS4_FromString");
411 	ucs_decode = symbol_from_dll(hinstPy3,
412 		"PyUnicodeUCS4_Decode");
413 	ucs_as_encoded_string = symbol_from_dll(hinstPy3,
414 		"PyUnicodeUCS4_AsEncodedString");
415     }
416     if (ucs_from_string && ucs_decode && ucs_as_encoded_string)
417     {
418 	py3_PyUnicode_FromString = ucs_from_string;
419 	py3_PyUnicode_Decode = ucs_decode;
420 	py3_PyUnicode_AsEncodedString = ucs_as_encoded_string;
421     }
422     else
423     {
424 	close_dll(hinstPy3);
425 	hinstPy3 = 0;
426 	if (verbose)
427 	    EMSG2(_(e_loadfunc), "PyUnicode_UCSX_*");
428 	return FAIL;
429     }
430 
431     return OK;
432 }
433 
434 /*
435  * If python is enabled (there is installed python on Windows system) return
436  * TRUE, else FALSE.
437  */
438     int
439 python3_enabled(int verbose)
440 {
441     return py3_runtime_link_init(DYNAMIC_PYTHON3_DLL, verbose) == OK;
442 }
443 
444 /* Load the standard Python exceptions - don't import the symbols from the
445  * DLL, as this can cause errors (importing data symbols is not reliable).
446  */
447 static void get_py3_exceptions __ARGS((void));
448 
449     static void
450 get_py3_exceptions()
451 {
452     PyObject *exmod = PyImport_ImportModule("builtins");
453     PyObject *exdict = PyModule_GetDict(exmod);
454     p3imp_PyExc_AttributeError = PyDict_GetItemString(exdict, "AttributeError");
455     p3imp_PyExc_IndexError = PyDict_GetItemString(exdict, "IndexError");
456     p3imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt");
457     p3imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError");
458     p3imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError");
459     Py_XINCREF(p3imp_PyExc_AttributeError);
460     Py_XINCREF(p3imp_PyExc_IndexError);
461     Py_XINCREF(p3imp_PyExc_KeyboardInterrupt);
462     Py_XINCREF(p3imp_PyExc_TypeError);
463     Py_XINCREF(p3imp_PyExc_ValueError);
464     Py_XDECREF(exmod);
465 }
466 #endif /* DYNAMIC_PYTHON3 */
467 
468 static PyObject *BufferNew (buf_T *);
469 static PyObject *WindowNew(win_T *);
470 static PyObject *LineToString(const char *);
471 
472 static PyTypeObject RangeType;
473 
474 /*
475  * Include the code shared with if_python.c
476  */
477 #include "if_py_both.h"
478 
479     static void
480 call_PyObject_Free(void *p)
481 {
482 #ifdef Py_DEBUG
483     _PyObject_DebugFree(p);
484 #else
485     PyObject_Free(p);
486 #endif
487 }
488 
489     static PyObject *
490 call_PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
491 {
492     return PyType_GenericNew(type,args,kwds);
493 }
494 
495     static PyObject *
496 call_PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
497 {
498     return PyType_GenericAlloc(type,nitems);
499 }
500 
501 /******************************************************
502  * Internal function prototypes.
503  */
504 
505 static Py_ssize_t RangeStart;
506 static Py_ssize_t RangeEnd;
507 
508 static int PythonIO_Init(void);
509 static void PythonIO_Fini(void);
510 PyMODINIT_FUNC Py3Init_vim(void);
511 
512 /******************************************************
513  * 1. Python interpreter main program.
514  */
515 
516 static int py3initialised = 0;
517 
518 static PyGILState_STATE pygilstate = PyGILState_UNLOCKED;
519 
520     void
521 python3_end()
522 {
523     static int recurse = 0;
524 
525     /* If a crash occurs while doing this, don't try again. */
526     if (recurse != 0)
527 	return;
528 
529     ++recurse;
530 
531 #ifdef DYNAMIC_PYTHON3
532     if (hinstPy3)
533 #endif
534     if (Py_IsInitialized())
535     {
536 	// acquire lock before finalizing
537 	pygilstate = PyGILState_Ensure();
538 
539 	PythonIO_Fini();
540 	Py_Finalize();
541     }
542 
543 #ifdef DYNAMIC_PYTHON3
544     end_dynamic_python3();
545 #endif
546 
547     --recurse;
548 }
549 
550 #if (defined(DYNAMIC_PYTHON) && defined(FEAT_PYTHON)) || defined(PROTO)
551     int
552 python3_loaded()
553 {
554     return (hinstPy3 != 0);
555 }
556 #endif
557 
558     static int
559 Python3_Init(void)
560 {
561     if (!py3initialised)
562     {
563 #ifdef DYNAMIC_PYTHON3
564 	if (!python3_enabled(TRUE))
565 	{
566 	    EMSG(_("E263: Sorry, this command is disabled, the Python library could not be loaded."));
567 	    goto fail;
568 	}
569 #endif
570 
571 	init_structs();
572 
573 
574 #ifdef PYTHON3_HOME
575 	Py_SetPythonHome(PYTHON3_HOME);
576 #endif
577 
578 #if !defined(MACOS) || defined(MACOS_X_UNIX)
579 	Py_Initialize();
580 #else
581 	PyMac_Initialize();
582 #endif
583 	/* initialise threads, must be after Py_Initialize() */
584 	PyEval_InitThreads();
585 
586 #ifdef DYNAMIC_PYTHON3
587 	get_py3_exceptions();
588 #endif
589 
590 	if (PythonIO_Init())
591 	    goto fail;
592 
593 	PyImport_AppendInittab("vim", Py3Init_vim);
594 
595 	/* Remove the element from sys.path that was added because of our
596 	 * argv[0] value in Py3Init_vim().  Previously we used an empty
597 	 * string, but dependinding on the OS we then get an empty entry or
598 	 * the current directory in sys.path.
599 	 * Only after vim has been imported, the element does exist in
600 	 * sys.path.
601 	 */
602 	PyRun_SimpleString("import vim; import sys; sys.path = list(filter(lambda x: not x.endswith('must>not&exist'), sys.path))");
603 
604 	// lock is created and acquired in PyEval_InitThreads() and thread
605 	// state is created in Py_Initialize()
606 	// there _PyGILState_NoteThreadState() also sets gilcounter to 1
607 	// (python must have threads enabled!)
608 	// so the following does both: unlock GIL and save thread state in TLS
609 	// without deleting thread state
610 	PyGILState_Release(pygilstate);
611 
612 	py3initialised = 1;
613     }
614 
615     return 0;
616 
617 fail:
618     /* We call PythonIO_Flush() here to print any Python errors.
619      * This is OK, as it is possible to call this function even
620      * if PythonIO_Init() has not completed successfully (it will
621      * not do anything in this case).
622      */
623     PythonIO_Flush();
624     return -1;
625 }
626 
627 /*
628  * External interface
629  */
630     static void
631 DoPy3Command(exarg_T *eap, const char *cmd)
632 {
633 #if defined(MACOS) && !defined(MACOS_X_UNIX)
634     GrafPtr		oldPort;
635 #endif
636 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
637     char		*saved_locale;
638 #endif
639     PyObject		*cmdstr;
640     PyObject		*cmdbytes;
641 
642 #if defined(MACOS) && !defined(MACOS_X_UNIX)
643     GetPort(&oldPort);
644     /* Check if the Python library is available */
645     if ((Ptr)PyMac_Initialize == (Ptr)kUnresolvedCFragSymbolAddress)
646 	goto theend;
647 #endif
648     if (Python3_Init())
649 	goto theend;
650 
651     RangeStart = eap->line1;
652     RangeEnd = eap->line2;
653     Python_Release_Vim();	    /* leave vim */
654 
655 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
656     /* Python only works properly when the LC_NUMERIC locale is "C". */
657     saved_locale = setlocale(LC_NUMERIC, NULL);
658     if (saved_locale == NULL || STRCMP(saved_locale, "C") == 0)
659 	saved_locale = NULL;
660     else
661     {
662 	/* Need to make a copy, value may change when setting new locale. */
663 	saved_locale = (char *)vim_strsave((char_u *)saved_locale);
664 	(void)setlocale(LC_NUMERIC, "C");
665     }
666 #endif
667 
668     pygilstate = PyGILState_Ensure();
669 
670     /* PyRun_SimpleString expects a UTF-8 string. Wrong encoding may cause
671      * SyntaxError (unicode error). */
672     cmdstr = PyUnicode_Decode(cmd, strlen(cmd),
673 					(char *)ENC_OPT, CODEC_ERROR_HANDLER);
674     cmdbytes = PyUnicode_AsEncodedString(cmdstr, "utf-8", CODEC_ERROR_HANDLER);
675     Py_XDECREF(cmdstr);
676     PyRun_SimpleString(PyBytes_AsString(cmdbytes));
677     Py_XDECREF(cmdbytes);
678 
679     PyGILState_Release(pygilstate);
680 
681 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
682     if (saved_locale != NULL)
683     {
684 	(void)setlocale(LC_NUMERIC, saved_locale);
685 	vim_free(saved_locale);
686     }
687 #endif
688 
689     Python_Lock_Vim();		    /* enter vim */
690     PythonIO_Flush();
691 #if defined(MACOS) && !defined(MACOS_X_UNIX)
692     SetPort(oldPort);
693 #endif
694 
695 theend:
696     return;	    /* keeps lint happy */
697 }
698 
699 /*
700  * ":py3"
701  */
702     void
703 ex_py3(exarg_T *eap)
704 {
705     char_u *script;
706 
707     script = script_get(eap, eap->arg);
708     if (!eap->skip)
709     {
710 	if (script == NULL)
711 	    DoPy3Command(eap, (char *)eap->arg);
712 	else
713 	    DoPy3Command(eap, (char *)script);
714     }
715     vim_free(script);
716 }
717 
718 #define BUFFER_SIZE 2048
719 
720 /*
721  * ":py3file"
722  */
723     void
724 ex_py3file(exarg_T *eap)
725 {
726     static char buffer[BUFFER_SIZE];
727     const char *file;
728     char *p;
729     int i;
730 
731     /* Have to do it like this. PyRun_SimpleFile requires you to pass a
732      * stdio file pointer, but Vim and the Python DLL are compiled with
733      * different options under Windows, meaning that stdio pointers aren't
734      * compatible between the two. Yuk.
735      *
736      * construct: exec(compile(open('a_filename', 'rb').read(), 'a_filename', 'exec'))
737      *
738      * Using bytes so that Python can detect the source encoding as it normally
739      * does. The doc does not say "compile" accept bytes, though.
740      *
741      * We need to escape any backslashes or single quotes in the file name, so that
742      * Python won't mangle the file name.
743      */
744 
745     strcpy(buffer, "exec(compile(open('");
746     p = buffer + 19; /* size of "exec(compile(open('" */
747 
748     for (i=0; i<2; ++i)
749     {
750 	file = (char *)eap->arg;
751 	while (*file && p < buffer + (BUFFER_SIZE - 3))
752 	{
753 	    if (*file == '\\' || *file == '\'')
754 		*p++ = '\\';
755 	    *p++ = *file++;
756 	}
757 	/* If we didn't finish the file name, we hit a buffer overflow */
758 	if (*file != '\0')
759 	    return;
760 	if (i==0)
761 	{
762 	    strcpy(p,"','rb').read(),'");
763 	    p += 16;
764 	}
765 	else
766 	{
767 	    strcpy(p,"','exec'))");
768 	    p += 10;
769 	}
770     }
771 
772 
773     /* Execute the file */
774     DoPy3Command(eap, buffer);
775 }
776 
777 /******************************************************
778  * 2. Python output stream: writes output via [e]msg().
779  */
780 
781 /* Implementation functions
782  */
783 
784     static PyObject *
785 OutputGetattro(PyObject *self, PyObject *nameobj)
786 {
787     char *name = "";
788     if (PyUnicode_Check(nameobj))
789 	name = _PyUnicode_AsString(nameobj);
790 
791     if (strcmp(name, "softspace") == 0)
792 	return PyLong_FromLong(((OutputObject *)(self))->softspace);
793 
794     return PyObject_GenericGetAttr(self, nameobj);
795 }
796 
797     static int
798 OutputSetattro(PyObject *self, PyObject *nameobj, PyObject *val)
799 {
800     char *name = "";
801     if (PyUnicode_Check(nameobj))
802 	name = _PyUnicode_AsString(nameobj);
803 
804     if (val == NULL) {
805 	PyErr_SetString(PyExc_AttributeError, _("can't delete OutputObject attributes"));
806 	return -1;
807     }
808 
809     if (strcmp(name, "softspace") == 0)
810     {
811 	if (!PyLong_Check(val)) {
812 	    PyErr_SetString(PyExc_TypeError, _("softspace must be an integer"));
813 	    return -1;
814 	}
815 
816 	((OutputObject *)(self))->softspace = PyLong_AsLong(val);
817 	return 0;
818     }
819 
820     PyErr_SetString(PyExc_AttributeError, _("invalid attribute"));
821     return -1;
822 }
823 
824 /***************/
825 
826     static int
827 PythonIO_Init(void)
828 {
829     PyType_Ready(&OutputType);
830     return PythonIO_Init_io();
831 }
832 
833     static void
834 PythonIO_Fini(void)
835 {
836     PySys_SetObject("stdout", NULL);
837     PySys_SetObject("stderr", NULL);
838 }
839 
840 /******************************************************
841  * 3. Implementation of the Vim module for Python
842  */
843 
844 /* Window type - Implementation functions
845  * --------------------------------------
846  */
847 
848 #define WindowType_Check(obj) ((obj)->ob_base.ob_type == &WindowType)
849 
850 /* Buffer type - Implementation functions
851  * --------------------------------------
852  */
853 
854 #define BufferType_Check(obj) ((obj)->ob_base.ob_type == &BufferType)
855 
856 static Py_ssize_t BufferLength(PyObject *);
857 static PyObject *BufferItem(PyObject *, Py_ssize_t);
858 static PyObject* BufferSubscript(PyObject *self, PyObject *idx);
859 static Py_ssize_t BufferAsSubscript(PyObject *self, PyObject *idx, PyObject *val);
860 
861 
862 /* Line range type - Implementation functions
863  * --------------------------------------
864  */
865 
866 #define RangeType_Check(obj) ((obj)->ob_base.ob_type == &RangeType)
867 
868 static PyObject* RangeSubscript(PyObject *self, PyObject *idx);
869 static Py_ssize_t RangeAsItem(PyObject *, Py_ssize_t, PyObject *);
870 static Py_ssize_t RangeAsSubscript(PyObject *self, PyObject *idx, PyObject *val);
871 
872 /* Current objects type - Implementation functions
873  * -----------------------------------------------
874  */
875 
876 static PySequenceMethods BufferAsSeq = {
877     (lenfunc)		BufferLength,	    /* sq_length,    len(x)   */
878     (binaryfunc)	0,		    /* sq_concat,    x+y      */
879     (ssizeargfunc)	0,		    /* sq_repeat,    x*n      */
880     (ssizeargfunc)	BufferItem,	    /* sq_item,      x[i]     */
881     0,					    /* was_sq_slice,	 x[i:j]   */
882     0,					    /* sq_ass_item,  x[i]=v   */
883     0,					    /* sq_ass_slice, x[i:j]=v */
884     0,					    /* sq_contains */
885     0,					    /* sq_inplace_concat */
886     0,					    /* sq_inplace_repeat */
887 };
888 
889 PyMappingMethods BufferAsMapping = {
890     /* mp_length	*/ (lenfunc)BufferLength,
891     /* mp_subscript     */ (binaryfunc)BufferSubscript,
892     /* mp_ass_subscript */ (objobjargproc)BufferAsSubscript,
893 };
894 
895 
896 /* Buffer object - Definitions
897  */
898 
899 static PyTypeObject BufferType;
900 
901     static PyObject *
902 BufferNew(buf_T *buf)
903 {
904     /* We need to handle deletion of buffers underneath us.
905      * If we add a "b_python3_ref" field to the buf_T structure,
906      * then we can get at it in buf_freeall() in vim. We then
907      * need to create only ONE Python object per buffer - if
908      * we try to create a second, just INCREF the existing one
909      * and return it. The (single) Python object referring to
910      * the buffer is stored in "b_python3_ref".
911      * Question: what to do on a buf_freeall(). We'll probably
912      * have to either delete the Python object (DECREF it to
913      * zero - a bad idea, as it leaves dangling refs!) or
914      * set the buf_T * value to an invalid value (-1?), which
915      * means we need checks in all access functions... Bah.
916      */
917 
918     BufferObject *self;
919 
920     if (buf->b_python3_ref != NULL)
921     {
922 	self = buf->b_python3_ref;
923 	Py_INCREF(self);
924     }
925     else
926     {
927 	self = PyObject_NEW(BufferObject, &BufferType);
928 	buf->b_python3_ref = self;
929 	if (self == NULL)
930 	    return NULL;
931 	self->buf = buf;
932     }
933 
934     return (PyObject *)(self);
935 }
936 
937     static void
938 BufferDestructor(PyObject *self)
939 {
940     BufferObject *this = (BufferObject *)(self);
941 
942     if (this->buf && this->buf != INVALID_BUFFER_VALUE)
943 	this->buf->b_python3_ref = NULL;
944 
945     Py_TYPE(self)->tp_free((PyObject*)self);
946 }
947 
948     static PyObject *
949 BufferGetattro(PyObject *self, PyObject*nameobj)
950 {
951     BufferObject *this = (BufferObject *)(self);
952 
953     char *name = "";
954     if (PyUnicode_Check(nameobj))
955 	name = _PyUnicode_AsString(nameobj);
956 
957     if (CheckBuffer(this))
958 	return NULL;
959 
960     if (strcmp(name, "name") == 0)
961 	return Py_BuildValue("s", this->buf->b_ffname);
962     else if (strcmp(name, "number") == 0)
963 	return Py_BuildValue("n", this->buf->b_fnum);
964     else if (strcmp(name,"__members__") == 0)
965 	return Py_BuildValue("[ss]", "name", "number");
966     else
967 	return PyObject_GenericGetAttr(self, nameobj);
968 }
969 
970     static PyObject *
971 BufferRepr(PyObject *self)
972 {
973     static char repr[100];
974     BufferObject *this = (BufferObject *)(self);
975 
976     if (this->buf == INVALID_BUFFER_VALUE)
977     {
978 	vim_snprintf(repr, 100, _("<buffer object (deleted) at %p>"), (self));
979 	return PyUnicode_FromString(repr);
980     }
981     else
982     {
983 	char *name = (char *)this->buf->b_fname;
984 	Py_ssize_t len;
985 
986 	if (name == NULL)
987 	    name = "";
988 	len = strlen(name);
989 
990 	if (len > 35)
991 	    name = name + (35 - len);
992 
993 	vim_snprintf(repr, 100, "<buffer %s%s>", len > 35 ? "..." : "", name);
994 
995 	return PyUnicode_FromString(repr);
996     }
997 }
998 
999 /******************/
1000 
1001     static Py_ssize_t
1002 BufferLength(PyObject *self)
1003 {
1004     if (CheckBuffer((BufferObject *)(self)))
1005 	return -1;
1006 
1007     return (Py_ssize_t)(((BufferObject *)(self))->buf->b_ml.ml_line_count);
1008 }
1009 
1010     static PyObject *
1011 BufferItem(PyObject *self, Py_ssize_t n)
1012 {
1013     return RBItem((BufferObject *)(self), n, 1,
1014 	       (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count);
1015 }
1016 
1017     static PyObject *
1018 BufferSlice(PyObject *self, Py_ssize_t lo, Py_ssize_t hi)
1019 {
1020     return RBSlice((BufferObject *)(self), lo, hi, 1,
1021 	       (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count);
1022 }
1023 
1024     static PyObject *
1025 BufferSubscript(PyObject *self, PyObject* idx)
1026 {
1027     if (PyLong_Check(idx)) {
1028 	long _idx = PyLong_AsLong(idx);
1029 	return BufferItem(self,_idx);
1030     } else if (PySlice_Check(idx)) {
1031 	Py_ssize_t start, stop, step, slicelen;
1032 
1033 	if (PySlice_GetIndicesEx((PyObject *)idx,
1034 	      (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1,
1035 	      &start, &stop,
1036 	      &step, &slicelen) < 0) {
1037 	    return NULL;
1038 	}
1039 	return BufferSlice(self, start, stop);
1040     } else {
1041 	PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
1042 	return NULL;
1043     }
1044 }
1045 
1046     static Py_ssize_t
1047 BufferAsSubscript(PyObject *self, PyObject* idx, PyObject* val)
1048 {
1049     if (PyLong_Check(idx)) {
1050 	long n = PyLong_AsLong(idx);
1051 	return RBAsItem((BufferObject *)(self), n, val, 1,
1052 		    (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1053 		    NULL);
1054     } else if (PySlice_Check(idx)) {
1055 	Py_ssize_t start, stop, step, slicelen;
1056 
1057 	if (PySlice_GetIndicesEx((PyObject *)idx,
1058 	      (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1,
1059 	      &start, &stop,
1060 	      &step, &slicelen) < 0) {
1061 	    return -1;
1062 	}
1063 	return RBAsSlice((BufferObject *)(self), start, stop, val, 1,
1064 			  (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1065 			  NULL);
1066     } else {
1067 	PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
1068 	return -1;
1069     }
1070 }
1071 
1072 static PySequenceMethods RangeAsSeq = {
1073     (lenfunc)		RangeLength,	 /* sq_length,	  len(x)   */
1074     (binaryfunc)	0,		 /* RangeConcat, sq_concat,  x+y   */
1075     (ssizeargfunc)	0,		 /* RangeRepeat, sq_repeat,  x*n   */
1076     (ssizeargfunc)	RangeItem,	 /* sq_item,	  x[i]	   */
1077     0,					 /* was_sq_slice,     x[i:j]   */
1078     (ssizeobjargproc)	RangeAsItem,	 /* sq_as_item,  x[i]=v   */
1079     0,					 /* sq_ass_slice, x[i:j]=v */
1080     0,					 /* sq_contains */
1081     0,					 /* sq_inplace_concat */
1082     0,					 /* sq_inplace_repeat */
1083 };
1084 
1085 PyMappingMethods RangeAsMapping = {
1086     /* mp_length	*/ (lenfunc)RangeLength,
1087     /* mp_subscript     */ (binaryfunc)RangeSubscript,
1088     /* mp_ass_subscript */ (objobjargproc)RangeAsSubscript,
1089 };
1090 
1091 /* Line range object - Implementation
1092  */
1093 
1094     static void
1095 RangeDestructor(PyObject *self)
1096 {
1097     Py_DECREF(((RangeObject *)(self))->buf);
1098     Py_TYPE(self)->tp_free((PyObject*)self);
1099 }
1100 
1101     static PyObject *
1102 RangeGetattro(PyObject *self, PyObject *nameobj)
1103 {
1104     char *name = "";
1105     if (PyUnicode_Check(nameobj))
1106 	name = _PyUnicode_AsString(nameobj);
1107 
1108     if (strcmp(name, "start") == 0)
1109 	return Py_BuildValue("n", ((RangeObject *)(self))->start - 1);
1110     else if (strcmp(name, "end") == 0)
1111 	return Py_BuildValue("n", ((RangeObject *)(self))->end - 1);
1112     else
1113 	return PyObject_GenericGetAttr(self, nameobj);
1114 }
1115 
1116 /****************/
1117 
1118     static Py_ssize_t
1119 RangeAsItem(PyObject *self, Py_ssize_t n, PyObject *val)
1120 {
1121     return RBAsItem(((RangeObject *)(self))->buf, n, val,
1122 		    ((RangeObject *)(self))->start,
1123 		    ((RangeObject *)(self))->end,
1124 		    &((RangeObject *)(self))->end);
1125 }
1126 
1127     static Py_ssize_t
1128 RangeAsSlice(PyObject *self, Py_ssize_t lo, Py_ssize_t hi, PyObject *val)
1129 {
1130     return RBAsSlice(((RangeObject *)(self))->buf, lo, hi, val,
1131 		    ((RangeObject *)(self))->start,
1132 		    ((RangeObject *)(self))->end,
1133 		    &((RangeObject *)(self))->end);
1134 }
1135 
1136     static PyObject *
1137 RangeSubscript(PyObject *self, PyObject* idx)
1138 {
1139     if (PyLong_Check(idx)) {
1140 	long _idx = PyLong_AsLong(idx);
1141 	return RangeItem(self,_idx);
1142     } else if (PySlice_Check(idx)) {
1143 	Py_ssize_t start, stop, step, slicelen;
1144 
1145 	if (PySlice_GetIndicesEx((PyObject *)idx,
1146 		((RangeObject *)(self))->end-((RangeObject *)(self))->start+1,
1147 		&start, &stop,
1148 		&step, &slicelen) < 0) {
1149 	    return NULL;
1150 	}
1151 	return RangeSlice(self, start, stop);
1152     } else {
1153 	PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
1154 	return NULL;
1155     }
1156 }
1157 
1158     static Py_ssize_t
1159 RangeAsSubscript(PyObject *self, PyObject *idx, PyObject *val)
1160 {
1161     if (PyLong_Check(idx)) {
1162 	long n = PyLong_AsLong(idx);
1163 	return RangeAsItem(self, n, val);
1164     } else if (PySlice_Check(idx)) {
1165 	Py_ssize_t start, stop, step, slicelen;
1166 
1167 	if (PySlice_GetIndicesEx((PyObject *)idx,
1168 		((RangeObject *)(self))->end-((RangeObject *)(self))->start+1,
1169 		&start, &stop,
1170 		&step, &slicelen) < 0) {
1171 	    return -1;
1172 	}
1173 	return RangeAsSlice(self, start, stop, val);
1174     } else {
1175 	PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
1176 	return -1;
1177     }
1178 }
1179 
1180 
1181 /* Buffer list object - Definitions
1182  */
1183 
1184 typedef struct
1185 {
1186     PyObject_HEAD
1187 } BufListObject;
1188 
1189 static PySequenceMethods BufListAsSeq = {
1190     (lenfunc)		BufListLength,	    /* sq_length,    len(x)   */
1191     (binaryfunc)	0,		    /* sq_concat,    x+y      */
1192     (ssizeargfunc)	0,		    /* sq_repeat,    x*n      */
1193     (ssizeargfunc)	BufListItem,	    /* sq_item,      x[i]     */
1194     0,					    /* was_sq_slice,	 x[i:j]   */
1195     (ssizeobjargproc)	0,		    /* sq_as_item,  x[i]=v   */
1196     0,					    /* sq_ass_slice, x[i:j]=v */
1197     0,					    /* sq_contains */
1198     0,					    /* sq_inplace_concat */
1199     0,					    /* sq_inplace_repeat */
1200 };
1201 
1202 static PyTypeObject BufListType;
1203 
1204 /* Window object - Definitions
1205  */
1206 
1207 static struct PyMethodDef WindowMethods[] = {
1208     /* name,	    function,		calling,    documentation */
1209     { NULL,	    NULL,		0,	    NULL }
1210 };
1211 
1212 static PyTypeObject WindowType;
1213 
1214 /* Window object - Implementation
1215  */
1216 
1217     static PyObject *
1218 WindowNew(win_T *win)
1219 {
1220     /* We need to handle deletion of windows underneath us.
1221      * If we add a "w_python3_ref" field to the win_T structure,
1222      * then we can get at it in win_free() in vim. We then
1223      * need to create only ONE Python object per window - if
1224      * we try to create a second, just INCREF the existing one
1225      * and return it. The (single) Python object referring to
1226      * the window is stored in "w_python3_ref".
1227      * On a win_free() we set the Python object's win_T* field
1228      * to an invalid value. We trap all uses of a window
1229      * object, and reject them if the win_T* field is invalid.
1230      */
1231 
1232     WindowObject *self;
1233 
1234     if (win->w_python3_ref)
1235     {
1236 	self = win->w_python3_ref;
1237 	Py_INCREF(self);
1238     }
1239     else
1240     {
1241 	self = PyObject_NEW(WindowObject, &WindowType);
1242 	if (self == NULL)
1243 	    return NULL;
1244 	self->win = win;
1245 	win->w_python3_ref = self;
1246     }
1247 
1248     return (PyObject *)(self);
1249 }
1250 
1251     static void
1252 WindowDestructor(PyObject *self)
1253 {
1254     WindowObject *this = (WindowObject *)(self);
1255 
1256     if (this->win && this->win != INVALID_WINDOW_VALUE)
1257 	this->win->w_python3_ref = NULL;
1258 
1259     Py_TYPE(self)->tp_free((PyObject*)self);
1260 }
1261 
1262     static PyObject *
1263 WindowGetattro(PyObject *self, PyObject *nameobj)
1264 {
1265     WindowObject *this = (WindowObject *)(self);
1266 
1267     char *name = "";
1268     if (PyUnicode_Check(nameobj))
1269 	name = _PyUnicode_AsString(nameobj);
1270 
1271 
1272     if (CheckWindow(this))
1273 	return NULL;
1274 
1275     if (strcmp(name, "buffer") == 0)
1276 	return (PyObject *)BufferNew(this->win->w_buffer);
1277     else if (strcmp(name, "cursor") == 0)
1278     {
1279 	pos_T *pos = &this->win->w_cursor;
1280 
1281 	return Py_BuildValue("(ll)", (long)(pos->lnum), (long)(pos->col));
1282     }
1283     else if (strcmp(name, "height") == 0)
1284 	return Py_BuildValue("l", (long)(this->win->w_height));
1285 #ifdef FEAT_VERTSPLIT
1286     else if (strcmp(name, "width") == 0)
1287 	return Py_BuildValue("l", (long)(W_WIDTH(this->win)));
1288 #endif
1289     else if (strcmp(name,"__members__") == 0)
1290 	return Py_BuildValue("[sss]", "buffer", "cursor", "height");
1291     else
1292 	return PyObject_GenericGetAttr(self, nameobj);
1293 }
1294 
1295     static int
1296 WindowSetattro(PyObject *self, PyObject *nameobj, PyObject *val)
1297 {
1298     char *name = "";
1299 
1300     if (PyUnicode_Check(nameobj))
1301 	name = _PyUnicode_AsString(nameobj);
1302 
1303     return WindowSetattr(self, name, val);
1304 }
1305 
1306 /* Window list object - Definitions
1307  */
1308 
1309 typedef struct
1310 {
1311     PyObject_HEAD
1312 }
1313 WinListObject;
1314 
1315 static PySequenceMethods WinListAsSeq = {
1316     (lenfunc)	     WinListLength,	    /* sq_length,    len(x)   */
1317     (binaryfunc)     0,			    /* sq_concat,    x+y      */
1318     (ssizeargfunc)   0,			    /* sq_repeat,    x*n      */
1319     (ssizeargfunc)   WinListItem,	    /* sq_item,      x[i]     */
1320     0,					    /* sq_slice,     x[i:j]   */
1321     (ssizeobjargproc)0,			    /* sq_as_item,  x[i]=v   */
1322     0,					    /* sq_ass_slice, x[i:j]=v */
1323     0,					    /* sq_contains */
1324     0,					    /* sq_inplace_concat */
1325     0,					    /* sq_inplace_repeat */
1326 };
1327 
1328 static PyTypeObject WinListType;
1329 
1330 /* Current items object - Definitions
1331  */
1332 
1333 typedef struct
1334 {
1335     PyObject_HEAD
1336 } CurrentObject;
1337 
1338 static PyTypeObject CurrentType;
1339 
1340 /* Current items object - Implementation
1341  */
1342     static PyObject *
1343 CurrentGetattro(PyObject *self UNUSED, PyObject *nameobj)
1344 {
1345     char *name = "";
1346     if (PyUnicode_Check(nameobj))
1347 	name = _PyUnicode_AsString(nameobj);
1348 
1349     if (strcmp(name, "buffer") == 0)
1350 	return (PyObject *)BufferNew(curbuf);
1351     else if (strcmp(name, "window") == 0)
1352 	return (PyObject *)WindowNew(curwin);
1353     else if (strcmp(name, "line") == 0)
1354 	return GetBufferLine(curbuf, (Py_ssize_t)curwin->w_cursor.lnum);
1355     else if (strcmp(name, "range") == 0)
1356 	return RangeNew(curbuf, RangeStart, RangeEnd);
1357     else if (strcmp(name,"__members__") == 0)
1358 	return Py_BuildValue("[ssss]", "buffer", "window", "line", "range");
1359     else
1360     {
1361 	PyErr_SetString(PyExc_AttributeError, name);
1362 	return NULL;
1363     }
1364 }
1365 
1366     static int
1367 CurrentSetattro(PyObject *self UNUSED, PyObject *nameobj, PyObject *value)
1368 {
1369     char *name = "";
1370     if (PyUnicode_Check(nameobj))
1371 	name = _PyUnicode_AsString(nameobj);
1372 
1373     if (strcmp(name, "line") == 0)
1374     {
1375 	if (SetBufferLine(curbuf, (Py_ssize_t)curwin->w_cursor.lnum, value, NULL) == FAIL)
1376 	    return -1;
1377 
1378 	return 0;
1379     }
1380     else
1381     {
1382 	PyErr_SetString(PyExc_AttributeError, name);
1383 	return -1;
1384     }
1385 }
1386 
1387 /* External interface
1388  */
1389 
1390     void
1391 python3_buffer_free(buf_T *buf)
1392 {
1393     if (buf->b_python3_ref != NULL)
1394     {
1395 	BufferObject *bp = buf->b_python3_ref;
1396 	bp->buf = INVALID_BUFFER_VALUE;
1397 	buf->b_python3_ref = NULL;
1398     }
1399 }
1400 
1401 #if defined(FEAT_WINDOWS) || defined(PROTO)
1402     void
1403 python3_window_free(win_T *win)
1404 {
1405     if (win->w_python3_ref != NULL)
1406     {
1407 	WindowObject *wp = win->w_python3_ref;
1408 	wp->win = INVALID_WINDOW_VALUE;
1409 	win->w_python3_ref = NULL;
1410     }
1411 }
1412 #endif
1413 
1414 static BufListObject TheBufferList =
1415 {
1416     PyObject_HEAD_INIT(&BufListType)
1417 };
1418 
1419 static WinListObject TheWindowList =
1420 {
1421     PyObject_HEAD_INIT(&WinListType)
1422 };
1423 
1424 static CurrentObject TheCurrent =
1425 {
1426     PyObject_HEAD_INIT(&CurrentType)
1427 };
1428 
1429 PyDoc_STRVAR(vim_module_doc,"vim python interface\n");
1430 
1431 static struct PyModuleDef vimmodule;
1432 
1433 #ifndef PROTO
1434 PyMODINIT_FUNC Py3Init_vim(void)
1435 {
1436     PyObject *mod;
1437     /* The special value is removed from sys.path in Python3_Init(). */
1438     static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL};
1439 
1440     PyType_Ready(&BufferType);
1441     PyType_Ready(&RangeType);
1442     PyType_Ready(&WindowType);
1443     PyType_Ready(&BufListType);
1444     PyType_Ready(&WinListType);
1445     PyType_Ready(&CurrentType);
1446 
1447     /* Set sys.argv[] to avoid a crash in warn(). */
1448     PySys_SetArgv(1, argv);
1449 
1450     mod = PyModule_Create(&vimmodule);
1451     if (mod == NULL)
1452 	return NULL;
1453 
1454     VimError = PyErr_NewException("vim.error", NULL, NULL);
1455     Py_INCREF(VimError);
1456 
1457     PyModule_AddObject(mod, "error", VimError);
1458     Py_INCREF((PyObject *)(void *)&TheBufferList);
1459     PyModule_AddObject(mod, "buffers", (PyObject *)(void *)&TheBufferList);
1460     Py_INCREF((PyObject *)(void *)&TheCurrent);
1461     PyModule_AddObject(mod, "current", (PyObject *)(void *)&TheCurrent);
1462     Py_INCREF((PyObject *)(void *)&TheWindowList);
1463     PyModule_AddObject(mod, "windows", (PyObject *)(void *)&TheWindowList);
1464 
1465     if (PyErr_Occurred())
1466 	return NULL;
1467 
1468     return mod;
1469 }
1470 #endif
1471 
1472 /*************************************************************************
1473  * 4. Utility functions for handling the interface between Vim and Python.
1474  */
1475 
1476 /* Convert a Vim line into a Python string.
1477  * All internal newlines are replaced by null characters.
1478  *
1479  * On errors, the Python exception data is set, and NULL is returned.
1480  */
1481     static PyObject *
1482 LineToString(const char *str)
1483 {
1484     PyObject *result;
1485     Py_ssize_t len = strlen(str);
1486     char *tmp,*p;
1487 
1488     tmp = (char *)alloc((unsigned)(len+1));
1489     p = tmp;
1490     if (p == NULL)
1491     {
1492 	PyErr_NoMemory();
1493 	return NULL;
1494     }
1495 
1496     while (*str)
1497     {
1498 	if (*str == '\n')
1499 	    *p = '\0';
1500 	else
1501 	    *p = *str;
1502 
1503 	++p;
1504 	++str;
1505     }
1506     *p = '\0';
1507 
1508     result = PyUnicode_Decode(tmp, len, (char *)ENC_OPT, CODEC_ERROR_HANDLER);
1509 
1510     vim_free(tmp);
1511     return result;
1512 }
1513 
1514     static void
1515 init_structs(void)
1516 {
1517     vim_memset(&OutputType, 0, sizeof(OutputType));
1518     OutputType.tp_name = "vim.message";
1519     OutputType.tp_basicsize = sizeof(OutputObject);
1520     OutputType.tp_getattro = OutputGetattro;
1521     OutputType.tp_setattro = OutputSetattro;
1522     OutputType.tp_flags = Py_TPFLAGS_DEFAULT;
1523     OutputType.tp_doc = "vim message object";
1524     OutputType.tp_methods = OutputMethods;
1525     OutputType.tp_alloc = call_PyType_GenericAlloc;
1526     OutputType.tp_new = call_PyType_GenericNew;
1527     OutputType.tp_free = call_PyObject_Free;
1528 
1529     vim_memset(&BufferType, 0, sizeof(BufferType));
1530     BufferType.tp_name = "vim.buffer";
1531     BufferType.tp_basicsize = sizeof(BufferType);
1532     BufferType.tp_dealloc = BufferDestructor;
1533     BufferType.tp_repr = BufferRepr;
1534     BufferType.tp_as_sequence = &BufferAsSeq;
1535     BufferType.tp_as_mapping = &BufferAsMapping;
1536     BufferType.tp_getattro = BufferGetattro;
1537     BufferType.tp_flags = Py_TPFLAGS_DEFAULT;
1538     BufferType.tp_doc = "vim buffer object";
1539     BufferType.tp_methods = BufferMethods;
1540     BufferType.tp_alloc = call_PyType_GenericAlloc;
1541     BufferType.tp_new = call_PyType_GenericNew;
1542     BufferType.tp_free = call_PyObject_Free;
1543 
1544     vim_memset(&WindowType, 0, sizeof(WindowType));
1545     WindowType.tp_name = "vim.window";
1546     WindowType.tp_basicsize = sizeof(WindowObject);
1547     WindowType.tp_dealloc = WindowDestructor;
1548     WindowType.tp_repr = WindowRepr;
1549     WindowType.tp_getattro = WindowGetattro;
1550     WindowType.tp_setattro = WindowSetattro;
1551     WindowType.tp_flags = Py_TPFLAGS_DEFAULT;
1552     WindowType.tp_doc = "vim Window object";
1553     WindowType.tp_methods = WindowMethods;
1554     WindowType.tp_alloc = call_PyType_GenericAlloc;
1555     WindowType.tp_new = call_PyType_GenericNew;
1556     WindowType.tp_free = call_PyObject_Free;
1557 
1558     vim_memset(&BufListType, 0, sizeof(BufListType));
1559     BufListType.tp_name = "vim.bufferlist";
1560     BufListType.tp_basicsize = sizeof(BufListObject);
1561     BufListType.tp_as_sequence = &BufListAsSeq;
1562     BufListType.tp_flags = Py_TPFLAGS_DEFAULT;
1563     BufferType.tp_doc = "vim buffer list";
1564 
1565     vim_memset(&WinListType, 0, sizeof(WinListType));
1566     WinListType.tp_name = "vim.windowlist";
1567     WinListType.tp_basicsize = sizeof(WinListType);
1568     WinListType.tp_as_sequence = &WinListAsSeq;
1569     WinListType.tp_flags = Py_TPFLAGS_DEFAULT;
1570     WinListType.tp_doc = "vim window list";
1571 
1572     vim_memset(&RangeType, 0, sizeof(RangeType));
1573     RangeType.tp_name = "vim.range";
1574     RangeType.tp_basicsize = sizeof(RangeObject);
1575     RangeType.tp_dealloc = RangeDestructor;
1576     RangeType.tp_repr = RangeRepr;
1577     RangeType.tp_as_sequence = &RangeAsSeq;
1578     RangeType.tp_as_mapping = &RangeAsMapping;
1579     RangeType.tp_getattro = RangeGetattro;
1580     RangeType.tp_flags = Py_TPFLAGS_DEFAULT;
1581     RangeType.tp_doc = "vim Range object";
1582     RangeType.tp_methods = RangeMethods;
1583     RangeType.tp_alloc = call_PyType_GenericAlloc;
1584     RangeType.tp_new = call_PyType_GenericNew;
1585     RangeType.tp_free = call_PyObject_Free;
1586 
1587     vim_memset(&CurrentType, 0, sizeof(CurrentType));
1588     CurrentType.tp_name = "vim.currentdata";
1589     CurrentType.tp_basicsize = sizeof(CurrentObject);
1590     CurrentType.tp_getattro = CurrentGetattro;
1591     CurrentType.tp_setattro = CurrentSetattro;
1592     CurrentType.tp_flags = Py_TPFLAGS_DEFAULT;
1593     CurrentType.tp_doc = "vim current object";
1594 
1595     vim_memset(&vimmodule, 0, sizeof(vimmodule));
1596     vimmodule.m_name = "vim";
1597     vimmodule.m_doc = vim_module_doc;
1598     vimmodule.m_size = -1;
1599     vimmodule.m_methods = VimMethods;
1600 }
1601