blob: 57257e643ef2453b0b5aba03b62353aff36aaf0d [file] [log] [blame]
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001/* 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
Bram Moolenaar0c1f3f42011-02-25 15:18:50 +010025/* uncomment this if used with the debug version of python */
26/* #define Py_DEBUG */
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020027
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
Bram Moolenaard68554d2010-07-25 13:43:20 +020037#if defined(_WIN32) && defined(HAVE_FCNTL_H)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020038# undef HAVE_FCNTL_H
39#endif
40
41#ifdef _DEBUG
42# undef _DEBUG
43#endif
44
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020045#define PY_SSIZE_T_CLEAN
46
47#ifdef F_BLANK
48# undef F_BLANK
49#endif
50
Bram Moolenaar6df6f472010-07-18 18:04:50 +020051#ifdef HAVE_STDARG_H
52# undef HAVE_STDARG_H /* Python's config.h defines it as well. */
53#endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020054#ifdef _POSIX_C_SOURCE /* defined in feature.h */
55# undef _POSIX_C_SOURCE
56#endif
Bram Moolenaar6df6f472010-07-18 18:04:50 +020057#ifdef _XOPEN_SOURCE
58# undef _XOPEN_SOURCE /* pyconfig.h defines it as well. */
59#endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020060
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
69static void init_structs(void);
70
Bram Moolenaar3d64a312011-07-15 15:54:44 +020071/* 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
Bram Moolenaar2afa3232012-06-29 16:28:28 +020078/* Python 3 does not support CObjects, always use Capsules */
79#define PY_USE_CAPSULE
80
Bram Moolenaar170bf1a2010-07-24 23:51:45 +020081#define PyInt Py_ssize_t
Bram Moolenaarca8a4df2010-07-31 19:54:14 +020082#define PyString_Check(obj) PyUnicode_Check(obj)
Bram Moolenaardb913952012-06-29 12:54:53 +020083#define PyString_AsBytes(obj) PyUnicode_AsEncodedString(obj, (char *)ENC_OPT, CODEC_ERROR_HANDLER)
Bram Moolenaar19e60942011-06-19 00:27:51 +020084#define PyString_FreeBytes(obj) Py_XDECREF(bytes)
85#define PyString_AsString(obj) PyBytes_AsString(obj)
86#define PyString_Size(obj) PyBytes_GET_SIZE(bytes)
Bram Moolenaarca8a4df2010-07-31 19:54:14 +020087#define PyString_FromString(repr) PyUnicode_FromString(repr)
Bram Moolenaar170bf1a2010-07-24 23:51:45 +020088
Bram Moolenaar0c1f3f42011-02-25 15:18:50 +010089#if defined(DYNAMIC_PYTHON3) || defined(PROTO)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020090
Bram Moolenaarb61f95c2010-08-09 22:06:13 +020091# ifndef WIN3264
92# include <dlfcn.h>
93# define FARPROC void*
94# define HINSTANCE void*
Bram Moolenaar644d37b2010-11-16 19:26:02 +010095# if defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)
Bram Moolenaarb61f95c2010-08-09 22:06:13 +020096# define load_dll(n) dlopen((n), RTLD_LAZY)
97# else
98# define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
99# endif
100# define close_dll dlclose
101# define symbol_from_dll dlsym
102# else
Bram Moolenaarebbcb822010-10-23 14:02:54 +0200103# define load_dll vimLoadLib
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200104# define close_dll FreeLibrary
105# define symbol_from_dll GetProcAddress
106# endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200107/*
108 * Wrapper defines
109 */
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200110# undef PyArg_Parse
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200111# define PyArg_Parse py3_PyArg_Parse
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200112# undef PyArg_ParseTuple
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200113# define PyArg_ParseTuple py3_PyArg_ParseTuple
Bram Moolenaar19e60942011-06-19 00:27:51 +0200114# define PyMem_Free py3_PyMem_Free
Bram Moolenaardb913952012-06-29 12:54:53 +0200115# define PyMem_Malloc py3_PyMem_Malloc
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200116# define PyDict_SetItemString py3_PyDict_SetItemString
117# define PyErr_BadArgument py3_PyErr_BadArgument
118# define PyErr_Clear py3_PyErr_Clear
119# define PyErr_NoMemory py3_PyErr_NoMemory
120# define PyErr_Occurred py3_PyErr_Occurred
121# define PyErr_SetNone py3_PyErr_SetNone
122# define PyErr_SetString py3_PyErr_SetString
123# define PyEval_InitThreads py3_PyEval_InitThreads
124# define PyEval_RestoreThread py3_PyEval_RestoreThread
125# define PyEval_SaveThread py3_PyEval_SaveThread
126# define PyGILState_Ensure py3_PyGILState_Ensure
127# define PyGILState_Release py3_PyGILState_Release
128# define PyLong_AsLong py3_PyLong_AsLong
129# define PyLong_FromLong py3_PyLong_FromLong
130# define PyList_GetItem py3_PyList_GetItem
131# define PyList_Append py3_PyList_Append
132# define PyList_New py3_PyList_New
133# define PyList_SetItem py3_PyList_SetItem
134# define PyList_Size py3_PyList_Size
Bram Moolenaardb913952012-06-29 12:54:53 +0200135# define PySequence_Check py3_PySequence_Check
136# define PySequence_Size py3_PySequence_Size
137# define PySequence_GetItem py3_PySequence_GetItem
138# define PyTuple_Size py3_PyTuple_Size
139# define PyTuple_GetItem py3_PyTuple_GetItem
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200140# define PySlice_GetIndicesEx py3_PySlice_GetIndicesEx
141# define PyImport_ImportModule py3_PyImport_ImportModule
Bram Moolenaardb913952012-06-29 12:54:53 +0200142# define PyImport_AddModule py3_PyImport_AddModule
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200143# define PyObject_Init py3__PyObject_Init
144# define PyDict_New py3_PyDict_New
145# define PyDict_GetItemString py3_PyDict_GetItemString
Bram Moolenaardb913952012-06-29 12:54:53 +0200146# define PyDict_Next py3_PyDict_Next
147# define PyMapping_Check py3_PyMapping_Check
148# define PyMapping_Items py3_PyMapping_Items
149# define PyIter_Next py3_PyIter_Next
150# define PyObject_GetIter py3_PyObject_GetIter
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200151# define PyModule_GetDict py3_PyModule_GetDict
152#undef PyRun_SimpleString
153# define PyRun_SimpleString py3_PyRun_SimpleString
Bram Moolenaardb913952012-06-29 12:54:53 +0200154#undef PyRun_String
155# define PyRun_String py3_PyRun_String
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200156# define PySys_SetObject py3_PySys_SetObject
157# define PySys_SetArgv py3_PySys_SetArgv
158# define PyType_Type (*py3_PyType_Type)
159# define PyType_Ready py3_PyType_Ready
160#undef Py_BuildValue
161# define Py_BuildValue py3_Py_BuildValue
Bram Moolenaar644d37b2010-11-16 19:26:02 +0100162# define Py_SetPythonHome py3_Py_SetPythonHome
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200163# define Py_Initialize py3_Py_Initialize
164# define Py_Finalize py3_Py_Finalize
165# define Py_IsInitialized py3_Py_IsInitialized
166# define _Py_NoneStruct (*py3__Py_NoneStruct)
Bram Moolenaardb913952012-06-29 12:54:53 +0200167# define _PyObject_NextNotImplemented (*py3__PyObject_NextNotImplemented)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200168# define PyModule_AddObject py3_PyModule_AddObject
169# define PyImport_AppendInittab py3_PyImport_AppendInittab
170# define _PyUnicode_AsString py3__PyUnicode_AsString
Bram Moolenaar19e60942011-06-19 00:27:51 +0200171# undef PyUnicode_AsEncodedString
172# define PyUnicode_AsEncodedString py3_PyUnicode_AsEncodedString
173# undef PyBytes_AsString
174# define PyBytes_AsString py3_PyBytes_AsString
Bram Moolenaardb913952012-06-29 12:54:53 +0200175# undef PyBytes_FromString
176# define PyBytes_FromString py3_PyBytes_FromString
177# define PyFloat_FromDouble py3_PyFloat_FromDouble
178# define PyFloat_AsDouble py3_PyFloat_AsDouble
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200179# define PyObject_GenericGetAttr py3_PyObject_GenericGetAttr
180# define PySlice_Type (*py3_PySlice_Type)
Bram Moolenaardb913952012-06-29 12:54:53 +0200181# define PyFloat_Type (*py3_PyFloat_Type)
Bram Moolenaar19e60942011-06-19 00:27:51 +0200182# define PyErr_NewException py3_PyErr_NewException
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200183# ifdef Py_DEBUG
184# define _Py_NegativeRefcount py3__Py_NegativeRefcount
185# define _Py_RefTotal (*py3__Py_RefTotal)
186# define _Py_Dealloc py3__Py_Dealloc
187# define _PyObject_DebugMalloc py3__PyObject_DebugMalloc
188# define _PyObject_DebugFree py3__PyObject_DebugFree
189# else
190# define PyObject_Malloc py3_PyObject_Malloc
191# define PyObject_Free py3_PyObject_Free
192# endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200193# define PyType_GenericAlloc py3_PyType_GenericAlloc
194# define PyType_GenericNew py3_PyType_GenericNew
195# define PyModule_Create2 py3_PyModule_Create2
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200196# undef PyUnicode_FromString
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200197# define PyUnicode_FromString py3_PyUnicode_FromString
Bram Moolenaar19e60942011-06-19 00:27:51 +0200198# undef PyUnicode_Decode
199# define PyUnicode_Decode py3_PyUnicode_Decode
Bram Moolenaardb913952012-06-29 12:54:53 +0200200# define PyType_IsSubtype py3_PyType_IsSubtype
201# define PyCapsule_New py3_PyCapsule_New
202# define PyCapsule_GetPointer py3_PyCapsule_GetPointer
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200203
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200204# ifdef Py_DEBUG
205# undef PyObject_NEW
206# define PyObject_NEW(type, typeobj) \
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200207( (type *) PyObject_Init( \
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200208 (PyObject *) _PyObject_DebugMalloc( _PyObject_SIZE(typeobj) ), (typeobj)) )
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200209# endif
210
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200211/*
212 * Pointers for dynamic link
213 */
214static int (*py3_PySys_SetArgv)(int, wchar_t **);
Bram Moolenaar644d37b2010-11-16 19:26:02 +0100215static void (*py3_Py_SetPythonHome)(wchar_t *home);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200216static void (*py3_Py_Initialize)(void);
217static PyObject* (*py3_PyList_New)(Py_ssize_t size);
218static PyGILState_STATE (*py3_PyGILState_Ensure)(void);
219static void (*py3_PyGILState_Release)(PyGILState_STATE);
220static int (*py3_PySys_SetObject)(char *, PyObject *);
221static PyObject* (*py3_PyList_Append)(PyObject *, PyObject *);
222static Py_ssize_t (*py3_PyList_Size)(PyObject *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200223static int (*py3_PySequence_Check)(PyObject *);
224static Py_ssize_t (*py3_PySequence_Size)(PyObject *);
225static PyObject* (*py3_PySequence_GetItem)(PyObject *, Py_ssize_t);
226static Py_ssize_t (*py3_PyTuple_Size)(PyObject *);
227static PyObject* (*py3_PyTuple_GetItem)(PyObject *, Py_ssize_t);
228static int (*py3_PyMapping_Check)(PyObject *);
229static PyObject* (*py3_PyMapping_Items)(PyObject *);
Bram Moolenaar314ed4b2011-09-14 18:59:39 +0200230static int (*py3_PySlice_GetIndicesEx)(PyObject *r, Py_ssize_t length,
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200231 Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200232static PyObject* (*py3_PyErr_NoMemory)(void);
233static void (*py3_Py_Finalize)(void);
234static void (*py3_PyErr_SetString)(PyObject *, const char *);
235static int (*py3_PyRun_SimpleString)(char *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200236static PyObject* (*py3_PyRun_String)(char *, int, PyObject *, PyObject *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200237static PyObject* (*py3_PyList_GetItem)(PyObject *, Py_ssize_t);
238static PyObject* (*py3_PyImport_ImportModule)(const char *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200239static PyObject* (*py3_PyImport_AddModule)(const char *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200240static int (*py3_PyErr_BadArgument)(void);
241static PyTypeObject* py3_PyType_Type;
242static PyObject* (*py3_PyErr_Occurred)(void);
243static PyObject* (*py3_PyModule_GetDict)(PyObject *);
244static int (*py3_PyList_SetItem)(PyObject *, Py_ssize_t, PyObject *);
245static PyObject* (*py3_PyDict_GetItemString)(PyObject *, const char *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200246static int (*py3_PyDict_Next)(PyObject *, Py_ssize_t *, PyObject **, PyObject **);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200247static PyObject* (*py3_PyLong_FromLong)(long);
248static PyObject* (*py3_PyDict_New)(void);
Bram Moolenaardb913952012-06-29 12:54:53 +0200249static PyObject* (*py3_PyIter_Next)(PyObject *);
250static PyObject* (*py3_PyObject_GetIter)(PyObject *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200251static PyObject* (*py3_Py_BuildValue)(char *, ...);
252static int (*py3_PyType_Ready)(PyTypeObject *type);
253static int (*py3_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item);
254static PyObject* (*py3_PyUnicode_FromString)(const char *u);
Bram Moolenaar19e60942011-06-19 00:27:51 +0200255static PyObject* (*py3_PyUnicode_Decode)(const char *u, Py_ssize_t size,
256 const char *encoding, const char *errors);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200257static long (*py3_PyLong_AsLong)(PyObject *);
258static void (*py3_PyErr_SetNone)(PyObject *);
259static void (*py3_PyEval_InitThreads)(void);
260static void(*py3_PyEval_RestoreThread)(PyThreadState *);
261static PyThreadState*(*py3_PyEval_SaveThread)(void);
262static int (*py3_PyArg_Parse)(PyObject *, char *, ...);
263static int (*py3_PyArg_ParseTuple)(PyObject *, char *, ...);
Bram Moolenaar19e60942011-06-19 00:27:51 +0200264static int (*py3_PyMem_Free)(void *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200265static void* (*py3_PyMem_Malloc)(size_t);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200266static int (*py3_Py_IsInitialized)(void);
267static void (*py3_PyErr_Clear)(void);
268static PyObject*(*py3__PyObject_Init)(PyObject *, PyTypeObject *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200269static iternextfunc py3__PyObject_NextNotImplemented;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200270static PyObject* py3__Py_NoneStruct;
271static int (*py3_PyModule_AddObject)(PyObject *m, const char *name, PyObject *o);
272static int (*py3_PyImport_AppendInittab)(const char *name, PyObject* (*initfunc)(void));
273static char* (*py3__PyUnicode_AsString)(PyObject *unicode);
Bram Moolenaar19e60942011-06-19 00:27:51 +0200274static PyObject* (*py3_PyUnicode_AsEncodedString)(PyObject *unicode, const char* encoding, const char* errors);
275static char* (*py3_PyBytes_AsString)(PyObject *bytes);
Bram Moolenaardb913952012-06-29 12:54:53 +0200276static PyObject* (*py3_PyBytes_FromString)(char *str);
277static PyObject* (*py3_PyFloat_FromDouble)(double num);
278static double (*py3_PyFloat_AsDouble)(PyObject *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200279static PyObject* (*py3_PyObject_GenericGetAttr)(PyObject *obj, PyObject *name);
280static PyObject* (*py3_PyModule_Create2)(struct PyModuleDef* module, int module_api_version);
281static PyObject* (*py3_PyType_GenericAlloc)(PyTypeObject *type, Py_ssize_t nitems);
282static PyObject* (*py3_PyType_GenericNew)(PyTypeObject *type, PyObject *args, PyObject *kwds);
283static PyTypeObject* py3_PySlice_Type;
Bram Moolenaardb913952012-06-29 12:54:53 +0200284static PyTypeObject* py3_PyFloat_Type;
Bram Moolenaar19e60942011-06-19 00:27:51 +0200285static PyObject* (*py3_PyErr_NewException)(char *name, PyObject *base, PyObject *dict);
Bram Moolenaardb913952012-06-29 12:54:53 +0200286static PyObject* (*py3_PyCapsule_New)(void *, char *, PyCapsule_Destructor);
287static void* (*py3_PyCapsule_GetPointer)(PyObject *, char *);
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200288# ifdef Py_DEBUG
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200289 static void (*py3__Py_NegativeRefcount)(const char *fname, int lineno, PyObject *op);
290 static Py_ssize_t* py3__Py_RefTotal;
291 static void (*py3__Py_Dealloc)(PyObject *obj);
292 static void (*py3__PyObject_DebugFree)(void*);
293 static void* (*py3__PyObject_DebugMalloc)(size_t);
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200294# else
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200295 static void (*py3_PyObject_Free)(void*);
296 static void* (*py3_PyObject_Malloc)(size_t);
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200297# endif
Bram Moolenaardb913952012-06-29 12:54:53 +0200298static int (*py3_PyType_IsSubtype)(PyTypeObject *, PyTypeObject *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200299
300static HINSTANCE hinstPy3 = 0; /* Instance of python.dll */
301
302/* Imported exception objects */
303static PyObject *p3imp_PyExc_AttributeError;
304static PyObject *p3imp_PyExc_IndexError;
305static PyObject *p3imp_PyExc_KeyboardInterrupt;
306static PyObject *p3imp_PyExc_TypeError;
307static PyObject *p3imp_PyExc_ValueError;
308
309# define PyExc_AttributeError p3imp_PyExc_AttributeError
310# define PyExc_IndexError p3imp_PyExc_IndexError
311# define PyExc_KeyboardInterrupt p3imp_PyExc_KeyboardInterrupt
312# define PyExc_TypeError p3imp_PyExc_TypeError
313# define PyExc_ValueError p3imp_PyExc_ValueError
314
315/*
316 * Table of name to function pointer of python.
317 */
318# define PYTHON_PROC FARPROC
319static struct
320{
321 char *name;
322 PYTHON_PROC *ptr;
323} py3_funcname_table[] =
324{
325 {"PySys_SetArgv", (PYTHON_PROC*)&py3_PySys_SetArgv},
Bram Moolenaar644d37b2010-11-16 19:26:02 +0100326 {"Py_SetPythonHome", (PYTHON_PROC*)&py3_Py_SetPythonHome},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200327 {"Py_Initialize", (PYTHON_PROC*)&py3_Py_Initialize},
328 {"PyArg_ParseTuple", (PYTHON_PROC*)&py3_PyArg_ParseTuple},
Bram Moolenaar19e60942011-06-19 00:27:51 +0200329 {"PyMem_Free", (PYTHON_PROC*)&py3_PyMem_Free},
Bram Moolenaardb913952012-06-29 12:54:53 +0200330 {"PyMem_Malloc", (PYTHON_PROC*)&py3_PyMem_Malloc},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200331 {"PyList_New", (PYTHON_PROC*)&py3_PyList_New},
332 {"PyGILState_Ensure", (PYTHON_PROC*)&py3_PyGILState_Ensure},
333 {"PyGILState_Release", (PYTHON_PROC*)&py3_PyGILState_Release},
334 {"PySys_SetObject", (PYTHON_PROC*)&py3_PySys_SetObject},
335 {"PyList_Append", (PYTHON_PROC*)&py3_PyList_Append},
336 {"PyList_Size", (PYTHON_PROC*)&py3_PyList_Size},
Bram Moolenaardb913952012-06-29 12:54:53 +0200337 {"PySequence_Check", (PYTHON_PROC*)&py3_PySequence_Check},
338 {"PySequence_Size", (PYTHON_PROC*)&py3_PySequence_Size},
339 {"PySequence_GetItem", (PYTHON_PROC*)&py3_PySequence_GetItem},
340 {"PyTuple_Size", (PYTHON_PROC*)&py3_PyTuple_Size},
341 {"PyTuple_GetItem", (PYTHON_PROC*)&py3_PyTuple_GetItem},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200342 {"PySlice_GetIndicesEx", (PYTHON_PROC*)&py3_PySlice_GetIndicesEx},
343 {"PyErr_NoMemory", (PYTHON_PROC*)&py3_PyErr_NoMemory},
344 {"Py_Finalize", (PYTHON_PROC*)&py3_Py_Finalize},
345 {"PyErr_SetString", (PYTHON_PROC*)&py3_PyErr_SetString},
346 {"PyRun_SimpleString", (PYTHON_PROC*)&py3_PyRun_SimpleString},
Bram Moolenaardb913952012-06-29 12:54:53 +0200347 {"PyRun_String", (PYTHON_PROC*)&py3_PyRun_String},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200348 {"PyList_GetItem", (PYTHON_PROC*)&py3_PyList_GetItem},
349 {"PyImport_ImportModule", (PYTHON_PROC*)&py3_PyImport_ImportModule},
Bram Moolenaardb913952012-06-29 12:54:53 +0200350 {"PyImport_AddModule", (PYTHON_PROC*)&py3_PyImport_AddModule},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200351 {"PyErr_BadArgument", (PYTHON_PROC*)&py3_PyErr_BadArgument},
352 {"PyType_Type", (PYTHON_PROC*)&py3_PyType_Type},
353 {"PyErr_Occurred", (PYTHON_PROC*)&py3_PyErr_Occurred},
354 {"PyModule_GetDict", (PYTHON_PROC*)&py3_PyModule_GetDict},
355 {"PyList_SetItem", (PYTHON_PROC*)&py3_PyList_SetItem},
356 {"PyDict_GetItemString", (PYTHON_PROC*)&py3_PyDict_GetItemString},
Bram Moolenaardb913952012-06-29 12:54:53 +0200357 {"PyDict_Next", (PYTHON_PROC*)&py3_PyDict_Next},
358 {"PyMapping_Check", (PYTHON_PROC*)&py3_PyMapping_Check},
359 {"PyMapping_Items", (PYTHON_PROC*)&py3_PyMapping_Items},
360 {"PyIter_Next", (PYTHON_PROC*)&py3_PyIter_Next},
361 {"PyObject_GetIter", (PYTHON_PROC*)&py3_PyObject_GetIter},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200362 {"PyLong_FromLong", (PYTHON_PROC*)&py3_PyLong_FromLong},
363 {"PyDict_New", (PYTHON_PROC*)&py3_PyDict_New},
364 {"Py_BuildValue", (PYTHON_PROC*)&py3_Py_BuildValue},
365 {"PyType_Ready", (PYTHON_PROC*)&py3_PyType_Ready},
366 {"PyDict_SetItemString", (PYTHON_PROC*)&py3_PyDict_SetItemString},
367 {"PyLong_AsLong", (PYTHON_PROC*)&py3_PyLong_AsLong},
368 {"PyErr_SetNone", (PYTHON_PROC*)&py3_PyErr_SetNone},
369 {"PyEval_InitThreads", (PYTHON_PROC*)&py3_PyEval_InitThreads},
370 {"PyEval_RestoreThread", (PYTHON_PROC*)&py3_PyEval_RestoreThread},
371 {"PyEval_SaveThread", (PYTHON_PROC*)&py3_PyEval_SaveThread},
372 {"PyArg_Parse", (PYTHON_PROC*)&py3_PyArg_Parse},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200373 {"Py_IsInitialized", (PYTHON_PROC*)&py3_Py_IsInitialized},
Bram Moolenaardb913952012-06-29 12:54:53 +0200374 {"_PyObject_NextNotImplemented", (PYTHON_PROC*)&py3__PyObject_NextNotImplemented},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200375 {"_Py_NoneStruct", (PYTHON_PROC*)&py3__Py_NoneStruct},
376 {"PyErr_Clear", (PYTHON_PROC*)&py3_PyErr_Clear},
377 {"PyObject_Init", (PYTHON_PROC*)&py3__PyObject_Init},
378 {"PyModule_AddObject", (PYTHON_PROC*)&py3_PyModule_AddObject},
379 {"PyImport_AppendInittab", (PYTHON_PROC*)&py3_PyImport_AppendInittab},
380 {"_PyUnicode_AsString", (PYTHON_PROC*)&py3__PyUnicode_AsString},
Bram Moolenaar19e60942011-06-19 00:27:51 +0200381 {"PyBytes_AsString", (PYTHON_PROC*)&py3_PyBytes_AsString},
Bram Moolenaardb913952012-06-29 12:54:53 +0200382 {"PyBytes_FromString", (PYTHON_PROC*)&py3_PyBytes_FromString},
383 {"PyFloat_FromDouble", (PYTHON_PROC*)&py3_PyFloat_FromDouble},
384 {"PyFloat_AsDouble", (PYTHON_PROC*)&py3_PyFloat_AsDouble},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200385 {"PyObject_GenericGetAttr", (PYTHON_PROC*)&py3_PyObject_GenericGetAttr},
386 {"PyModule_Create2", (PYTHON_PROC*)&py3_PyModule_Create2},
387 {"PyType_GenericAlloc", (PYTHON_PROC*)&py3_PyType_GenericAlloc},
388 {"PyType_GenericNew", (PYTHON_PROC*)&py3_PyType_GenericNew},
389 {"PySlice_Type", (PYTHON_PROC*)&py3_PySlice_Type},
Bram Moolenaardb913952012-06-29 12:54:53 +0200390 {"PyFloat_Type", (PYTHON_PROC*)&py3_PyFloat_Type},
Bram Moolenaar19e60942011-06-19 00:27:51 +0200391 {"PyErr_NewException", (PYTHON_PROC*)&py3_PyErr_NewException},
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200392# ifdef Py_DEBUG
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200393 {"_Py_NegativeRefcount", (PYTHON_PROC*)&py3__Py_NegativeRefcount},
394 {"_Py_RefTotal", (PYTHON_PROC*)&py3__Py_RefTotal},
395 {"_Py_Dealloc", (PYTHON_PROC*)&py3__Py_Dealloc},
396 {"_PyObject_DebugFree", (PYTHON_PROC*)&py3__PyObject_DebugFree},
397 {"_PyObject_DebugMalloc", (PYTHON_PROC*)&py3__PyObject_DebugMalloc},
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200398# else
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200399 {"PyObject_Malloc", (PYTHON_PROC*)&py3_PyObject_Malloc},
400 {"PyObject_Free", (PYTHON_PROC*)&py3_PyObject_Free},
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200401# endif
Bram Moolenaardb913952012-06-29 12:54:53 +0200402 {"PyType_IsSubtype", (PYTHON_PROC*)&py3_PyType_IsSubtype},
403 {"PyCapsule_New", (PYTHON_PROC*)&py3_PyCapsule_New},
404 {"PyCapsule_GetPointer", (PYTHON_PROC*)&py3_PyCapsule_GetPointer},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200405 {"", NULL},
406};
407
408/*
409 * Free python.dll
410 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200411 static void
412end_dynamic_python3(void)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200413{
Bram Moolenaar4c3a3262010-07-24 15:42:14 +0200414 if (hinstPy3 != 0)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200415 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200416 close_dll(hinstPy3);
417 hinstPy3 = 0;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200418 }
419}
420
421/*
422 * Load library and get all pointers.
423 * Parameter 'libname' provides name of DLL.
424 * Return OK or FAIL.
425 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200426 static int
427py3_runtime_link_init(char *libname, int verbose)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200428{
429 int i;
Bram Moolenaar19e60942011-06-19 00:27:51 +0200430 void *ucs_from_string, *ucs_decode, *ucs_as_encoded_string;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200431
Bram Moolenaar644d37b2010-11-16 19:26:02 +0100432# if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON)
Bram Moolenaarb744b2f2010-08-13 16:22:57 +0200433 /* Can't have Python and Python3 loaded at the same time.
434 * It cause a crash, because RTLD_GLOBAL is needed for
435 * standard C extension libraries of one or both python versions. */
Bram Moolenaar4c3a3262010-07-24 15:42:14 +0200436 if (python_loaded())
437 {
Bram Moolenaar9dc93ae2011-08-28 16:00:19 +0200438 if (verbose)
439 EMSG(_("E837: This Vim cannot execute :py3 after using :python"));
Bram Moolenaar4c3a3262010-07-24 15:42:14 +0200440 return FAIL;
441 }
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200442# endif
Bram Moolenaar4c3a3262010-07-24 15:42:14 +0200443
444 if (hinstPy3 != 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200445 return OK;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200446 hinstPy3 = load_dll(libname);
447
448 if (!hinstPy3)
449 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200450 if (verbose)
451 EMSG2(_(e_loadlib), libname);
452 return FAIL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200453 }
454
455 for (i = 0; py3_funcname_table[i].ptr; ++i)
456 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200457 if ((*py3_funcname_table[i].ptr = symbol_from_dll(hinstPy3,
458 py3_funcname_table[i].name)) == NULL)
459 {
460 close_dll(hinstPy3);
461 hinstPy3 = 0;
462 if (verbose)
463 EMSG2(_(e_loadfunc), py3_funcname_table[i].name);
464 return FAIL;
465 }
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200466 }
467
Bram Moolenaar69154f22010-07-18 21:42:34 +0200468 /* Load unicode functions separately as only the ucs2 or the ucs4 functions
469 * will be present in the library. */
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200470 ucs_from_string = symbol_from_dll(hinstPy3, "PyUnicodeUCS2_FromString");
Bram Moolenaar19e60942011-06-19 00:27:51 +0200471 ucs_decode = symbol_from_dll(hinstPy3,
472 "PyUnicodeUCS2_Decode");
473 ucs_as_encoded_string = symbol_from_dll(hinstPy3,
474 "PyUnicodeUCS2_AsEncodedString");
475 if (!ucs_from_string || !ucs_decode || !ucs_as_encoded_string)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200476 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200477 ucs_from_string = symbol_from_dll(hinstPy3,
478 "PyUnicodeUCS4_FromString");
Bram Moolenaar19e60942011-06-19 00:27:51 +0200479 ucs_decode = symbol_from_dll(hinstPy3,
480 "PyUnicodeUCS4_Decode");
481 ucs_as_encoded_string = symbol_from_dll(hinstPy3,
482 "PyUnicodeUCS4_AsEncodedString");
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200483 }
Bram Moolenaar19e60942011-06-19 00:27:51 +0200484 if (ucs_from_string && ucs_decode && ucs_as_encoded_string)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200485 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200486 py3_PyUnicode_FromString = ucs_from_string;
Bram Moolenaar19e60942011-06-19 00:27:51 +0200487 py3_PyUnicode_Decode = ucs_decode;
488 py3_PyUnicode_AsEncodedString = ucs_as_encoded_string;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200489 }
490 else
491 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200492 close_dll(hinstPy3);
493 hinstPy3 = 0;
494 if (verbose)
495 EMSG2(_(e_loadfunc), "PyUnicode_UCSX_*");
496 return FAIL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200497 }
498
499 return OK;
500}
501
502/*
503 * If python is enabled (there is installed python on Windows system) return
504 * TRUE, else FALSE.
505 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200506 int
507python3_enabled(int verbose)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200508{
509 return py3_runtime_link_init(DYNAMIC_PYTHON3_DLL, verbose) == OK;
510}
511
512/* Load the standard Python exceptions - don't import the symbols from the
513 * DLL, as this can cause errors (importing data symbols is not reliable).
514 */
515static void get_py3_exceptions __ARGS((void));
516
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200517 static void
518get_py3_exceptions()
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200519{
520 PyObject *exmod = PyImport_ImportModule("builtins");
521 PyObject *exdict = PyModule_GetDict(exmod);
522 p3imp_PyExc_AttributeError = PyDict_GetItemString(exdict, "AttributeError");
523 p3imp_PyExc_IndexError = PyDict_GetItemString(exdict, "IndexError");
524 p3imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt");
525 p3imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError");
526 p3imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError");
527 Py_XINCREF(p3imp_PyExc_AttributeError);
528 Py_XINCREF(p3imp_PyExc_IndexError);
529 Py_XINCREF(p3imp_PyExc_KeyboardInterrupt);
530 Py_XINCREF(p3imp_PyExc_TypeError);
531 Py_XINCREF(p3imp_PyExc_ValueError);
532 Py_XDECREF(exmod);
533}
534#endif /* DYNAMIC_PYTHON3 */
535
Bram Moolenaarca8a4df2010-07-31 19:54:14 +0200536static PyObject *BufferNew (buf_T *);
537static PyObject *WindowNew(win_T *);
538static PyObject *LineToString(const char *);
Bram Moolenaar7f85d292012-02-04 20:17:26 +0100539static PyObject *BufferDir(PyObject *, PyObject *);
Bram Moolenaarca8a4df2010-07-31 19:54:14 +0200540
541static PyTypeObject RangeType;
542
Bram Moolenaardb913952012-06-29 12:54:53 +0200543static int py3initialised = 0;
544
545#define PYINITIALISED py3initialised
546
547/* Add conversion from PyInt? */
548#define DICTKEY_GET(err) \
549 if (PyBytes_Check(keyObject)) \
550 key = (char_u *) PyBytes_AsString(keyObject); \
551 else if (PyUnicode_Check(keyObject)) \
552 { \
553 bytes = PyString_AsBytes(keyObject); \
554 if (bytes == NULL) \
555 return err; \
556 key = (char_u *) PyBytes_AsString(bytes); \
557 if (key == NULL) \
558 return err; \
559 } \
560 else \
561 { \
562 PyErr_SetString(PyExc_TypeError, _("only string keys are allowed")); \
563 return err; \
564 }
565#define DICTKEY_UNREF \
566 if (bytes != NULL) \
567 Py_XDECREF(bytes);
568
569#define DICTKEY_DECL PyObject *bytes = NULL;
570
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200571/*
572 * Include the code shared with if_python.c
573 */
574#include "if_py_both.h"
575
Bram Moolenaardb913952012-06-29 12:54:53 +0200576#define PY3OBJ_DELETED(obj) (obj->ob_base.ob_refcnt<=0)
577
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200578 static void
579call_PyObject_Free(void *p)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200580{
581#ifdef Py_DEBUG
582 _PyObject_DebugFree(p);
583#else
584 PyObject_Free(p);
585#endif
586}
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200587
588 static PyObject *
589call_PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200590{
591 return PyType_GenericNew(type,args,kwds);
592}
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200593
594 static PyObject *
595call_PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200596{
597 return PyType_GenericAlloc(type,nitems);
598}
599
600/******************************************************
601 * Internal function prototypes.
602 */
603
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200604static Py_ssize_t RangeStart;
605static Py_ssize_t RangeEnd;
606
Bram Moolenaardb913952012-06-29 12:54:53 +0200607static PyObject *globals;
608
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200609static int PythonIO_Init(void);
610static void PythonIO_Fini(void);
Bram Moolenaar69154f22010-07-18 21:42:34 +0200611PyMODINIT_FUNC Py3Init_vim(void);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200612
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200613/******************************************************
614 * 1. Python interpreter main program.
615 */
616
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200617static PyGILState_STATE pygilstate = PyGILState_UNLOCKED;
618
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200619 void
620python3_end()
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200621{
622 static int recurse = 0;
623
624 /* If a crash occurs while doing this, don't try again. */
625 if (recurse != 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200626 return;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200627
628 ++recurse;
629
630#ifdef DYNAMIC_PYTHON3
631 if (hinstPy3)
632#endif
633 if (Py_IsInitialized())
634 {
635 // acquire lock before finalizing
636 pygilstate = PyGILState_Ensure();
637
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200638 PythonIO_Fini();
639 Py_Finalize();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200640 }
641
642#ifdef DYNAMIC_PYTHON3
643 end_dynamic_python3();
644#endif
645
646 --recurse;
647}
648
Bram Moolenaar4c3a3262010-07-24 15:42:14 +0200649#if (defined(DYNAMIC_PYTHON) && defined(FEAT_PYTHON)) || defined(PROTO)
650 int
651python3_loaded()
652{
653 return (hinstPy3 != 0);
654}
655#endif
656
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200657 static int
658Python3_Init(void)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200659{
660 if (!py3initialised)
661 {
662#ifdef DYNAMIC_PYTHON3
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200663 if (!python3_enabled(TRUE))
664 {
665 EMSG(_("E263: Sorry, this command is disabled, the Python library could not be loaded."));
666 goto fail;
667 }
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200668#endif
669
670 init_structs();
671
Bram Moolenaar644d37b2010-11-16 19:26:02 +0100672
673#ifdef PYTHON3_HOME
674 Py_SetPythonHome(PYTHON3_HOME);
675#endif
676
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200677#if !defined(MACOS) || defined(MACOS_X_UNIX)
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200678 Py_Initialize();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200679#else
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200680 PyMac_Initialize();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200681#endif
Bram Moolenaar456f2bb2011-06-12 21:37:13 +0200682 /* initialise threads, must be after Py_Initialize() */
683 PyEval_InitThreads();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200684
685#ifdef DYNAMIC_PYTHON3
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200686 get_py3_exceptions();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200687#endif
688
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200689 if (PythonIO_Init())
690 goto fail;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200691
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200692 PyImport_AppendInittab("vim", Py3Init_vim);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200693
Bram Moolenaardb913952012-06-29 12:54:53 +0200694 globals = PyModule_GetDict(PyImport_AddModule("__main__"));
695
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200696 /* Remove the element from sys.path that was added because of our
697 * argv[0] value in Py3Init_vim(). Previously we used an empty
698 * string, but dependinding on the OS we then get an empty entry or
Bram Moolenaar19e60942011-06-19 00:27:51 +0200699 * the current directory in sys.path.
700 * Only after vim has been imported, the element does exist in
701 * sys.path.
702 */
703 PyRun_SimpleString("import vim; import sys; sys.path = list(filter(lambda x: not x.endswith('must>not&exist'), sys.path))");
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200704
705 // lock is created and acquired in PyEval_InitThreads() and thread
706 // state is created in Py_Initialize()
707 // there _PyGILState_NoteThreadState() also sets gilcounter to 1
708 // (python must have threads enabled!)
709 // so the following does both: unlock GIL and save thread state in TLS
710 // without deleting thread state
711 PyGILState_Release(pygilstate);
712
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200713 py3initialised = 1;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200714 }
715
716 return 0;
717
718fail:
719 /* We call PythonIO_Flush() here to print any Python errors.
720 * This is OK, as it is possible to call this function even
721 * if PythonIO_Init() has not completed successfully (it will
722 * not do anything in this case).
723 */
724 PythonIO_Flush();
725 return -1;
726}
727
728/*
729 * External interface
730 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200731 static void
Bram Moolenaardb913952012-06-29 12:54:53 +0200732DoPy3Command(exarg_T *eap, const char *cmd, typval_T *rettv)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200733{
734#if defined(MACOS) && !defined(MACOS_X_UNIX)
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200735 GrafPtr oldPort;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200736#endif
737#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200738 char *saved_locale;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200739#endif
Bram Moolenaar19e60942011-06-19 00:27:51 +0200740 PyObject *cmdstr;
741 PyObject *cmdbytes;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200742
743#if defined(MACOS) && !defined(MACOS_X_UNIX)
744 GetPort(&oldPort);
745 /* Check if the Python library is available */
746 if ((Ptr)PyMac_Initialize == (Ptr)kUnresolvedCFragSymbolAddress)
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200747 goto theend;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200748#endif
749 if (Python3_Init())
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200750 goto theend;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200751
Bram Moolenaardb913952012-06-29 12:54:53 +0200752 if (rettv == NULL)
753 {
754 RangeStart = eap->line1;
755 RangeEnd = eap->line2;
756 }
757 else
758 {
759 RangeStart = (PyInt) curwin->w_cursor.lnum;
760 RangeEnd = RangeStart;
761 }
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200762 Python_Release_Vim(); /* leave vim */
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200763
764#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
765 /* Python only works properly when the LC_NUMERIC locale is "C". */
766 saved_locale = setlocale(LC_NUMERIC, NULL);
767 if (saved_locale == NULL || STRCMP(saved_locale, "C") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200768 saved_locale = NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200769 else
770 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200771 /* Need to make a copy, value may change when setting new locale. */
772 saved_locale = (char *)vim_strsave((char_u *)saved_locale);
773 (void)setlocale(LC_NUMERIC, "C");
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200774 }
775#endif
776
777 pygilstate = PyGILState_Ensure();
778
Bram Moolenaar19e60942011-06-19 00:27:51 +0200779 /* PyRun_SimpleString expects a UTF-8 string. Wrong encoding may cause
780 * SyntaxError (unicode error). */
Bram Moolenaar3d64a312011-07-15 15:54:44 +0200781 cmdstr = PyUnicode_Decode(cmd, strlen(cmd),
782 (char *)ENC_OPT, CODEC_ERROR_HANDLER);
783 cmdbytes = PyUnicode_AsEncodedString(cmdstr, "utf-8", CODEC_ERROR_HANDLER);
Bram Moolenaar19e60942011-06-19 00:27:51 +0200784 Py_XDECREF(cmdstr);
Bram Moolenaardb913952012-06-29 12:54:53 +0200785 if (rettv == NULL)
786 PyRun_SimpleString(PyBytes_AsString(cmdbytes));
787 else
788 {
789 PyObject *r;
790
791 r = PyRun_String(PyBytes_AsString(cmdbytes), Py_eval_input,
792 globals, globals);
793 if (r == NULL)
794 EMSG(_("E860: Eval did not return a valid python 3 object"));
795 else
796 {
797 if (ConvertFromPyObject(r, rettv) == -1)
798 EMSG(_("E861: Failed to convert returned python 3 object to vim value"));
799 Py_DECREF(r);
800 }
801 PyErr_Clear();
802 }
Bram Moolenaar19e60942011-06-19 00:27:51 +0200803 Py_XDECREF(cmdbytes);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200804
805 PyGILState_Release(pygilstate);
806
807#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
808 if (saved_locale != NULL)
809 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200810 (void)setlocale(LC_NUMERIC, saved_locale);
811 vim_free(saved_locale);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200812 }
813#endif
814
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200815 Python_Lock_Vim(); /* enter vim */
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200816 PythonIO_Flush();
817#if defined(MACOS) && !defined(MACOS_X_UNIX)
818 SetPort(oldPort);
819#endif
820
821theend:
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200822 return; /* keeps lint happy */
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200823}
824
825/*
Bram Moolenaar368373e2010-07-19 20:46:22 +0200826 * ":py3"
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200827 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200828 void
829ex_py3(exarg_T *eap)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200830{
831 char_u *script;
832
833 script = script_get(eap, eap->arg);
834 if (!eap->skip)
835 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200836 if (script == NULL)
Bram Moolenaardb913952012-06-29 12:54:53 +0200837 DoPy3Command(eap, (char *)eap->arg, NULL);
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200838 else
Bram Moolenaardb913952012-06-29 12:54:53 +0200839 DoPy3Command(eap, (char *)script, NULL);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200840 }
841 vim_free(script);
842}
843
844#define BUFFER_SIZE 2048
845
846/*
Bram Moolenaar6df6f472010-07-18 18:04:50 +0200847 * ":py3file"
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200848 */
849 void
850ex_py3file(exarg_T *eap)
851{
852 static char buffer[BUFFER_SIZE];
853 const char *file;
854 char *p;
855 int i;
856
857 /* Have to do it like this. PyRun_SimpleFile requires you to pass a
858 * stdio file pointer, but Vim and the Python DLL are compiled with
859 * different options under Windows, meaning that stdio pointers aren't
860 * compatible between the two. Yuk.
861 *
Bram Moolenaar19e60942011-06-19 00:27:51 +0200862 * construct: exec(compile(open('a_filename', 'rb').read(), 'a_filename', 'exec'))
863 *
864 * Using bytes so that Python can detect the source encoding as it normally
865 * does. The doc does not say "compile" accept bytes, though.
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200866 *
867 * We need to escape any backslashes or single quotes in the file name, so that
868 * Python won't mangle the file name.
869 */
870
871 strcpy(buffer, "exec(compile(open('");
872 p = buffer + 19; /* size of "exec(compile(open('" */
873
874 for (i=0; i<2; ++i)
875 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200876 file = (char *)eap->arg;
877 while (*file && p < buffer + (BUFFER_SIZE - 3))
878 {
879 if (*file == '\\' || *file == '\'')
880 *p++ = '\\';
881 *p++ = *file++;
882 }
883 /* If we didn't finish the file name, we hit a buffer overflow */
884 if (*file != '\0')
885 return;
886 if (i==0)
887 {
Bram Moolenaar19e60942011-06-19 00:27:51 +0200888 strcpy(p,"','rb').read(),'");
889 p += 16;
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200890 }
891 else
892 {
893 strcpy(p,"','exec'))");
894 p += 10;
895 }
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200896 }
897
898
899 /* Execute the file */
Bram Moolenaardb913952012-06-29 12:54:53 +0200900 DoPy3Command(eap, buffer, NULL);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200901}
902
903/******************************************************
904 * 2. Python output stream: writes output via [e]msg().
905 */
906
907/* Implementation functions
908 */
909
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200910 static PyObject *
911OutputGetattro(PyObject *self, PyObject *nameobj)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200912{
913 char *name = "";
914 if (PyUnicode_Check(nameobj))
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200915 name = _PyUnicode_AsString(nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200916
917 if (strcmp(name, "softspace") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200918 return PyLong_FromLong(((OutputObject *)(self))->softspace);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200919
920 return PyObject_GenericGetAttr(self, nameobj);
921}
922
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200923 static int
924OutputSetattro(PyObject *self, PyObject *nameobj, PyObject *val)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200925{
926 char *name = "";
927 if (PyUnicode_Check(nameobj))
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200928 name = _PyUnicode_AsString(nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200929
Bram Moolenaardb913952012-06-29 12:54:53 +0200930 if (val == NULL)
931 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200932 PyErr_SetString(PyExc_AttributeError, _("can't delete OutputObject attributes"));
933 return -1;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200934 }
935
936 if (strcmp(name, "softspace") == 0)
937 {
Bram Moolenaardb913952012-06-29 12:54:53 +0200938 if (!PyLong_Check(val))
939 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200940 PyErr_SetString(PyExc_TypeError, _("softspace must be an integer"));
941 return -1;
942 }
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200943
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200944 ((OutputObject *)(self))->softspace = PyLong_AsLong(val);
945 return 0;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200946 }
947
948 PyErr_SetString(PyExc_AttributeError, _("invalid attribute"));
949 return -1;
950}
951
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200952/***************/
953
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200954 static int
955PythonIO_Init(void)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200956{
957 PyType_Ready(&OutputType);
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200958 return PythonIO_Init_io();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200959}
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200960
961 static void
962PythonIO_Fini(void)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200963{
964 PySys_SetObject("stdout", NULL);
965 PySys_SetObject("stderr", NULL);
966}
967
968/******************************************************
969 * 3. Implementation of the Vim module for Python
970 */
971
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200972/* Window type - Implementation functions
973 * --------------------------------------
974 */
975
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200976#define WindowType_Check(obj) ((obj)->ob_base.ob_type == &WindowType)
977
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200978/* Buffer type - Implementation functions
979 * --------------------------------------
980 */
981
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200982#define BufferType_Check(obj) ((obj)->ob_base.ob_type == &BufferType)
983
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200984static Py_ssize_t BufferLength(PyObject *);
985static PyObject *BufferItem(PyObject *, Py_ssize_t);
Bram Moolenaarba4897e2011-09-14 15:01:58 +0200986static PyObject* BufferSubscript(PyObject *self, PyObject *idx);
987static Py_ssize_t BufferAsSubscript(PyObject *self, PyObject *idx, PyObject *val);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200988
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200989
990/* Line range type - Implementation functions
991 * --------------------------------------
992 */
993
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200994#define RangeType_Check(obj) ((obj)->ob_base.ob_type == &RangeType)
995
Bram Moolenaarba4897e2011-09-14 15:01:58 +0200996static PyObject* RangeSubscript(PyObject *self, PyObject *idx);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200997static Py_ssize_t RangeAsItem(PyObject *, Py_ssize_t, PyObject *);
Bram Moolenaarba4897e2011-09-14 15:01:58 +0200998static Py_ssize_t RangeAsSubscript(PyObject *self, PyObject *idx, PyObject *val);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200999
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001000/* Current objects type - Implementation functions
1001 * -----------------------------------------------
1002 */
1003
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001004static PySequenceMethods BufferAsSeq = {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001005 (lenfunc) BufferLength, /* sq_length, len(x) */
1006 (binaryfunc) 0, /* sq_concat, x+y */
1007 (ssizeargfunc) 0, /* sq_repeat, x*n */
1008 (ssizeargfunc) BufferItem, /* sq_item, x[i] */
1009 0, /* was_sq_slice, x[i:j] */
Bram Moolenaar19e60942011-06-19 00:27:51 +02001010 0, /* sq_ass_item, x[i]=v */
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001011 0, /* sq_ass_slice, x[i:j]=v */
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001012 0, /* sq_contains */
1013 0, /* sq_inplace_concat */
1014 0, /* sq_inplace_repeat */
1015};
1016
1017PyMappingMethods BufferAsMapping = {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001018 /* mp_length */ (lenfunc)BufferLength,
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001019 /* mp_subscript */ (binaryfunc)BufferSubscript,
Bram Moolenaar19e60942011-06-19 00:27:51 +02001020 /* mp_ass_subscript */ (objobjargproc)BufferAsSubscript,
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001021};
1022
1023
1024/* Buffer object - Definitions
1025 */
1026
1027static PyTypeObject BufferType;
1028
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001029 static PyObject *
1030BufferNew(buf_T *buf)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001031{
1032 /* We need to handle deletion of buffers underneath us.
1033 * If we add a "b_python3_ref" field to the buf_T structure,
1034 * then we can get at it in buf_freeall() in vim. We then
1035 * need to create only ONE Python object per buffer - if
1036 * we try to create a second, just INCREF the existing one
1037 * and return it. The (single) Python object referring to
1038 * the buffer is stored in "b_python3_ref".
1039 * Question: what to do on a buf_freeall(). We'll probably
1040 * have to either delete the Python object (DECREF it to
1041 * zero - a bad idea, as it leaves dangling refs!) or
1042 * set the buf_T * value to an invalid value (-1?), which
1043 * means we need checks in all access functions... Bah.
1044 */
1045
1046 BufferObject *self;
1047
1048 if (buf->b_python3_ref != NULL)
1049 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001050 self = buf->b_python3_ref;
1051 Py_INCREF(self);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001052 }
1053 else
1054 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001055 self = PyObject_NEW(BufferObject, &BufferType);
1056 buf->b_python3_ref = self;
1057 if (self == NULL)
1058 return NULL;
1059 self->buf = buf;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001060 }
1061
1062 return (PyObject *)(self);
1063}
1064
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001065 static void
1066BufferDestructor(PyObject *self)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001067{
1068 BufferObject *this = (BufferObject *)(self);
1069
1070 if (this->buf && this->buf != INVALID_BUFFER_VALUE)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001071 this->buf->b_python3_ref = NULL;
Bram Moolenaar19e60942011-06-19 00:27:51 +02001072
1073 Py_TYPE(self)->tp_free((PyObject*)self);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001074}
1075
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001076 static PyObject *
1077BufferGetattro(PyObject *self, PyObject*nameobj)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001078{
1079 BufferObject *this = (BufferObject *)(self);
1080
1081 char *name = "";
1082 if (PyUnicode_Check(nameobj))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001083 name = _PyUnicode_AsString(nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001084
1085 if (CheckBuffer(this))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001086 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001087
1088 if (strcmp(name, "name") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001089 return Py_BuildValue("s", this->buf->b_ffname);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001090 else if (strcmp(name, "number") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001091 return Py_BuildValue("n", this->buf->b_fnum);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001092 else
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001093 return PyObject_GenericGetAttr(self, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001094}
1095
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001096 static PyObject *
Bram Moolenaar7f85d292012-02-04 20:17:26 +01001097BufferDir(PyObject *self UNUSED, PyObject *args UNUSED)
1098{
1099 return Py_BuildValue("[sssss]", "name", "number",
1100 "append", "mark", "range");
1101}
1102
1103 static PyObject *
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001104BufferRepr(PyObject *self)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001105{
1106 static char repr[100];
1107 BufferObject *this = (BufferObject *)(self);
1108
1109 if (this->buf == INVALID_BUFFER_VALUE)
1110 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001111 vim_snprintf(repr, 100, _("<buffer object (deleted) at %p>"), (self));
1112 return PyUnicode_FromString(repr);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001113 }
1114 else
1115 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001116 char *name = (char *)this->buf->b_fname;
1117 Py_ssize_t len;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001118
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001119 if (name == NULL)
1120 name = "";
1121 len = strlen(name);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001122
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001123 if (len > 35)
1124 name = name + (35 - len);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001125
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001126 vim_snprintf(repr, 100, "<buffer %s%s>", len > 35 ? "..." : "", name);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001127
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001128 return PyUnicode_FromString(repr);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001129 }
1130}
1131
1132/******************/
1133
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001134 static Py_ssize_t
1135BufferLength(PyObject *self)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001136{
1137 if (CheckBuffer((BufferObject *)(self)))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001138 return -1;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001139
1140 return (Py_ssize_t)(((BufferObject *)(self))->buf->b_ml.ml_line_count);
1141}
1142
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001143 static PyObject *
1144BufferItem(PyObject *self, Py_ssize_t n)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001145{
1146 return RBItem((BufferObject *)(self), n, 1,
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001147 (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001148}
1149
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001150 static PyObject *
1151BufferSlice(PyObject *self, Py_ssize_t lo, Py_ssize_t hi)
1152{
1153 return RBSlice((BufferObject *)(self), lo, hi, 1,
1154 (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count);
1155}
1156
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001157 static PyObject *
1158BufferSubscript(PyObject *self, PyObject* idx)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001159{
Bram Moolenaardb913952012-06-29 12:54:53 +02001160 if (PyLong_Check(idx))
1161 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001162 long _idx = PyLong_AsLong(idx);
1163 return BufferItem(self,_idx);
Bram Moolenaardb913952012-06-29 12:54:53 +02001164 } else if (PySlice_Check(idx))
1165 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001166 Py_ssize_t start, stop, step, slicelen;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001167
Bram Moolenaar9e8edf62011-09-14 15:41:58 +02001168 if (PySlice_GetIndicesEx((PyObject *)idx,
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001169 (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1,
1170 &start, &stop,
Bram Moolenaardb913952012-06-29 12:54:53 +02001171 &step, &slicelen) < 0)
1172 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001173 return NULL;
1174 }
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001175 return BufferSlice(self, start, stop);
Bram Moolenaardb913952012-06-29 12:54:53 +02001176 }
1177 else
1178 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001179 PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
1180 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001181 }
1182}
1183
Bram Moolenaar19e60942011-06-19 00:27:51 +02001184 static Py_ssize_t
1185BufferAsSubscript(PyObject *self, PyObject* idx, PyObject* val)
1186{
Bram Moolenaardb913952012-06-29 12:54:53 +02001187 if (PyLong_Check(idx))
1188 {
Bram Moolenaar19e60942011-06-19 00:27:51 +02001189 long n = PyLong_AsLong(idx);
1190 return RBAsItem((BufferObject *)(self), n, val, 1,
1191 (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1192 NULL);
Bram Moolenaardb913952012-06-29 12:54:53 +02001193 } else if (PySlice_Check(idx))
1194 {
Bram Moolenaar19e60942011-06-19 00:27:51 +02001195 Py_ssize_t start, stop, step, slicelen;
1196
Bram Moolenaar9e8edf62011-09-14 15:41:58 +02001197 if (PySlice_GetIndicesEx((PyObject *)idx,
Bram Moolenaar19e60942011-06-19 00:27:51 +02001198 (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1,
1199 &start, &stop,
Bram Moolenaardb913952012-06-29 12:54:53 +02001200 &step, &slicelen) < 0)
1201 {
Bram Moolenaar19e60942011-06-19 00:27:51 +02001202 return -1;
1203 }
1204 return RBAsSlice((BufferObject *)(self), start, stop, val, 1,
1205 (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1206 NULL);
Bram Moolenaardb913952012-06-29 12:54:53 +02001207 }
1208 else
1209 {
Bram Moolenaar19e60942011-06-19 00:27:51 +02001210 PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
1211 return -1;
1212 }
1213}
1214
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001215static PySequenceMethods RangeAsSeq = {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001216 (lenfunc) RangeLength, /* sq_length, len(x) */
1217 (binaryfunc) 0, /* RangeConcat, sq_concat, x+y */
1218 (ssizeargfunc) 0, /* RangeRepeat, sq_repeat, x*n */
1219 (ssizeargfunc) RangeItem, /* sq_item, x[i] */
1220 0, /* was_sq_slice, x[i:j] */
1221 (ssizeobjargproc) RangeAsItem, /* sq_as_item, x[i]=v */
1222 0, /* sq_ass_slice, x[i:j]=v */
1223 0, /* sq_contains */
1224 0, /* sq_inplace_concat */
1225 0, /* sq_inplace_repeat */
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001226};
1227
1228PyMappingMethods RangeAsMapping = {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001229 /* mp_length */ (lenfunc)RangeLength,
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001230 /* mp_subscript */ (binaryfunc)RangeSubscript,
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001231 /* mp_ass_subscript */ (objobjargproc)RangeAsSubscript,
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001232};
1233
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001234/* Line range object - Implementation
1235 */
1236
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001237 static void
1238RangeDestructor(PyObject *self)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001239{
1240 Py_DECREF(((RangeObject *)(self))->buf);
Bram Moolenaar19e60942011-06-19 00:27:51 +02001241 Py_TYPE(self)->tp_free((PyObject*)self);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001242}
1243
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001244 static PyObject *
1245RangeGetattro(PyObject *self, PyObject *nameobj)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001246{
1247 char *name = "";
1248 if (PyUnicode_Check(nameobj))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001249 name = _PyUnicode_AsString(nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001250
1251 if (strcmp(name, "start") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001252 return Py_BuildValue("n", ((RangeObject *)(self))->start - 1);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001253 else if (strcmp(name, "end") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001254 return Py_BuildValue("n", ((RangeObject *)(self))->end - 1);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001255 else
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001256 return PyObject_GenericGetAttr(self, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001257}
1258
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001259/****************/
1260
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001261 static Py_ssize_t
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001262RangeAsItem(PyObject *self, Py_ssize_t n, PyObject *val)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001263{
1264 return RBAsItem(((RangeObject *)(self))->buf, n, val,
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001265 ((RangeObject *)(self))->start,
1266 ((RangeObject *)(self))->end,
1267 &((RangeObject *)(self))->end);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001268}
1269
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001270 static Py_ssize_t
1271RangeAsSlice(PyObject *self, Py_ssize_t lo, Py_ssize_t hi, PyObject *val)
1272{
1273 return RBAsSlice(((RangeObject *)(self))->buf, lo, hi, val,
1274 ((RangeObject *)(self))->start,
1275 ((RangeObject *)(self))->end,
1276 &((RangeObject *)(self))->end);
1277}
1278
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001279 static PyObject *
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001280RangeSubscript(PyObject *self, PyObject* idx)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001281{
Bram Moolenaardb913952012-06-29 12:54:53 +02001282 if (PyLong_Check(idx))
1283 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001284 long _idx = PyLong_AsLong(idx);
1285 return RangeItem(self,_idx);
Bram Moolenaardb913952012-06-29 12:54:53 +02001286 } else if (PySlice_Check(idx))
1287 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001288 Py_ssize_t start, stop, step, slicelen;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001289
Bram Moolenaar9e8edf62011-09-14 15:41:58 +02001290 if (PySlice_GetIndicesEx((PyObject *)idx,
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001291 ((RangeObject *)(self))->end-((RangeObject *)(self))->start+1,
1292 &start, &stop,
Bram Moolenaardb913952012-06-29 12:54:53 +02001293 &step, &slicelen) < 0)
1294 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001295 return NULL;
1296 }
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001297 return RangeSlice(self, start, stop);
Bram Moolenaardb913952012-06-29 12:54:53 +02001298 }
1299 else
1300 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001301 PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
1302 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001303 }
1304}
1305
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001306 static Py_ssize_t
1307RangeAsSubscript(PyObject *self, PyObject *idx, PyObject *val)
1308{
Bram Moolenaardb913952012-06-29 12:54:53 +02001309 if (PyLong_Check(idx))
1310 {
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001311 long n = PyLong_AsLong(idx);
1312 return RangeAsItem(self, n, val);
Bram Moolenaardb913952012-06-29 12:54:53 +02001313 } else if (PySlice_Check(idx))
1314 {
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001315 Py_ssize_t start, stop, step, slicelen;
1316
Bram Moolenaar9e8edf62011-09-14 15:41:58 +02001317 if (PySlice_GetIndicesEx((PyObject *)idx,
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001318 ((RangeObject *)(self))->end-((RangeObject *)(self))->start+1,
1319 &start, &stop,
Bram Moolenaardb913952012-06-29 12:54:53 +02001320 &step, &slicelen) < 0)
1321 {
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001322 return -1;
1323 }
1324 return RangeAsSlice(self, start, stop, val);
Bram Moolenaardb913952012-06-29 12:54:53 +02001325 }
1326 else
1327 {
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001328 PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
1329 return -1;
1330 }
1331}
1332
1333
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001334/* Buffer list object - Definitions
1335 */
1336
1337typedef struct
1338{
1339 PyObject_HEAD
Bram Moolenaarca8a4df2010-07-31 19:54:14 +02001340} BufListObject;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001341
1342static PySequenceMethods BufListAsSeq = {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001343 (lenfunc) BufListLength, /* sq_length, len(x) */
1344 (binaryfunc) 0, /* sq_concat, x+y */
1345 (ssizeargfunc) 0, /* sq_repeat, x*n */
1346 (ssizeargfunc) BufListItem, /* sq_item, x[i] */
1347 0, /* was_sq_slice, x[i:j] */
1348 (ssizeobjargproc) 0, /* sq_as_item, x[i]=v */
1349 0, /* sq_ass_slice, x[i:j]=v */
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001350 0, /* sq_contains */
1351 0, /* sq_inplace_concat */
1352 0, /* sq_inplace_repeat */
1353};
1354
1355static PyTypeObject BufListType;
1356
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001357/* Window object - Definitions
1358 */
1359
1360static struct PyMethodDef WindowMethods[] = {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001361 /* name, function, calling, documentation */
1362 { NULL, NULL, 0, NULL }
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001363};
1364
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001365static PyTypeObject WindowType;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001366
1367/* Window object - Implementation
1368 */
1369
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001370 static PyObject *
1371WindowNew(win_T *win)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001372{
1373 /* We need to handle deletion of windows underneath us.
1374 * If we add a "w_python3_ref" field to the win_T structure,
1375 * then we can get at it in win_free() in vim. We then
1376 * need to create only ONE Python object per window - if
1377 * we try to create a second, just INCREF the existing one
1378 * and return it. The (single) Python object referring to
1379 * the window is stored in "w_python3_ref".
1380 * On a win_free() we set the Python object's win_T* field
1381 * to an invalid value. We trap all uses of a window
1382 * object, and reject them if the win_T* field is invalid.
1383 */
1384
1385 WindowObject *self;
1386
1387 if (win->w_python3_ref)
1388 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001389 self = win->w_python3_ref;
1390 Py_INCREF(self);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001391 }
1392 else
1393 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001394 self = PyObject_NEW(WindowObject, &WindowType);
1395 if (self == NULL)
1396 return NULL;
1397 self->win = win;
1398 win->w_python3_ref = self;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001399 }
1400
1401 return (PyObject *)(self);
1402}
1403
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001404 static void
1405WindowDestructor(PyObject *self)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001406{
1407 WindowObject *this = (WindowObject *)(self);
1408
1409 if (this->win && this->win != INVALID_WINDOW_VALUE)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001410 this->win->w_python3_ref = NULL;
Bram Moolenaar19e60942011-06-19 00:27:51 +02001411
1412 Py_TYPE(self)->tp_free((PyObject*)self);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001413}
1414
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001415 static PyObject *
1416WindowGetattro(PyObject *self, PyObject *nameobj)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001417{
1418 WindowObject *this = (WindowObject *)(self);
1419
1420 char *name = "";
1421 if (PyUnicode_Check(nameobj))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001422 name = _PyUnicode_AsString(nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001423
1424
1425 if (CheckWindow(this))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001426 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001427
1428 if (strcmp(name, "buffer") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001429 return (PyObject *)BufferNew(this->win->w_buffer);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001430 else if (strcmp(name, "cursor") == 0)
1431 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001432 pos_T *pos = &this->win->w_cursor;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001433
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001434 return Py_BuildValue("(ll)", (long)(pos->lnum), (long)(pos->col));
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001435 }
1436 else if (strcmp(name, "height") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001437 return Py_BuildValue("l", (long)(this->win->w_height));
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001438#ifdef FEAT_VERTSPLIT
1439 else if (strcmp(name, "width") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001440 return Py_BuildValue("l", (long)(W_WIDTH(this->win)));
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001441#endif
1442 else if (strcmp(name,"__members__") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001443 return Py_BuildValue("[sss]", "buffer", "cursor", "height");
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001444 else
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001445 return PyObject_GenericGetAttr(self, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001446}
1447
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001448 static int
1449WindowSetattro(PyObject *self, PyObject *nameobj, PyObject *val)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001450{
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001451 char *name = "";
Bram Moolenaarca8a4df2010-07-31 19:54:14 +02001452
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001453 if (PyUnicode_Check(nameobj))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001454 name = _PyUnicode_AsString(nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001455
Bram Moolenaarca8a4df2010-07-31 19:54:14 +02001456 return WindowSetattr(self, name, val);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001457}
1458
1459/* Window list object - Definitions
1460 */
1461
1462typedef struct
1463{
1464 PyObject_HEAD
1465}
1466WinListObject;
1467
1468static PySequenceMethods WinListAsSeq = {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001469 (lenfunc) WinListLength, /* sq_length, len(x) */
1470 (binaryfunc) 0, /* sq_concat, x+y */
1471 (ssizeargfunc) 0, /* sq_repeat, x*n */
1472 (ssizeargfunc) WinListItem, /* sq_item, x[i] */
1473 0, /* sq_slice, x[i:j] */
1474 (ssizeobjargproc)0, /* sq_as_item, x[i]=v */
1475 0, /* sq_ass_slice, x[i:j]=v */
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001476 0, /* sq_contains */
1477 0, /* sq_inplace_concat */
1478 0, /* sq_inplace_repeat */
1479};
1480
1481static PyTypeObject WinListType;
1482
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001483/* Current items object - Definitions
1484 */
1485
1486typedef struct
1487{
1488 PyObject_HEAD
Bram Moolenaarca8a4df2010-07-31 19:54:14 +02001489} CurrentObject;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001490
1491static PyTypeObject CurrentType;
1492
1493/* Current items object - Implementation
1494 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001495 static PyObject *
1496CurrentGetattro(PyObject *self UNUSED, PyObject *nameobj)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001497{
1498 char *name = "";
1499 if (PyUnicode_Check(nameobj))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001500 name = _PyUnicode_AsString(nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001501
1502 if (strcmp(name, "buffer") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001503 return (PyObject *)BufferNew(curbuf);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001504 else if (strcmp(name, "window") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001505 return (PyObject *)WindowNew(curwin);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001506 else if (strcmp(name, "line") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001507 return GetBufferLine(curbuf, (Py_ssize_t)curwin->w_cursor.lnum);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001508 else if (strcmp(name, "range") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001509 return RangeNew(curbuf, RangeStart, RangeEnd);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001510 else if (strcmp(name,"__members__") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001511 return Py_BuildValue("[ssss]", "buffer", "window", "line", "range");
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001512 else
1513 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001514 PyErr_SetString(PyExc_AttributeError, name);
1515 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001516 }
1517}
1518
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001519 static int
1520CurrentSetattro(PyObject *self UNUSED, PyObject *nameobj, PyObject *value)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001521{
1522 char *name = "";
1523 if (PyUnicode_Check(nameobj))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001524 name = _PyUnicode_AsString(nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001525
1526 if (strcmp(name, "line") == 0)
1527 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001528 if (SetBufferLine(curbuf, (Py_ssize_t)curwin->w_cursor.lnum, value, NULL) == FAIL)
1529 return -1;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001530
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001531 return 0;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001532 }
1533 else
1534 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001535 PyErr_SetString(PyExc_AttributeError, name);
1536 return -1;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001537 }
1538}
1539
Bram Moolenaardb913952012-06-29 12:54:53 +02001540/* Dictionary object - Definitions
1541 */
1542
1543static PyInt DictionaryLength(PyObject *);
1544
1545static PyMappingMethods DictionaryAsMapping = {
1546 /* mp_length */ (lenfunc) DictionaryLength,
1547 /* mp_subscript */ (binaryfunc) DictionaryItem,
1548 /* mp_ass_subscript */ (objobjargproc) DictionaryAssItem,
1549};
1550
1551static PyTypeObject DictionaryType;
1552
1553 static void
1554DictionaryDestructor(PyObject *self)
1555{
1556 DictionaryObject *this = (DictionaryObject *)(self);
1557
1558 pyll_remove(&this->ref, &lastdict);
1559 dict_unref(this->dict);
1560
1561 Py_TYPE(self)->tp_free((PyObject*)self);
1562}
1563
1564/* List object - Definitions
1565 */
1566
1567static PyInt ListLength(PyObject *);
1568static PyObject *ListItem(PyObject *, Py_ssize_t);
1569
1570static PySequenceMethods ListAsSeq = {
1571 (lenfunc) ListLength, /* sq_length, len(x) */
1572 (binaryfunc) 0, /* RangeConcat, sq_concat, x+y */
1573 (ssizeargfunc) 0, /* RangeRepeat, sq_repeat, x*n */
1574 (ssizeargfunc) ListItem, /* sq_item, x[i] */
1575 (void *) 0, /* was_sq_slice, x[i:j] */
1576 (ssizeobjargproc) ListAssItem, /* sq_as_item, x[i]=v */
1577 (void *) 0, /* was_sq_ass_slice, x[i:j]=v */
1578 0, /* sq_contains */
1579 (binaryfunc) ListConcatInPlace,/* sq_inplace_concat */
1580 0, /* sq_inplace_repeat */
1581};
1582
1583static PyObject *ListSubscript(PyObject *, PyObject *);
1584static Py_ssize_t ListAsSubscript(PyObject *, PyObject *, PyObject *);
1585
1586static PyMappingMethods ListAsMapping = {
1587 /* mp_length */ (lenfunc) ListLength,
1588 /* mp_subscript */ (binaryfunc) ListSubscript,
1589 /* mp_ass_subscript */ (objobjargproc) ListAsSubscript,
1590};
1591
1592static PyTypeObject ListType;
1593
1594 static PyObject *
1595ListSubscript(PyObject *self, PyObject* idxObject)
1596{
1597 if (PyLong_Check(idxObject))
1598 {
1599 long idx = PyLong_AsLong(idxObject);
1600 return ListItem(self, idx);
1601 }
1602 else if (PySlice_Check(idxObject))
1603 {
1604 Py_ssize_t start, stop, step, slicelen;
1605
1606 if (PySlice_GetIndicesEx(idxObject, ListLength(self), &start, &stop,
1607 &step, &slicelen) < 0)
1608 return NULL;
1609 return ListSlice(self, start, stop);
1610 }
1611 else
1612 {
1613 PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
1614 return NULL;
1615 }
1616}
1617
1618 static Py_ssize_t
1619ListAsSubscript(PyObject *self, PyObject *idxObject, PyObject *obj)
1620{
1621 if (PyLong_Check(idxObject))
1622 {
1623 long idx = PyLong_AsLong(idxObject);
1624 return ListAssItem(self, idx, obj);
1625 }
1626 else if (PySlice_Check(idxObject))
1627 {
1628 Py_ssize_t start, stop, step, slicelen;
1629
1630 if (PySlice_GetIndicesEx(idxObject, ListLength(self), &start, &stop,
1631 &step, &slicelen) < 0)
1632 return -1;
1633 return ListAssSlice(self, start, stop, obj);
1634 }
1635 else
1636 {
1637 PyErr_SetString(PyExc_IndexError, "Index must be int or slice");
1638 return -1;
1639 }
1640}
1641
1642 static void
1643ListDestructor(PyObject *self)
1644{
1645 ListObject *this = (ListObject *)(self);
1646
1647 pyll_remove(&this->ref, &lastlist);
1648 list_unref(this->list);
1649
1650 Py_TYPE(self)->tp_free((PyObject*)self);
1651}
1652
1653/* Function object - Definitions
1654 */
1655
1656 static void
1657FunctionDestructor(PyObject *self)
1658{
1659 FunctionObject *this = (FunctionObject *) (self);
1660
1661 func_unref(this->name);
1662 PyMem_Del(this->name);
1663
1664 Py_TYPE(self)->tp_free((PyObject*)self);
1665}
1666
1667 static PyObject *
1668FunctionGetattro(PyObject *self, PyObject *nameobj)
1669{
1670 FunctionObject *this = (FunctionObject *)(self);
1671 char *name = "";
1672 if (PyUnicode_Check(nameobj))
1673 name = _PyUnicode_AsString(nameobj);
1674
1675 if (strcmp(name, "name") == 0)
1676 return PyUnicode_FromString((char *)(this->name));
1677
1678 return PyObject_GenericGetAttr(self, nameobj);
1679}
1680
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001681/* External interface
1682 */
1683
1684 void
1685python3_buffer_free(buf_T *buf)
1686{
1687 if (buf->b_python3_ref != NULL)
1688 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001689 BufferObject *bp = buf->b_python3_ref;
1690 bp->buf = INVALID_BUFFER_VALUE;
1691 buf->b_python3_ref = NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001692 }
1693}
1694
1695#if defined(FEAT_WINDOWS) || defined(PROTO)
1696 void
1697python3_window_free(win_T *win)
1698{
1699 if (win->w_python3_ref != NULL)
1700 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001701 WindowObject *wp = win->w_python3_ref;
1702 wp->win = INVALID_WINDOW_VALUE;
1703 win->w_python3_ref = NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001704 }
1705}
1706#endif
1707
1708static BufListObject TheBufferList =
1709{
1710 PyObject_HEAD_INIT(&BufListType)
1711};
1712
1713static WinListObject TheWindowList =
1714{
1715 PyObject_HEAD_INIT(&WinListType)
1716};
1717
1718static CurrentObject TheCurrent =
1719{
1720 PyObject_HEAD_INIT(&CurrentType)
1721};
1722
1723PyDoc_STRVAR(vim_module_doc,"vim python interface\n");
1724
1725static struct PyModuleDef vimmodule;
1726
Bram Moolenaar69154f22010-07-18 21:42:34 +02001727#ifndef PROTO
1728PyMODINIT_FUNC Py3Init_vim(void)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001729{
1730 PyObject *mod;
1731 /* The special value is removed from sys.path in Python3_Init(). */
1732 static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL};
1733
1734 PyType_Ready(&BufferType);
1735 PyType_Ready(&RangeType);
1736 PyType_Ready(&WindowType);
1737 PyType_Ready(&BufListType);
1738 PyType_Ready(&WinListType);
1739 PyType_Ready(&CurrentType);
Bram Moolenaardb913952012-06-29 12:54:53 +02001740 PyType_Ready(&DictionaryType);
1741 PyType_Ready(&ListType);
1742 PyType_Ready(&FunctionType);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001743
1744 /* Set sys.argv[] to avoid a crash in warn(). */
1745 PySys_SetArgv(1, argv);
1746
1747 mod = PyModule_Create(&vimmodule);
Bram Moolenaar19e60942011-06-19 00:27:51 +02001748 if (mod == NULL)
1749 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001750
Bram Moolenaar19e60942011-06-19 00:27:51 +02001751 VimError = PyErr_NewException("vim.error", NULL, NULL);
1752 Py_INCREF(VimError);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001753
1754 PyModule_AddObject(mod, "error", VimError);
1755 Py_INCREF((PyObject *)(void *)&TheBufferList);
1756 PyModule_AddObject(mod, "buffers", (PyObject *)(void *)&TheBufferList);
1757 Py_INCREF((PyObject *)(void *)&TheCurrent);
1758 PyModule_AddObject(mod, "current", (PyObject *)(void *)&TheCurrent);
1759 Py_INCREF((PyObject *)(void *)&TheWindowList);
1760 PyModule_AddObject(mod, "windows", (PyObject *)(void *)&TheWindowList);
1761
1762 if (PyErr_Occurred())
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001763 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001764
1765 return mod;
1766}
Bram Moolenaar69154f22010-07-18 21:42:34 +02001767#endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001768
1769/*************************************************************************
1770 * 4. Utility functions for handling the interface between Vim and Python.
1771 */
1772
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001773/* Convert a Vim line into a Python string.
1774 * All internal newlines are replaced by null characters.
1775 *
1776 * On errors, the Python exception data is set, and NULL is returned.
1777 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001778 static PyObject *
1779LineToString(const char *str)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001780{
1781 PyObject *result;
1782 Py_ssize_t len = strlen(str);
1783 char *tmp,*p;
1784
1785 tmp = (char *)alloc((unsigned)(len+1));
1786 p = tmp;
1787 if (p == NULL)
1788 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001789 PyErr_NoMemory();
1790 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001791 }
1792
1793 while (*str)
1794 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001795 if (*str == '\n')
1796 *p = '\0';
1797 else
1798 *p = *str;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001799
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001800 ++p;
1801 ++str;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001802 }
1803 *p = '\0';
1804
Bram Moolenaar3d64a312011-07-15 15:54:44 +02001805 result = PyUnicode_Decode(tmp, len, (char *)ENC_OPT, CODEC_ERROR_HANDLER);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001806
1807 vim_free(tmp);
1808 return result;
1809}
1810
Bram Moolenaardb913952012-06-29 12:54:53 +02001811 void
1812do_py3eval (char_u *str, typval_T *rettv)
1813{
1814 DoPy3Command(NULL, (char *) str, rettv);
1815 switch(rettv->v_type)
1816 {
1817 case VAR_DICT: ++rettv->vval.v_dict->dv_refcount; break;
1818 case VAR_LIST: ++rettv->vval.v_list->lv_refcount; break;
1819 case VAR_FUNC: func_ref(rettv->vval.v_string); break;
Bram Moolenaar77fceb82012-09-05 18:54:48 +02001820 case VAR_UNKNOWN:
1821 rettv->v_type = VAR_NUMBER;
1822 rettv->vval.v_number = 0;
1823 break;
Bram Moolenaardb913952012-06-29 12:54:53 +02001824 }
1825}
1826
1827 void
1828set_ref_in_python3 (int copyID)
1829{
1830 set_ref_in_py(copyID);
1831}
1832
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001833 static void
1834init_structs(void)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001835{
1836 vim_memset(&OutputType, 0, sizeof(OutputType));
1837 OutputType.tp_name = "vim.message";
1838 OutputType.tp_basicsize = sizeof(OutputObject);
1839 OutputType.tp_getattro = OutputGetattro;
1840 OutputType.tp_setattro = OutputSetattro;
1841 OutputType.tp_flags = Py_TPFLAGS_DEFAULT;
1842 OutputType.tp_doc = "vim message object";
1843 OutputType.tp_methods = OutputMethods;
1844 OutputType.tp_alloc = call_PyType_GenericAlloc;
1845 OutputType.tp_new = call_PyType_GenericNew;
1846 OutputType.tp_free = call_PyObject_Free;
1847
1848 vim_memset(&BufferType, 0, sizeof(BufferType));
1849 BufferType.tp_name = "vim.buffer";
1850 BufferType.tp_basicsize = sizeof(BufferType);
1851 BufferType.tp_dealloc = BufferDestructor;
1852 BufferType.tp_repr = BufferRepr;
1853 BufferType.tp_as_sequence = &BufferAsSeq;
1854 BufferType.tp_as_mapping = &BufferAsMapping;
1855 BufferType.tp_getattro = BufferGetattro;
1856 BufferType.tp_flags = Py_TPFLAGS_DEFAULT;
1857 BufferType.tp_doc = "vim buffer object";
1858 BufferType.tp_methods = BufferMethods;
1859 BufferType.tp_alloc = call_PyType_GenericAlloc;
1860 BufferType.tp_new = call_PyType_GenericNew;
1861 BufferType.tp_free = call_PyObject_Free;
1862
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001863 vim_memset(&WindowType, 0, sizeof(WindowType));
1864 WindowType.tp_name = "vim.window";
1865 WindowType.tp_basicsize = sizeof(WindowObject);
1866 WindowType.tp_dealloc = WindowDestructor;
1867 WindowType.tp_repr = WindowRepr;
1868 WindowType.tp_getattro = WindowGetattro;
1869 WindowType.tp_setattro = WindowSetattro;
1870 WindowType.tp_flags = Py_TPFLAGS_DEFAULT;
1871 WindowType.tp_doc = "vim Window object";
1872 WindowType.tp_methods = WindowMethods;
1873 WindowType.tp_alloc = call_PyType_GenericAlloc;
1874 WindowType.tp_new = call_PyType_GenericNew;
1875 WindowType.tp_free = call_PyObject_Free;
1876
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001877 vim_memset(&BufListType, 0, sizeof(BufListType));
1878 BufListType.tp_name = "vim.bufferlist";
1879 BufListType.tp_basicsize = sizeof(BufListObject);
1880 BufListType.tp_as_sequence = &BufListAsSeq;
1881 BufListType.tp_flags = Py_TPFLAGS_DEFAULT;
1882 BufferType.tp_doc = "vim buffer list";
1883
1884 vim_memset(&WinListType, 0, sizeof(WinListType));
1885 WinListType.tp_name = "vim.windowlist";
1886 WinListType.tp_basicsize = sizeof(WinListType);
1887 WinListType.tp_as_sequence = &WinListAsSeq;
1888 WinListType.tp_flags = Py_TPFLAGS_DEFAULT;
1889 WinListType.tp_doc = "vim window list";
1890
1891 vim_memset(&RangeType, 0, sizeof(RangeType));
1892 RangeType.tp_name = "vim.range";
1893 RangeType.tp_basicsize = sizeof(RangeObject);
1894 RangeType.tp_dealloc = RangeDestructor;
1895 RangeType.tp_repr = RangeRepr;
1896 RangeType.tp_as_sequence = &RangeAsSeq;
1897 RangeType.tp_as_mapping = &RangeAsMapping;
1898 RangeType.tp_getattro = RangeGetattro;
1899 RangeType.tp_flags = Py_TPFLAGS_DEFAULT;
1900 RangeType.tp_doc = "vim Range object";
1901 RangeType.tp_methods = RangeMethods;
1902 RangeType.tp_alloc = call_PyType_GenericAlloc;
1903 RangeType.tp_new = call_PyType_GenericNew;
1904 RangeType.tp_free = call_PyObject_Free;
1905
1906 vim_memset(&CurrentType, 0, sizeof(CurrentType));
1907 CurrentType.tp_name = "vim.currentdata";
1908 CurrentType.tp_basicsize = sizeof(CurrentObject);
1909 CurrentType.tp_getattro = CurrentGetattro;
1910 CurrentType.tp_setattro = CurrentSetattro;
1911 CurrentType.tp_flags = Py_TPFLAGS_DEFAULT;
1912 CurrentType.tp_doc = "vim current object";
1913
Bram Moolenaardb913952012-06-29 12:54:53 +02001914 vim_memset(&DictionaryType, 0, sizeof(DictionaryType));
1915 DictionaryType.tp_name = "vim.dictionary";
1916 DictionaryType.tp_basicsize = sizeof(DictionaryObject);
1917 DictionaryType.tp_dealloc = DictionaryDestructor;
1918 DictionaryType.tp_as_mapping = &DictionaryAsMapping;
1919 DictionaryType.tp_flags = Py_TPFLAGS_DEFAULT;
1920 DictionaryType.tp_doc = "dictionary pushing modifications to vim structure";
1921 DictionaryType.tp_methods = DictionaryMethods;
1922
1923 vim_memset(&ListType, 0, sizeof(ListType));
1924 ListType.tp_name = "vim.list";
1925 ListType.tp_dealloc = ListDestructor;
1926 ListType.tp_basicsize = sizeof(ListObject);
1927 ListType.tp_as_sequence = &ListAsSeq;
1928 ListType.tp_as_mapping = &ListAsMapping;
1929 ListType.tp_flags = Py_TPFLAGS_DEFAULT;
1930 ListType.tp_doc = "list pushing modifications to vim structure";
1931 ListType.tp_methods = ListMethods;
1932
1933 vim_memset(&FunctionType, 0, sizeof(FunctionType));
1934 FunctionType.tp_name = "vim.list";
1935 FunctionType.tp_basicsize = sizeof(FunctionObject);
1936 FunctionType.tp_getattro = FunctionGetattro;
1937 FunctionType.tp_dealloc = FunctionDestructor;
1938 FunctionType.tp_call = FunctionCall;
1939 FunctionType.tp_flags = Py_TPFLAGS_DEFAULT;
1940 FunctionType.tp_doc = "object that calls vim function";
1941 FunctionType.tp_methods = FunctionMethods;
1942
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001943 vim_memset(&vimmodule, 0, sizeof(vimmodule));
1944 vimmodule.m_name = "vim";
1945 vimmodule.m_doc = vim_module_doc;
1946 vimmodule.m_size = -1;
1947 vimmodule.m_methods = VimMethods;
1948}