blob: 06c02ce67c097b7e6193a56b0f2dea11435fca3d [file] [log] [blame]
Bram Moolenaaredf3f972016-08-29 22:49:24 +02001/* vi:set ts=8 sts=4 sw=4 noet:
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02002 *
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 Moolenaar2ab2e862019-12-04 21:24:53 +010025// uncomment this if used with the debug version of python
26// #define Py_DEBUG
27// Note: most of time you can add -DPy_DEBUG to CFLAGS in place of uncommenting
28// uncomment this if used with the debug version of python, but without its
29// allocator
30// #define Py_DEBUG_NO_PYMALLOC
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020031
32#include "vim.h"
33
34#include <limits.h>
35
Bram Moolenaar4f974752019-02-17 17:44:42 +010036#if defined(MSWIN) && defined(HAVE_FCNTL_H)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020037# undef HAVE_FCNTL_H
38#endif
39
40#ifdef _DEBUG
41# undef _DEBUG
42#endif
43
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020044#ifdef F_BLANK
45# undef F_BLANK
46#endif
47
ichizok6c3d3e62022-11-04 22:38:11 +000048#ifdef HAVE_DUP
49# undef HAVE_DUP
50#endif
Bram Moolenaar6aa2cd42016-02-16 15:06:59 +010051#ifdef HAVE_STRFTIME
52# undef HAVE_STRFTIME
53#endif
54#ifdef HAVE_STRING_H
55# undef HAVE_STRING_H
56#endif
57#ifdef HAVE_PUTENV
58# undef HAVE_PUTENV
59#endif
Bram Moolenaar6df6f472010-07-18 18:04:50 +020060#ifdef HAVE_STDARG_H
Bram Moolenaar2ab2e862019-12-04 21:24:53 +010061# undef HAVE_STDARG_H // Python's config.h defines it as well.
Bram Moolenaar6df6f472010-07-18 18:04:50 +020062#endif
Bram Moolenaar2ab2e862019-12-04 21:24:53 +010063#ifdef _POSIX_C_SOURCE // defined in feature.h
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020064# undef _POSIX_C_SOURCE
65#endif
Bram Moolenaar6df6f472010-07-18 18:04:50 +020066#ifdef _XOPEN_SOURCE
Bram Moolenaar2ab2e862019-12-04 21:24:53 +010067# undef _XOPEN_SOURCE // pyconfig.h defines it as well.
Bram Moolenaar6df6f472010-07-18 18:04:50 +020068#endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020069
Bram Moolenaar0bdda372013-06-10 18:36:24 +020070#define PY_SSIZE_T_CLEAN
71
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020072#include <Python.h>
Bram Moolenaar0bdda372013-06-10 18:36:24 +020073
Bram Moolenaar2ab2e862019-12-04 21:24:53 +010074#undef main // Defined in python.h - aargh
75#undef HAVE_FCNTL_H // Clash with os_win32.h
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +020076
Bram Moolenaar2ab2e862019-12-04 21:24:53 +010077// The "surrogateescape" error handler is new in Python 3.1
Bram Moolenaar3d64a312011-07-15 15:54:44 +020078#if PY_VERSION_HEX >= 0x030100f0
79# define CODEC_ERROR_HANDLER "surrogateescape"
80#else
81# define CODEC_ERROR_HANDLER NULL
82#endif
83
Philip H5a5f17f2022-11-05 14:05:31 +000084// Suppress Python 3.11 depreciations to see useful warnings
Philip H422b9dc2023-08-11 22:38:48 +020085#ifdef __GNUC__
86# pragma GCC diagnostic push
87# pragma GCC diagnostic ignored "-Wdeprecated-declarations"
Philip H5a5f17f2022-11-05 14:05:31 +000088#endif
89
Bram Moolenaar2ab2e862019-12-04 21:24:53 +010090// Python 3 does not support CObjects, always use Capsules
Bram Moolenaar2afa3232012-06-29 16:28:28 +020091#define PY_USE_CAPSULE
92
Bram Moolenaar2e2f52a2020-12-21 16:03:02 +010093#define ERRORS_DECODE_ARG CODEC_ERROR_HANDLER
94#define ERRORS_ENCODE_ARG ERRORS_DECODE_ARG
95
Bram Moolenaar170bf1a2010-07-24 23:51:45 +020096#define PyInt Py_ssize_t
Bram Moolenaar32ac8cd2013-07-03 18:49:17 +020097#ifndef PyString_Check
98# define PyString_Check(obj) PyUnicode_Check(obj)
99#endif
Bram Moolenaare0324612013-07-09 17:30:55 +0200100#define PyString_FromString(repr) \
Bram Moolenaar2e2f52a2020-12-21 16:03:02 +0100101 PyUnicode_Decode(repr, STRLEN(repr), ENC_OPT, ERRORS_DECODE_ARG)
Bram Moolenaar1a3b5692013-05-30 12:40:39 +0200102#define PyString_FromFormat PyUnicode_FromFormat
Bram Moolenaar32ac8cd2013-07-03 18:49:17 +0200103#ifndef PyInt_Check
104# define PyInt_Check(obj) PyLong_Check(obj)
105#endif
Bram Moolenaar77045652012-09-21 13:46:06 +0200106#define PyInt_FromLong(i) PyLong_FromLong(i)
107#define PyInt_AsLong(obj) PyLong_AsLong(obj)
Bram Moolenaar4d1da492013-04-24 13:39:15 +0200108#define Py_ssize_t_fmt "n"
Bram Moolenaara9922d62013-05-30 13:01:18 +0200109#define Py_bytes_fmt "y"
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200110
Bram Moolenaar063a46b2014-01-14 16:36:51 +0100111#define PyIntArgFunc ssizeargfunc
112#define PyIntObjArgProc ssizeobjargproc
113
Bram Moolenaar922a4662014-03-30 16:11:43 +0200114/*
115 * PySlice_GetIndicesEx(): first argument type changed from PySliceObject
116 * to PyObject in Python 3.2 or later.
117 */
118#if PY_VERSION_HEX >= 0x030200f0
119typedef PyObject PySliceObject_T;
120#else
121typedef PySliceObject PySliceObject_T;
122#endif
123
Bram Moolenaar63ff72a2022-02-07 13:54:01 +0000124#ifndef MSWIN
125# define HINSTANCE void *
126#endif
127#if defined(DYNAMIC_PYTHON3) || defined(MSWIN)
128static HINSTANCE hinstPy3 = 0; // Instance of python.dll
129#endif
130
Bram Moolenaar0c1f3f42011-02-25 15:18:50 +0100131#if defined(DYNAMIC_PYTHON3) || defined(PROTO)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200132
Bram Moolenaar4f974752019-02-17 17:44:42 +0100133# ifndef MSWIN
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200134# include <dlfcn.h>
135# define FARPROC void*
Bram Moolenaar644d37b2010-11-16 19:26:02 +0100136# if defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200137# define load_dll(n) dlopen((n), RTLD_LAZY)
138# else
139# define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
140# endif
141# define close_dll dlclose
142# define symbol_from_dll dlsym
Martin Tournoij1a3e5742021-07-24 13:57:29 +0200143# define load_dll_error dlerror
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200144# else
Bram Moolenaarebbcb822010-10-23 14:02:54 +0200145# define load_dll vimLoadLib
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200146# define close_dll FreeLibrary
147# define symbol_from_dll GetProcAddress
Martin Tournoij1a3e5742021-07-24 13:57:29 +0200148# define load_dll_error GetWin32Error
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200149# endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200150/*
151 * Wrapper defines
152 */
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200153# undef PyArg_Parse
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200154# define PyArg_Parse py3_PyArg_Parse
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200155# undef PyArg_ParseTuple
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200156# define PyArg_ParseTuple py3_PyArg_ParseTuple
Bram Moolenaar19e60942011-06-19 00:27:51 +0200157# define PyMem_Free py3_PyMem_Free
Bram Moolenaardb913952012-06-29 12:54:53 +0200158# define PyMem_Malloc py3_PyMem_Malloc
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200159# define PyDict_SetItemString py3_PyDict_SetItemString
160# define PyErr_BadArgument py3_PyErr_BadArgument
161# define PyErr_Clear py3_PyErr_Clear
Bram Moolenaarc476e522013-06-23 13:46:40 +0200162# define PyErr_Format py3_PyErr_Format
Bram Moolenaar4d369872013-02-20 16:09:43 +0100163# define PyErr_PrintEx py3_PyErr_PrintEx
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200164# define PyErr_NoMemory py3_PyErr_NoMemory
165# define PyErr_Occurred py3_PyErr_Occurred
166# define PyErr_SetNone py3_PyErr_SetNone
167# define PyErr_SetString py3_PyErr_SetString
Bram Moolenaar4d188da2013-05-15 15:35:09 +0200168# define PyErr_SetObject py3_PyErr_SetObject
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200169# define PyErr_ExceptionMatches py3_PyErr_ExceptionMatches
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200170# define PyEval_InitThreads py3_PyEval_InitThreads
171# define PyEval_RestoreThread py3_PyEval_RestoreThread
172# define PyEval_SaveThread py3_PyEval_SaveThread
173# define PyGILState_Ensure py3_PyGILState_Ensure
174# define PyGILState_Release py3_PyGILState_Release
175# define PyLong_AsLong py3_PyLong_AsLong
176# define PyLong_FromLong py3_PyLong_FromLong
177# define PyList_GetItem py3_PyList_GetItem
178# define PyList_Append py3_PyList_Append
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200179# define PyList_Insert py3_PyList_Insert
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200180# define PyList_New py3_PyList_New
181# define PyList_SetItem py3_PyList_SetItem
182# define PyList_Size py3_PyList_Size
Bram Moolenaardb913952012-06-29 12:54:53 +0200183# define PySequence_Check py3_PySequence_Check
184# define PySequence_Size py3_PySequence_Size
185# define PySequence_GetItem py3_PySequence_GetItem
Bram Moolenaara9922d62013-05-30 13:01:18 +0200186# define PySequence_Fast py3_PySequence_Fast
Bram Moolenaardb913952012-06-29 12:54:53 +0200187# define PyTuple_Size py3_PyTuple_Size
188# define PyTuple_GetItem py3_PyTuple_GetItem
Bram Moolenaar3b48b112018-07-04 22:03:25 +0200189# if PY_VERSION_HEX >= 0x030601f0
190# define PySlice_AdjustIndices py3_PySlice_AdjustIndices
191# define PySlice_Unpack py3_PySlice_Unpack
192# endif
193# undef PySlice_GetIndicesEx
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200194# define PySlice_GetIndicesEx py3_PySlice_GetIndicesEx
195# define PyImport_ImportModule py3_PyImport_ImportModule
196# define PyObject_Init py3__PyObject_Init
197# define PyDict_New py3_PyDict_New
198# define PyDict_GetItemString py3_PyDict_GetItemString
Bram Moolenaardb913952012-06-29 12:54:53 +0200199# define PyDict_Next py3_PyDict_Next
200# define PyMapping_Check py3_PyMapping_Check
Bram Moolenaar32ac8cd2013-07-03 18:49:17 +0200201# ifndef PyMapping_Keys
202# define PyMapping_Keys py3_PyMapping_Keys
203# endif
Zdenek Dohnal90478f32021-06-14 15:08:30 +0200204# if PY_VERSION_HEX >= 0x030a00b2
205# define PyIter_Check py3_PyIter_Check
206# endif
Bram Moolenaardb913952012-06-29 12:54:53 +0200207# define PyIter_Next py3_PyIter_Next
208# define PyObject_GetIter py3_PyObject_GetIter
Bram Moolenaar141be8a2013-06-23 14:16:57 +0200209# define PyObject_Repr py3_PyObject_Repr
Bram Moolenaarbcb40972013-05-30 13:22:13 +0200210# define PyObject_GetItem py3_PyObject_GetItem
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200211# define PyObject_IsTrue py3_PyObject_IsTrue
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200212# define PyModule_GetDict py3_PyModule_GetDict
213#undef PyRun_SimpleString
214# define PyRun_SimpleString py3_PyRun_SimpleString
Bram Moolenaardb913952012-06-29 12:54:53 +0200215#undef PyRun_String
216# define PyRun_String py3_PyRun_String
Bram Moolenaar3dab2802013-05-15 18:28:13 +0200217# define PyObject_GetAttrString py3_PyObject_GetAttrString
Bram Moolenaara9922d62013-05-30 13:01:18 +0200218# define PyObject_HasAttrString py3_PyObject_HasAttrString
Bram Moolenaar3dab2802013-05-15 18:28:13 +0200219# define PyObject_SetAttrString py3_PyObject_SetAttrString
220# define PyObject_CallFunctionObjArgs py3_PyObject_CallFunctionObjArgs
Bram Moolenaar81c40c52013-06-12 14:41:04 +0200221# define _PyObject_CallFunction_SizeT py3__PyObject_CallFunction_SizeT
Bram Moolenaarf4258302013-06-02 18:20:17 +0200222# define PyObject_Call py3_PyObject_Call
Bram Moolenaar3dab2802013-05-15 18:28:13 +0200223# define PyEval_GetLocals py3_PyEval_GetLocals
224# define PyEval_GetGlobals py3_PyEval_GetGlobals
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200225# define PySys_SetObject py3_PySys_SetObject
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200226# define PySys_GetObject py3_PySys_GetObject
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200227# define PySys_SetArgv py3_PySys_SetArgv
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200228# define PyType_Ready py3_PyType_Ready
Bram Moolenaaree1b9312020-07-16 22:15:53 +0200229# if PY_VERSION_HEX >= 0x030900b0
230# define PyType_GetFlags py3_PyType_GetFlags
231# endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200232#undef Py_BuildValue
233# define Py_BuildValue py3_Py_BuildValue
Bram Moolenaar644d37b2010-11-16 19:26:02 +0100234# define Py_SetPythonHome py3_Py_SetPythonHome
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200235# define Py_Initialize py3_Py_Initialize
236# define Py_Finalize py3_Py_Finalize
237# define Py_IsInitialized py3_Py_IsInitialized
238# define _Py_NoneStruct (*py3__Py_NoneStruct)
Bram Moolenaar66b79852012-09-21 14:00:35 +0200239# define _Py_FalseStruct (*py3__Py_FalseStruct)
240# define _Py_TrueStruct (*py3__Py_TrueStruct)
Bram Moolenaardb913952012-06-29 12:54:53 +0200241# define _PyObject_NextNotImplemented (*py3__PyObject_NextNotImplemented)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200242# define PyModule_AddObject py3_PyModule_AddObject
243# define PyImport_AppendInittab py3_PyImport_AppendInittab
Bram Moolenaar3dab2802013-05-15 18:28:13 +0200244# define PyImport_AddModule py3_PyImport_AddModule
Bram Moolenaar7bc4f932012-10-14 03:22:56 +0200245# if PY_VERSION_HEX >= 0x030300f0
246# undef _PyUnicode_AsString
Bram Moolenaar9c9cbf12012-10-23 05:17:37 +0200247# define _PyUnicode_AsString py3_PyUnicode_AsUTF8
Bram Moolenaar7bc4f932012-10-14 03:22:56 +0200248# else
249# define _PyUnicode_AsString py3__PyUnicode_AsString
250# endif
Bram Moolenaar19e60942011-06-19 00:27:51 +0200251# undef PyUnicode_AsEncodedString
252# define PyUnicode_AsEncodedString py3_PyUnicode_AsEncodedString
253# undef PyBytes_AsString
254# define PyBytes_AsString py3_PyBytes_AsString
Bram Moolenaar32ac8cd2013-07-03 18:49:17 +0200255# ifndef PyBytes_AsStringAndSize
256# define PyBytes_AsStringAndSize py3_PyBytes_AsStringAndSize
257# endif
Bram Moolenaardb913952012-06-29 12:54:53 +0200258# undef PyBytes_FromString
259# define PyBytes_FromString py3_PyBytes_FromString
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100260# undef PyBytes_FromStringAndSize
261# define PyBytes_FromStringAndSize py3_PyBytes_FromStringAndSize
Bram Moolenaaree1b9312020-07-16 22:15:53 +0200262# if defined(Py_DEBUG) || PY_VERSION_HEX >= 0x030900b0
263# define _Py_Dealloc py3__Py_Dealloc
264# endif
Bram Moolenaardb913952012-06-29 12:54:53 +0200265# define PyFloat_FromDouble py3_PyFloat_FromDouble
266# define PyFloat_AsDouble py3_PyFloat_AsDouble
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200267# define PyObject_GenericGetAttr py3_PyObject_GenericGetAttr
Bram Moolenaar66b79852012-09-21 14:00:35 +0200268# define PyType_Type (*py3_PyType_Type)
Bram Moolenaard4a8c982018-05-15 22:31:18 +0200269# define PyStdPrinter_Type (*py3_PyStdPrinter_Type)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200270# define PySlice_Type (*py3_PySlice_Type)
Bram Moolenaardb913952012-06-29 12:54:53 +0200271# define PyFloat_Type (*py3_PyFloat_Type)
Bram Moolenaar141be8a2013-06-23 14:16:57 +0200272# define PyNumber_Check (*py3_PyNumber_Check)
273# define PyNumber_Long (*py3_PyNumber_Long)
Bram Moolenaar66b79852012-09-21 14:00:35 +0200274# define PyBool_Type (*py3_PyBool_Type)
Bram Moolenaar19e60942011-06-19 00:27:51 +0200275# define PyErr_NewException py3_PyErr_NewException
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200276# ifdef Py_DEBUG
277# define _Py_NegativeRefcount py3__Py_NegativeRefcount
278# define _Py_RefTotal (*py3__Py_RefTotal)
Bram Moolenaar0014a532013-05-29 21:33:39 +0200279# define PyModule_Create2TraceRefs py3_PyModule_Create2TraceRefs
280# else
281# define PyModule_Create2 py3_PyModule_Create2
282# endif
283# if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC)
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200284# define _PyObject_DebugMalloc py3__PyObject_DebugMalloc
285# define _PyObject_DebugFree py3__PyObject_DebugFree
286# else
287# define PyObject_Malloc py3_PyObject_Malloc
288# define PyObject_Free py3_PyObject_Free
289# endif
Bram Moolenaar774267b2013-05-21 20:51:59 +0200290# define _PyObject_GC_New py3__PyObject_GC_New
291# define PyObject_GC_Del py3_PyObject_GC_Del
292# define PyObject_GC_UnTrack py3_PyObject_GC_UnTrack
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200293# define PyType_GenericAlloc py3_PyType_GenericAlloc
294# define PyType_GenericNew py3_PyType_GenericNew
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200295# undef PyUnicode_FromString
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200296# define PyUnicode_FromString py3_PyUnicode_FromString
Bram Moolenaar1a3b5692013-05-30 12:40:39 +0200297# ifndef PyUnicode_FromFormat
298# define PyUnicode_FromFormat py3_PyUnicode_FromFormat
299# else
300# define Py_UNICODE_USE_UCS_FUNCTIONS
301# ifdef Py_UNICODE_WIDE
302# define PyUnicodeUCS4_FromFormat py3_PyUnicodeUCS4_FromFormat
303# else
304# define PyUnicodeUCS2_FromFormat py3_PyUnicodeUCS2_FromFormat
305# endif
306# endif
Bram Moolenaar19e60942011-06-19 00:27:51 +0200307# undef PyUnicode_Decode
308# define PyUnicode_Decode py3_PyUnicode_Decode
Bram Moolenaardb913952012-06-29 12:54:53 +0200309# define PyType_IsSubtype py3_PyType_IsSubtype
310# define PyCapsule_New py3_PyCapsule_New
311# define PyCapsule_GetPointer py3_PyCapsule_GetPointer
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200312
Bram Moolenaar0014a532013-05-29 21:33:39 +0200313# if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC)
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200314# undef PyObject_NEW
315# define PyObject_NEW(type, typeobj) \
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200316( (type *) PyObject_Init( \
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200317 (PyObject *) _PyObject_DebugMalloc( _PyObject_SIZE(typeobj) ), (typeobj)) )
Bram Moolenaaree1b9312020-07-16 22:15:53 +0200318# elif PY_VERSION_HEX >= 0x030900b0
319# undef PyObject_NEW
320# define PyObject_NEW(type, typeobj) \
321 ((type *)py3__PyObject_New(typeobj))
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200322# endif
323
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200324/*
325 * Pointers for dynamic link
326 */
327static int (*py3_PySys_SetArgv)(int, wchar_t **);
Bram Moolenaar644d37b2010-11-16 19:26:02 +0100328static void (*py3_Py_SetPythonHome)(wchar_t *home);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200329static void (*py3_Py_Initialize)(void);
330static PyObject* (*py3_PyList_New)(Py_ssize_t size);
331static PyGILState_STATE (*py3_PyGILState_Ensure)(void);
332static void (*py3_PyGILState_Release)(PyGILState_STATE);
333static int (*py3_PySys_SetObject)(char *, PyObject *);
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200334static PyObject* (*py3_PySys_GetObject)(char *);
335static int (*py3_PyList_Append)(PyObject *, PyObject *);
336static int (*py3_PyList_Insert)(PyObject *, int, PyObject *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200337static Py_ssize_t (*py3_PyList_Size)(PyObject *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200338static int (*py3_PySequence_Check)(PyObject *);
339static Py_ssize_t (*py3_PySequence_Size)(PyObject *);
340static PyObject* (*py3_PySequence_GetItem)(PyObject *, Py_ssize_t);
Bram Moolenaara9922d62013-05-30 13:01:18 +0200341static PyObject* (*py3_PySequence_Fast)(PyObject *, const char *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200342static Py_ssize_t (*py3_PyTuple_Size)(PyObject *);
343static PyObject* (*py3_PyTuple_GetItem)(PyObject *, Py_ssize_t);
344static int (*py3_PyMapping_Check)(PyObject *);
Bram Moolenaarbcb40972013-05-30 13:22:13 +0200345static PyObject* (*py3_PyMapping_Keys)(PyObject *);
Bram Moolenaar3b48b112018-07-04 22:03:25 +0200346# if PY_VERSION_HEX >= 0x030601f0
347static int (*py3_PySlice_AdjustIndices)(Py_ssize_t length,
348 Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step);
349static int (*py3_PySlice_Unpack)(PyObject *slice,
350 Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step);
351# endif
Bram Moolenaar922a4662014-03-30 16:11:43 +0200352static int (*py3_PySlice_GetIndicesEx)(PySliceObject_T *r, Py_ssize_t length,
Bram Moolenaar063a46b2014-01-14 16:36:51 +0100353 Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step,
354 Py_ssize_t *slicelen);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200355static PyObject* (*py3_PyErr_NoMemory)(void);
356static void (*py3_Py_Finalize)(void);
357static void (*py3_PyErr_SetString)(PyObject *, const char *);
Bram Moolenaar4d188da2013-05-15 15:35:09 +0200358static void (*py3_PyErr_SetObject)(PyObject *, PyObject *);
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200359static int (*py3_PyErr_ExceptionMatches)(PyObject *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200360static int (*py3_PyRun_SimpleString)(char *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200361static PyObject* (*py3_PyRun_String)(char *, int, PyObject *, PyObject *);
Bram Moolenaar3dab2802013-05-15 18:28:13 +0200362static PyObject* (*py3_PyObject_GetAttrString)(PyObject *, const char *);
Bram Moolenaara9922d62013-05-30 13:01:18 +0200363static int (*py3_PyObject_HasAttrString)(PyObject *, const char *);
Bram Moolenaar0b400082013-11-03 00:28:25 +0100364static int (*py3_PyObject_SetAttrString)(PyObject *, const char *, PyObject *);
Bram Moolenaar3dab2802013-05-15 18:28:13 +0200365static PyObject* (*py3_PyObject_CallFunctionObjArgs)(PyObject *, ...);
Bram Moolenaar81c40c52013-06-12 14:41:04 +0200366static PyObject* (*py3__PyObject_CallFunction_SizeT)(PyObject *, char *, ...);
Bram Moolenaarf4258302013-06-02 18:20:17 +0200367static PyObject* (*py3_PyObject_Call)(PyObject *, PyObject *, PyObject *);
Bram Moolenaar3dab2802013-05-15 18:28:13 +0200368static PyObject* (*py3_PyEval_GetGlobals)();
369static PyObject* (*py3_PyEval_GetLocals)();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200370static PyObject* (*py3_PyList_GetItem)(PyObject *, Py_ssize_t);
371static PyObject* (*py3_PyImport_ImportModule)(const char *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200372static PyObject* (*py3_PyImport_AddModule)(const char *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200373static int (*py3_PyErr_BadArgument)(void);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200374static PyObject* (*py3_PyErr_Occurred)(void);
375static PyObject* (*py3_PyModule_GetDict)(PyObject *);
376static int (*py3_PyList_SetItem)(PyObject *, Py_ssize_t, PyObject *);
377static PyObject* (*py3_PyDict_GetItemString)(PyObject *, const char *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200378static int (*py3_PyDict_Next)(PyObject *, Py_ssize_t *, PyObject **, PyObject **);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200379static PyObject* (*py3_PyLong_FromLong)(long);
380static PyObject* (*py3_PyDict_New)(void);
Zdenek Dohnal90478f32021-06-14 15:08:30 +0200381# if PY_VERSION_HEX >= 0x030a00b2
382static int (*py3_PyIter_Check)(PyObject *o);
383# endif
Bram Moolenaardb913952012-06-29 12:54:53 +0200384static PyObject* (*py3_PyIter_Next)(PyObject *);
385static PyObject* (*py3_PyObject_GetIter)(PyObject *);
Bram Moolenaar141be8a2013-06-23 14:16:57 +0200386static PyObject* (*py3_PyObject_Repr)(PyObject *);
Bram Moolenaarbcb40972013-05-30 13:22:13 +0200387static PyObject* (*py3_PyObject_GetItem)(PyObject *, PyObject *);
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200388static int (*py3_PyObject_IsTrue)(PyObject *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200389static PyObject* (*py3_Py_BuildValue)(char *, ...);
Bram Moolenaaree1b9312020-07-16 22:15:53 +0200390# if PY_VERSION_HEX >= 0x030900b0
391static int (*py3_PyType_GetFlags)(PyTypeObject *o);
392# endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200393static int (*py3_PyType_Ready)(PyTypeObject *type);
394static int (*py3_PyDict_SetItemString)(PyObject *dp, char *key, PyObject *item);
395static PyObject* (*py3_PyUnicode_FromString)(const char *u);
Bram Moolenaar1a3b5692013-05-30 12:40:39 +0200396# ifndef Py_UNICODE_USE_UCS_FUNCTIONS
397static PyObject* (*py3_PyUnicode_FromFormat)(const char *u, ...);
398# else
399# ifdef Py_UNICODE_WIDE
400static PyObject* (*py3_PyUnicodeUCS4_FromFormat)(const char *u, ...);
401# else
402static PyObject* (*py3_PyUnicodeUCS2_FromFormat)(const char *u, ...);
403# endif
404# endif
Bram Moolenaar19e60942011-06-19 00:27:51 +0200405static PyObject* (*py3_PyUnicode_Decode)(const char *u, Py_ssize_t size,
406 const char *encoding, const char *errors);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200407static long (*py3_PyLong_AsLong)(PyObject *);
408static void (*py3_PyErr_SetNone)(PyObject *);
409static void (*py3_PyEval_InitThreads)(void);
410static void(*py3_PyEval_RestoreThread)(PyThreadState *);
411static PyThreadState*(*py3_PyEval_SaveThread)(void);
412static int (*py3_PyArg_Parse)(PyObject *, char *, ...);
413static int (*py3_PyArg_ParseTuple)(PyObject *, char *, ...);
Bram Moolenaar19e60942011-06-19 00:27:51 +0200414static int (*py3_PyMem_Free)(void *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200415static void* (*py3_PyMem_Malloc)(size_t);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200416static int (*py3_Py_IsInitialized)(void);
417static void (*py3_PyErr_Clear)(void);
Bram Moolenaarc476e522013-06-23 13:46:40 +0200418static PyObject* (*py3_PyErr_Format)(PyObject *, const char *, ...);
Bram Moolenaar4d369872013-02-20 16:09:43 +0100419static void (*py3_PyErr_PrintEx)(int);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200420static PyObject*(*py3__PyObject_Init)(PyObject *, PyTypeObject *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200421static iternextfunc py3__PyObject_NextNotImplemented;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200422static PyObject* py3__Py_NoneStruct;
Bram Moolenaar66b79852012-09-21 14:00:35 +0200423static PyObject* py3__Py_FalseStruct;
424static PyObject* py3__Py_TrueStruct;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200425static int (*py3_PyModule_AddObject)(PyObject *m, const char *name, PyObject *o);
426static int (*py3_PyImport_AppendInittab)(const char *name, PyObject* (*initfunc)(void));
Bram Moolenaar9c9cbf12012-10-23 05:17:37 +0200427# if PY_VERSION_HEX >= 0x030300f0
428static char* (*py3_PyUnicode_AsUTF8)(PyObject *unicode);
429# else
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200430static char* (*py3__PyUnicode_AsString)(PyObject *unicode);
Bram Moolenaar9c9cbf12012-10-23 05:17:37 +0200431# endif
Bram Moolenaar19e60942011-06-19 00:27:51 +0200432static PyObject* (*py3_PyUnicode_AsEncodedString)(PyObject *unicode, const char* encoding, const char* errors);
433static char* (*py3_PyBytes_AsString)(PyObject *bytes);
Bram Moolenaar808c2bc2013-06-23 13:11:18 +0200434static int (*py3_PyBytes_AsStringAndSize)(PyObject *bytes, char **buffer, Py_ssize_t *length);
Bram Moolenaardb913952012-06-29 12:54:53 +0200435static PyObject* (*py3_PyBytes_FromString)(char *str);
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100436static PyObject* (*py3_PyBytes_FromStringAndSize)(char *str, Py_ssize_t length);
Bram Moolenaaree1b9312020-07-16 22:15:53 +0200437# if defined(Py_DEBUG) || PY_VERSION_HEX >= 0x030900b0
438static void (*py3__Py_Dealloc)(PyObject *obj);
439# endif
440# if PY_VERSION_HEX >= 0x030900b0
441static PyObject* (*py3__PyObject_New)(PyTypeObject *);
442# endif
Bram Moolenaardb913952012-06-29 12:54:53 +0200443static PyObject* (*py3_PyFloat_FromDouble)(double num);
444static double (*py3_PyFloat_AsDouble)(PyObject *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200445static PyObject* (*py3_PyObject_GenericGetAttr)(PyObject *obj, PyObject *name);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200446static PyObject* (*py3_PyType_GenericAlloc)(PyTypeObject *type, Py_ssize_t nitems);
447static PyObject* (*py3_PyType_GenericNew)(PyTypeObject *type, PyObject *args, PyObject *kwds);
Bram Moolenaar66b79852012-09-21 14:00:35 +0200448static PyTypeObject* py3_PyType_Type;
Bram Moolenaard4a8c982018-05-15 22:31:18 +0200449static PyTypeObject* py3_PyStdPrinter_Type;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200450static PyTypeObject* py3_PySlice_Type;
Bram Moolenaardb913952012-06-29 12:54:53 +0200451static PyTypeObject* py3_PyFloat_Type;
Bram Moolenaar66b79852012-09-21 14:00:35 +0200452static PyTypeObject* py3_PyBool_Type;
Bram Moolenaar141be8a2013-06-23 14:16:57 +0200453static int (*py3_PyNumber_Check)(PyObject *);
454static PyObject* (*py3_PyNumber_Long)(PyObject *);
Bram Moolenaar19e60942011-06-19 00:27:51 +0200455static PyObject* (*py3_PyErr_NewException)(char *name, PyObject *base, PyObject *dict);
Bram Moolenaardb913952012-06-29 12:54:53 +0200456static PyObject* (*py3_PyCapsule_New)(void *, char *, PyCapsule_Destructor);
457static void* (*py3_PyCapsule_GetPointer)(PyObject *, char *);
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200458# ifdef Py_DEBUG
Bram Moolenaar0014a532013-05-29 21:33:39 +0200459static void (*py3__Py_NegativeRefcount)(const char *fname, int lineno, PyObject *op);
460static Py_ssize_t* py3__Py_RefTotal;
Bram Moolenaar0014a532013-05-29 21:33:39 +0200461static PyObject* (*py3_PyModule_Create2TraceRefs)(struct PyModuleDef* module, int module_api_version);
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200462# else
Bram Moolenaar0014a532013-05-29 21:33:39 +0200463static PyObject* (*py3_PyModule_Create2)(struct PyModuleDef* module, int module_api_version);
464# endif
465# if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC)
466static void (*py3__PyObject_DebugFree)(void*);
467static void* (*py3__PyObject_DebugMalloc)(size_t);
468# else
469static void (*py3_PyObject_Free)(void*);
470static void* (*py3_PyObject_Malloc)(size_t);
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200471# endif
Bram Moolenaar774267b2013-05-21 20:51:59 +0200472static PyObject*(*py3__PyObject_GC_New)(PyTypeObject *);
473static void(*py3_PyObject_GC_Del)(void *);
474static void(*py3_PyObject_GC_UnTrack)(void *);
Bram Moolenaardb913952012-06-29 12:54:53 +0200475static int (*py3_PyType_IsSubtype)(PyTypeObject *, PyTypeObject *);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200476
Bram Moolenaar2ab2e862019-12-04 21:24:53 +0100477// Imported exception objects
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200478static PyObject *p3imp_PyExc_AttributeError;
479static PyObject *p3imp_PyExc_IndexError;
Bram Moolenaaraf6abb92013-04-24 13:04:26 +0200480static PyObject *p3imp_PyExc_KeyError;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200481static PyObject *p3imp_PyExc_KeyboardInterrupt;
482static PyObject *p3imp_PyExc_TypeError;
483static PyObject *p3imp_PyExc_ValueError;
Bram Moolenaar41009372013-07-01 22:03:04 +0200484static PyObject *p3imp_PyExc_SystemExit;
Bram Moolenaar8661b172013-05-15 15:44:28 +0200485static PyObject *p3imp_PyExc_RuntimeError;
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200486static PyObject *p3imp_PyExc_ImportError;
Bram Moolenaar141be8a2013-06-23 14:16:57 +0200487static PyObject *p3imp_PyExc_OverflowError;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200488
489# define PyExc_AttributeError p3imp_PyExc_AttributeError
490# define PyExc_IndexError p3imp_PyExc_IndexError
Bram Moolenaaraf6abb92013-04-24 13:04:26 +0200491# define PyExc_KeyError p3imp_PyExc_KeyError
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200492# define PyExc_KeyboardInterrupt p3imp_PyExc_KeyboardInterrupt
493# define PyExc_TypeError p3imp_PyExc_TypeError
494# define PyExc_ValueError p3imp_PyExc_ValueError
Bram Moolenaar41009372013-07-01 22:03:04 +0200495# define PyExc_SystemExit p3imp_PyExc_SystemExit
Bram Moolenaar8661b172013-05-15 15:44:28 +0200496# define PyExc_RuntimeError p3imp_PyExc_RuntimeError
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200497# define PyExc_ImportError p3imp_PyExc_ImportError
Bram Moolenaar141be8a2013-06-23 14:16:57 +0200498# define PyExc_OverflowError p3imp_PyExc_OverflowError
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200499
500/*
501 * Table of name to function pointer of python.
502 */
503# define PYTHON_PROC FARPROC
504static struct
505{
506 char *name;
507 PYTHON_PROC *ptr;
508} py3_funcname_table[] =
509{
510 {"PySys_SetArgv", (PYTHON_PROC*)&py3_PySys_SetArgv},
Bram Moolenaar644d37b2010-11-16 19:26:02 +0100511 {"Py_SetPythonHome", (PYTHON_PROC*)&py3_Py_SetPythonHome},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200512 {"Py_Initialize", (PYTHON_PROC*)&py3_Py_Initialize},
Bram Moolenaare8cdcef2012-09-12 20:21:43 +0200513 {"_PyArg_ParseTuple_SizeT", (PYTHON_PROC*)&py3_PyArg_ParseTuple},
514 {"_Py_BuildValue_SizeT", (PYTHON_PROC*)&py3_Py_BuildValue},
Bram Moolenaar19e60942011-06-19 00:27:51 +0200515 {"PyMem_Free", (PYTHON_PROC*)&py3_PyMem_Free},
Bram Moolenaardb913952012-06-29 12:54:53 +0200516 {"PyMem_Malloc", (PYTHON_PROC*)&py3_PyMem_Malloc},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200517 {"PyList_New", (PYTHON_PROC*)&py3_PyList_New},
518 {"PyGILState_Ensure", (PYTHON_PROC*)&py3_PyGILState_Ensure},
519 {"PyGILState_Release", (PYTHON_PROC*)&py3_PyGILState_Release},
520 {"PySys_SetObject", (PYTHON_PROC*)&py3_PySys_SetObject},
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200521 {"PySys_GetObject", (PYTHON_PROC*)&py3_PySys_GetObject},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200522 {"PyList_Append", (PYTHON_PROC*)&py3_PyList_Append},
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200523 {"PyList_Insert", (PYTHON_PROC*)&py3_PyList_Insert},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200524 {"PyList_Size", (PYTHON_PROC*)&py3_PyList_Size},
Bram Moolenaardb913952012-06-29 12:54:53 +0200525 {"PySequence_Check", (PYTHON_PROC*)&py3_PySequence_Check},
526 {"PySequence_Size", (PYTHON_PROC*)&py3_PySequence_Size},
527 {"PySequence_GetItem", (PYTHON_PROC*)&py3_PySequence_GetItem},
Bram Moolenaara9922d62013-05-30 13:01:18 +0200528 {"PySequence_Fast", (PYTHON_PROC*)&py3_PySequence_Fast},
Bram Moolenaardb913952012-06-29 12:54:53 +0200529 {"PyTuple_Size", (PYTHON_PROC*)&py3_PyTuple_Size},
530 {"PyTuple_GetItem", (PYTHON_PROC*)&py3_PyTuple_GetItem},
Bram Moolenaar3b48b112018-07-04 22:03:25 +0200531# if PY_VERSION_HEX >= 0x030601f0
532 {"PySlice_AdjustIndices", (PYTHON_PROC*)&py3_PySlice_AdjustIndices},
533 {"PySlice_Unpack", (PYTHON_PROC*)&py3_PySlice_Unpack},
534# endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200535 {"PySlice_GetIndicesEx", (PYTHON_PROC*)&py3_PySlice_GetIndicesEx},
536 {"PyErr_NoMemory", (PYTHON_PROC*)&py3_PyErr_NoMemory},
537 {"Py_Finalize", (PYTHON_PROC*)&py3_Py_Finalize},
538 {"PyErr_SetString", (PYTHON_PROC*)&py3_PyErr_SetString},
Bram Moolenaar4d188da2013-05-15 15:35:09 +0200539 {"PyErr_SetObject", (PYTHON_PROC*)&py3_PyErr_SetObject},
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200540 {"PyErr_ExceptionMatches", (PYTHON_PROC*)&py3_PyErr_ExceptionMatches},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200541 {"PyRun_SimpleString", (PYTHON_PROC*)&py3_PyRun_SimpleString},
Bram Moolenaardb913952012-06-29 12:54:53 +0200542 {"PyRun_String", (PYTHON_PROC*)&py3_PyRun_String},
Bram Moolenaar3dab2802013-05-15 18:28:13 +0200543 {"PyObject_GetAttrString", (PYTHON_PROC*)&py3_PyObject_GetAttrString},
Bram Moolenaara9922d62013-05-30 13:01:18 +0200544 {"PyObject_HasAttrString", (PYTHON_PROC*)&py3_PyObject_HasAttrString},
Bram Moolenaar3dab2802013-05-15 18:28:13 +0200545 {"PyObject_SetAttrString", (PYTHON_PROC*)&py3_PyObject_SetAttrString},
546 {"PyObject_CallFunctionObjArgs", (PYTHON_PROC*)&py3_PyObject_CallFunctionObjArgs},
Bram Moolenaar81c40c52013-06-12 14:41:04 +0200547 {"_PyObject_CallFunction_SizeT", (PYTHON_PROC*)&py3__PyObject_CallFunction_SizeT},
Bram Moolenaarf4258302013-06-02 18:20:17 +0200548 {"PyObject_Call", (PYTHON_PROC*)&py3_PyObject_Call},
Bram Moolenaar3dab2802013-05-15 18:28:13 +0200549 {"PyEval_GetGlobals", (PYTHON_PROC*)&py3_PyEval_GetGlobals},
550 {"PyEval_GetLocals", (PYTHON_PROC*)&py3_PyEval_GetLocals},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200551 {"PyList_GetItem", (PYTHON_PROC*)&py3_PyList_GetItem},
552 {"PyImport_ImportModule", (PYTHON_PROC*)&py3_PyImport_ImportModule},
Bram Moolenaardb913952012-06-29 12:54:53 +0200553 {"PyImport_AddModule", (PYTHON_PROC*)&py3_PyImport_AddModule},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200554 {"PyErr_BadArgument", (PYTHON_PROC*)&py3_PyErr_BadArgument},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200555 {"PyErr_Occurred", (PYTHON_PROC*)&py3_PyErr_Occurred},
556 {"PyModule_GetDict", (PYTHON_PROC*)&py3_PyModule_GetDict},
557 {"PyList_SetItem", (PYTHON_PROC*)&py3_PyList_SetItem},
558 {"PyDict_GetItemString", (PYTHON_PROC*)&py3_PyDict_GetItemString},
Bram Moolenaardb913952012-06-29 12:54:53 +0200559 {"PyDict_Next", (PYTHON_PROC*)&py3_PyDict_Next},
560 {"PyMapping_Check", (PYTHON_PROC*)&py3_PyMapping_Check},
Bram Moolenaarbcb40972013-05-30 13:22:13 +0200561 {"PyMapping_Keys", (PYTHON_PROC*)&py3_PyMapping_Keys},
Zdenek Dohnal90478f32021-06-14 15:08:30 +0200562# if PY_VERSION_HEX >= 0x030a00b2
563 {"PyIter_Check", (PYTHON_PROC*)&py3_PyIter_Check},
564# endif
Bram Moolenaardb913952012-06-29 12:54:53 +0200565 {"PyIter_Next", (PYTHON_PROC*)&py3_PyIter_Next},
566 {"PyObject_GetIter", (PYTHON_PROC*)&py3_PyObject_GetIter},
Bram Moolenaar141be8a2013-06-23 14:16:57 +0200567 {"PyObject_Repr", (PYTHON_PROC*)&py3_PyObject_Repr},
Bram Moolenaarbcb40972013-05-30 13:22:13 +0200568 {"PyObject_GetItem", (PYTHON_PROC*)&py3_PyObject_GetItem},
Bram Moolenaar03db85b2013-05-15 14:51:35 +0200569 {"PyObject_IsTrue", (PYTHON_PROC*)&py3_PyObject_IsTrue},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200570 {"PyLong_FromLong", (PYTHON_PROC*)&py3_PyLong_FromLong},
571 {"PyDict_New", (PYTHON_PROC*)&py3_PyDict_New},
Bram Moolenaaree1b9312020-07-16 22:15:53 +0200572# if PY_VERSION_HEX >= 0x030900b0
573 {"PyType_GetFlags", (PYTHON_PROC*)&py3_PyType_GetFlags},
574# endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200575 {"PyType_Ready", (PYTHON_PROC*)&py3_PyType_Ready},
576 {"PyDict_SetItemString", (PYTHON_PROC*)&py3_PyDict_SetItemString},
577 {"PyLong_AsLong", (PYTHON_PROC*)&py3_PyLong_AsLong},
578 {"PyErr_SetNone", (PYTHON_PROC*)&py3_PyErr_SetNone},
579 {"PyEval_InitThreads", (PYTHON_PROC*)&py3_PyEval_InitThreads},
580 {"PyEval_RestoreThread", (PYTHON_PROC*)&py3_PyEval_RestoreThread},
581 {"PyEval_SaveThread", (PYTHON_PROC*)&py3_PyEval_SaveThread},
Bram Moolenaar5f87b232013-06-13 20:57:50 +0200582 {"_PyArg_Parse_SizeT", (PYTHON_PROC*)&py3_PyArg_Parse},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200583 {"Py_IsInitialized", (PYTHON_PROC*)&py3_Py_IsInitialized},
Bram Moolenaardb913952012-06-29 12:54:53 +0200584 {"_PyObject_NextNotImplemented", (PYTHON_PROC*)&py3__PyObject_NextNotImplemented},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200585 {"_Py_NoneStruct", (PYTHON_PROC*)&py3__Py_NoneStruct},
Bram Moolenaar66b79852012-09-21 14:00:35 +0200586 {"_Py_FalseStruct", (PYTHON_PROC*)&py3__Py_FalseStruct},
587 {"_Py_TrueStruct", (PYTHON_PROC*)&py3__Py_TrueStruct},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200588 {"PyErr_Clear", (PYTHON_PROC*)&py3_PyErr_Clear},
Bram Moolenaarc476e522013-06-23 13:46:40 +0200589 {"PyErr_Format", (PYTHON_PROC*)&py3_PyErr_Format},
Bram Moolenaar4d369872013-02-20 16:09:43 +0100590 {"PyErr_PrintEx", (PYTHON_PROC*)&py3_PyErr_PrintEx},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200591 {"PyObject_Init", (PYTHON_PROC*)&py3__PyObject_Init},
592 {"PyModule_AddObject", (PYTHON_PROC*)&py3_PyModule_AddObject},
593 {"PyImport_AppendInittab", (PYTHON_PROC*)&py3_PyImport_AppendInittab},
Bram Moolenaar9c9cbf12012-10-23 05:17:37 +0200594# if PY_VERSION_HEX >= 0x030300f0
595 {"PyUnicode_AsUTF8", (PYTHON_PROC*)&py3_PyUnicode_AsUTF8},
596# else
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200597 {"_PyUnicode_AsString", (PYTHON_PROC*)&py3__PyUnicode_AsString},
Bram Moolenaar9c9cbf12012-10-23 05:17:37 +0200598# endif
Bram Moolenaar1a3b5692013-05-30 12:40:39 +0200599# ifndef Py_UNICODE_USE_UCS_FUNCTIONS
600 {"PyUnicode_FromFormat", (PYTHON_PROC*)&py3_PyUnicode_FromFormat},
601# else
602# ifdef Py_UNICODE_WIDE
603 {"PyUnicodeUCS4_FromFormat", (PYTHON_PROC*)&py3_PyUnicodeUCS4_FromFormat},
604# else
605 {"PyUnicodeUCS2_FromFormat", (PYTHON_PROC*)&py3_PyUnicodeUCS2_FromFormat},
606# endif
607# endif
Bram Moolenaar19e60942011-06-19 00:27:51 +0200608 {"PyBytes_AsString", (PYTHON_PROC*)&py3_PyBytes_AsString},
Bram Moolenaarcdab9052012-09-05 19:03:56 +0200609 {"PyBytes_AsStringAndSize", (PYTHON_PROC*)&py3_PyBytes_AsStringAndSize},
Bram Moolenaardb913952012-06-29 12:54:53 +0200610 {"PyBytes_FromString", (PYTHON_PROC*)&py3_PyBytes_FromString},
Bram Moolenaar6e5ea8d2019-01-12 22:47:31 +0100611 {"PyBytes_FromStringAndSize", (PYTHON_PROC*)&py3_PyBytes_FromStringAndSize},
Bram Moolenaaree1b9312020-07-16 22:15:53 +0200612# if defined(Py_DEBUG) || PY_VERSION_HEX >= 0x030900b0
613 {"_Py_Dealloc", (PYTHON_PROC*)&py3__Py_Dealloc},
614# endif
615# if PY_VERSION_HEX >= 0x030900b0
616 {"_PyObject_New", (PYTHON_PROC*)&py3__PyObject_New},
617# endif
Bram Moolenaardb913952012-06-29 12:54:53 +0200618 {"PyFloat_FromDouble", (PYTHON_PROC*)&py3_PyFloat_FromDouble},
619 {"PyFloat_AsDouble", (PYTHON_PROC*)&py3_PyFloat_AsDouble},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200620 {"PyObject_GenericGetAttr", (PYTHON_PROC*)&py3_PyObject_GenericGetAttr},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200621 {"PyType_GenericAlloc", (PYTHON_PROC*)&py3_PyType_GenericAlloc},
622 {"PyType_GenericNew", (PYTHON_PROC*)&py3_PyType_GenericNew},
Bram Moolenaar66b79852012-09-21 14:00:35 +0200623 {"PyType_Type", (PYTHON_PROC*)&py3_PyType_Type},
Bram Moolenaard4a8c982018-05-15 22:31:18 +0200624 {"PyStdPrinter_Type", (PYTHON_PROC*)&py3_PyStdPrinter_Type},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200625 {"PySlice_Type", (PYTHON_PROC*)&py3_PySlice_Type},
Bram Moolenaardb913952012-06-29 12:54:53 +0200626 {"PyFloat_Type", (PYTHON_PROC*)&py3_PyFloat_Type},
Bram Moolenaar66b79852012-09-21 14:00:35 +0200627 {"PyBool_Type", (PYTHON_PROC*)&py3_PyBool_Type},
Bram Moolenaar141be8a2013-06-23 14:16:57 +0200628 {"PyNumber_Check", (PYTHON_PROC*)&py3_PyNumber_Check},
629 {"PyNumber_Long", (PYTHON_PROC*)&py3_PyNumber_Long},
Bram Moolenaar19e60942011-06-19 00:27:51 +0200630 {"PyErr_NewException", (PYTHON_PROC*)&py3_PyErr_NewException},
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200631# ifdef Py_DEBUG
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200632 {"_Py_NegativeRefcount", (PYTHON_PROC*)&py3__Py_NegativeRefcount},
633 {"_Py_RefTotal", (PYTHON_PROC*)&py3__Py_RefTotal},
Bram Moolenaar0014a532013-05-29 21:33:39 +0200634 {"PyModule_Create2TraceRefs", (PYTHON_PROC*)&py3_PyModule_Create2TraceRefs},
635# else
636 {"PyModule_Create2", (PYTHON_PROC*)&py3_PyModule_Create2},
637# endif
638# if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200639 {"_PyObject_DebugFree", (PYTHON_PROC*)&py3__PyObject_DebugFree},
640 {"_PyObject_DebugMalloc", (PYTHON_PROC*)&py3__PyObject_DebugMalloc},
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200641# else
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200642 {"PyObject_Malloc", (PYTHON_PROC*)&py3_PyObject_Malloc},
643 {"PyObject_Free", (PYTHON_PROC*)&py3_PyObject_Free},
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200644# endif
Bram Moolenaar774267b2013-05-21 20:51:59 +0200645 {"_PyObject_GC_New", (PYTHON_PROC*)&py3__PyObject_GC_New},
646 {"PyObject_GC_Del", (PYTHON_PROC*)&py3_PyObject_GC_Del},
647 {"PyObject_GC_UnTrack", (PYTHON_PROC*)&py3_PyObject_GC_UnTrack},
Bram Moolenaardb913952012-06-29 12:54:53 +0200648 {"PyType_IsSubtype", (PYTHON_PROC*)&py3_PyType_IsSubtype},
649 {"PyCapsule_New", (PYTHON_PROC*)&py3_PyCapsule_New},
650 {"PyCapsule_GetPointer", (PYTHON_PROC*)&py3_PyCapsule_GetPointer},
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200651 {"", NULL},
652};
653
Bram Moolenaar13a1f3f2019-10-23 21:37:25 +0200654# if PY_VERSION_HEX >= 0x030800f0
655 static inline void
656py3__Py_DECREF(const char *filename UNUSED, int lineno UNUSED, PyObject *op)
657{
Bram Moolenaar13a1f3f2019-10-23 21:37:25 +0200658 if (--op->ob_refcnt != 0)
659 {
660# ifdef Py_REF_DEBUG
661 if (op->ob_refcnt < 0)
662 {
663 _Py_NegativeRefcount(filename, lineno, op);
664 }
665# endif
666 }
667 else
668 {
669 _Py_Dealloc(op);
670 }
671}
672
673# undef Py_DECREF
674# define Py_DECREF(op) py3__Py_DECREF(__FILE__, __LINE__, _PyObject_CAST(op))
675
676 static inline void
677py3__Py_XDECREF(PyObject *op)
678{
679 if (op != NULL)
680 {
681 Py_DECREF(op);
682 }
683}
684
685# undef Py_XDECREF
686# define Py_XDECREF(op) py3__Py_XDECREF(_PyObject_CAST(op))
687# endif
688
Bram Moolenaaree1b9312020-07-16 22:15:53 +0200689# if PY_VERSION_HEX >= 0x030900b0
690 static inline int
691py3_PyType_HasFeature(PyTypeObject *type, unsigned long feature)
692{
693 return ((PyType_GetFlags(type) & feature) != 0);
694}
695# define PyType_HasFeature(t,f) py3_PyType_HasFeature(t,f)
696# endif
697
Zdenek Dohnal90478f32021-06-14 15:08:30 +0200698# if PY_VERSION_HEX >= 0x030a00b2
699 static inline int
700py3__PyObject_TypeCheck(PyObject *ob, PyTypeObject *type)
701{
702 return Py_IS_TYPE(ob, type) || PyType_IsSubtype(Py_TYPE(ob), type);
703}
Zdenek Dohnalfee511c2022-06-27 13:59:00 +0100704# if PY_VERSION_HEX >= 0x030b00b3
705# undef PyObject_TypeCheck
706# define PyObject_TypeCheck(o,t) py3__PyObject_TypeCheck(o,t)
707# else
708# define _PyObject_TypeCheck(o,t) py3__PyObject_TypeCheck(o,t)
709# endif
Zdenek Dohnal90478f32021-06-14 15:08:30 +0200710# endif
711
Bram Moolenaarb2f9e0e2020-12-25 13:52:37 +0100712# ifdef MSWIN
713/*
714 * Look up the library "libname" using the InstallPath registry key.
715 * Return NULL when failed. Return an allocated string when successful.
716 */
717 static char *
718py3_get_system_libname(const char *libname)
719{
720 const char *cp = libname;
721 char subkey[128];
722 HKEY hKey;
723 char installpath[MAXPATHL];
724 LONG len = sizeof(installpath);
725 LSTATUS rc;
726 size_t sysliblen;
727 char *syslibname;
728
729 while (*cp != '\0')
730 {
731 if (*cp == ':' || *cp == '\\' || *cp == '/')
732 {
733 // Bail out if "libname" contains path separator, assume it is
734 // an absolute path.
735 return NULL;
736 }
737 ++cp;
738 }
739 vim_snprintf(subkey, sizeof(subkey),
740# ifdef _WIN64
741 "Software\\Python\\PythonCore\\%d.%d\\InstallPath",
742# else
743 "Software\\Python\\PythonCore\\%d.%d-32\\InstallPath",
744# endif
745 PY_MAJOR_VERSION, PY_MINOR_VERSION);
746 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, subkey, 0, KEY_QUERY_VALUE, &hKey)
747 != ERROR_SUCCESS)
748 return NULL;
749 rc = RegQueryValueA(hKey, NULL, installpath, &len);
750 RegCloseKey(hKey);
751 if (ERROR_SUCCESS != rc)
752 return NULL;
753 cp = installpath + len;
754 // Just in case registry value contains null terminators.
755 while (cp > installpath && *(cp-1) == '\0')
756 --cp;
757 // Remove trailing path separators.
758 while (cp > installpath && (*(cp-1) == '\\' || *(cp-1) == '/'))
759 --cp;
760 // Ignore if InstallPath is effectively empty.
761 if (cp <= installpath)
762 return NULL;
763 sysliblen = (cp - installpath) + 1 + STRLEN(libname) + 1;
764 syslibname = alloc(sysliblen);
765 vim_snprintf(syslibname, sysliblen, "%.*s\\%s",
766 (int)(cp - installpath), installpath, libname);
767 return syslibname;
768}
769# endif
770
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200771/*
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200772 * Load library and get all pointers.
773 * Parameter 'libname' provides name of DLL.
774 * Return OK or FAIL.
775 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200776 static int
777py3_runtime_link_init(char *libname, int verbose)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200778{
779 int i;
Bram Moolenaar7b24ce02018-03-29 18:15:26 +0200780 PYTHON_PROC *ucs_from_string = (PYTHON_PROC *)&py3_PyUnicode_FromString;
781 PYTHON_PROC *ucs_decode = (PYTHON_PROC *)&py3_PyUnicode_Decode;
782 PYTHON_PROC *ucs_as_encoded_string =
783 (PYTHON_PROC *)&py3_PyUnicode_AsEncodedString;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200784
Bram Moolenaar644d37b2010-11-16 19:26:02 +0100785# if !(defined(PY_NO_RTLD_GLOBAL) && defined(PY3_NO_RTLD_GLOBAL)) && defined(UNIX) && defined(FEAT_PYTHON)
Bram Moolenaar2ab2e862019-12-04 21:24:53 +0100786 // Can't have Python and Python3 loaded at the same time.
Dominique Pelleaf4a61a2021-12-27 17:21:41 +0000787 // It causes a crash, because RTLD_GLOBAL is needed for
Bram Moolenaar2ab2e862019-12-04 21:24:53 +0100788 // standard C extension libraries of one or both python versions.
Bram Moolenaar4c3a3262010-07-24 15:42:14 +0200789 if (python_loaded())
790 {
Bram Moolenaar9dc93ae2011-08-28 16:00:19 +0200791 if (verbose)
Bram Moolenaar9d00e4a2022-01-05 17:49:15 +0000792 emsg(_(e_this_vim_cannot_execute_py3_after_using_python));
Bram Moolenaar4c3a3262010-07-24 15:42:14 +0200793 return FAIL;
794 }
Bram Moolenaarb61f95c2010-08-09 22:06:13 +0200795# endif
Bram Moolenaar4c3a3262010-07-24 15:42:14 +0200796
797 if (hinstPy3 != 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200798 return OK;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200799 hinstPy3 = load_dll(libname);
800
Bram Moolenaarb2f9e0e2020-12-25 13:52:37 +0100801# ifdef MSWIN
802 if (!hinstPy3)
803 {
804 // Attempt to use the path from InstallPath as stored in the registry.
805 char *syslibname = py3_get_system_libname(libname);
806
807 if (syslibname != NULL)
808 {
809 hinstPy3 = load_dll(syslibname);
810 vim_free(syslibname);
811 }
812 }
813# endif
814
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200815 if (!hinstPy3)
816 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200817 if (verbose)
Bram Moolenaar460ae5d2022-01-01 14:19:49 +0000818 semsg(_(e_could_not_load_library_str_str), libname, load_dll_error());
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200819 return FAIL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200820 }
821
822 for (i = 0; py3_funcname_table[i].ptr; ++i)
823 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200824 if ((*py3_funcname_table[i].ptr = symbol_from_dll(hinstPy3,
825 py3_funcname_table[i].name)) == NULL)
826 {
827 close_dll(hinstPy3);
828 hinstPy3 = 0;
829 if (verbose)
Bram Moolenaar460ae5d2022-01-01 14:19:49 +0000830 semsg(_(e_could_not_load_library_function_str), py3_funcname_table[i].name);
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200831 return FAIL;
832 }
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200833 }
834
Bram Moolenaar2ab2e862019-12-04 21:24:53 +0100835 // Load unicode functions separately as only the ucs2 or the ucs4 functions
836 // will be present in the library.
Bram Moolenaar9c9cbf12012-10-23 05:17:37 +0200837# if PY_VERSION_HEX >= 0x030300f0
Bram Moolenaar7b24ce02018-03-29 18:15:26 +0200838 *ucs_from_string = symbol_from_dll(hinstPy3, "PyUnicode_FromString");
839 *ucs_decode = symbol_from_dll(hinstPy3, "PyUnicode_Decode");
840 *ucs_as_encoded_string = symbol_from_dll(hinstPy3,
Bram Moolenaar7bc4f932012-10-14 03:22:56 +0200841 "PyUnicode_AsEncodedString");
Bram Moolenaar9c9cbf12012-10-23 05:17:37 +0200842# else
Bram Moolenaar7b24ce02018-03-29 18:15:26 +0200843 *ucs_from_string = symbol_from_dll(hinstPy3, "PyUnicodeUCS2_FromString");
844 *ucs_decode = symbol_from_dll(hinstPy3,
Bram Moolenaar19e60942011-06-19 00:27:51 +0200845 "PyUnicodeUCS2_Decode");
Bram Moolenaar7b24ce02018-03-29 18:15:26 +0200846 *ucs_as_encoded_string = symbol_from_dll(hinstPy3,
Bram Moolenaar19e60942011-06-19 00:27:51 +0200847 "PyUnicodeUCS2_AsEncodedString");
Bram Moolenaar7b24ce02018-03-29 18:15:26 +0200848 if (*ucs_from_string == NULL || *ucs_decode == NULL
849 || *ucs_as_encoded_string == NULL)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200850 {
Bram Moolenaar7b24ce02018-03-29 18:15:26 +0200851 *ucs_from_string = symbol_from_dll(hinstPy3,
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200852 "PyUnicodeUCS4_FromString");
Bram Moolenaar7b24ce02018-03-29 18:15:26 +0200853 *ucs_decode = symbol_from_dll(hinstPy3,
Bram Moolenaar19e60942011-06-19 00:27:51 +0200854 "PyUnicodeUCS4_Decode");
Bram Moolenaar7b24ce02018-03-29 18:15:26 +0200855 *ucs_as_encoded_string = symbol_from_dll(hinstPy3,
Bram Moolenaar19e60942011-06-19 00:27:51 +0200856 "PyUnicodeUCS4_AsEncodedString");
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200857 }
Bram Moolenaar9c9cbf12012-10-23 05:17:37 +0200858# endif
Bram Moolenaar7b24ce02018-03-29 18:15:26 +0200859 if (*ucs_from_string == NULL || *ucs_decode == NULL
860 || *ucs_as_encoded_string == NULL)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200861 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200862 close_dll(hinstPy3);
863 hinstPy3 = 0;
864 if (verbose)
Bram Moolenaar460ae5d2022-01-01 14:19:49 +0000865 semsg(_(e_could_not_load_library_function_str), "PyUnicode_UCSX_*");
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200866 return FAIL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200867 }
868
869 return OK;
870}
871
872/*
873 * If python is enabled (there is installed python on Windows system) return
874 * TRUE, else FALSE.
875 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200876 int
877python3_enabled(int verbose)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200878{
Bram Moolenaar25e4fcd2016-01-09 14:57:47 +0100879 return py3_runtime_link_init((char *)p_py3dll, verbose) == OK;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200880}
881
Bram Moolenaar2ab2e862019-12-04 21:24:53 +0100882/*
883 * Load the standard Python exceptions - don't import the symbols from the
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200884 * DLL, as this can cause errors (importing data symbols is not reliable).
885 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200886 static void
Bram Moolenaar68c2f632016-01-30 17:24:07 +0100887get_py3_exceptions(void)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200888{
889 PyObject *exmod = PyImport_ImportModule("builtins");
890 PyObject *exdict = PyModule_GetDict(exmod);
891 p3imp_PyExc_AttributeError = PyDict_GetItemString(exdict, "AttributeError");
892 p3imp_PyExc_IndexError = PyDict_GetItemString(exdict, "IndexError");
Bram Moolenaaraf6abb92013-04-24 13:04:26 +0200893 p3imp_PyExc_KeyError = PyDict_GetItemString(exdict, "KeyError");
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200894 p3imp_PyExc_KeyboardInterrupt = PyDict_GetItemString(exdict, "KeyboardInterrupt");
895 p3imp_PyExc_TypeError = PyDict_GetItemString(exdict, "TypeError");
896 p3imp_PyExc_ValueError = PyDict_GetItemString(exdict, "ValueError");
Bram Moolenaar41009372013-07-01 22:03:04 +0200897 p3imp_PyExc_SystemExit = PyDict_GetItemString(exdict, "SystemExit");
Bram Moolenaar8661b172013-05-15 15:44:28 +0200898 p3imp_PyExc_RuntimeError = PyDict_GetItemString(exdict, "RuntimeError");
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200899 p3imp_PyExc_ImportError = PyDict_GetItemString(exdict, "ImportError");
Bram Moolenaar141be8a2013-06-23 14:16:57 +0200900 p3imp_PyExc_OverflowError = PyDict_GetItemString(exdict, "OverflowError");
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200901 Py_XINCREF(p3imp_PyExc_AttributeError);
902 Py_XINCREF(p3imp_PyExc_IndexError);
Bram Moolenaaraf6abb92013-04-24 13:04:26 +0200903 Py_XINCREF(p3imp_PyExc_KeyError);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200904 Py_XINCREF(p3imp_PyExc_KeyboardInterrupt);
905 Py_XINCREF(p3imp_PyExc_TypeError);
906 Py_XINCREF(p3imp_PyExc_ValueError);
Bram Moolenaar41009372013-07-01 22:03:04 +0200907 Py_XINCREF(p3imp_PyExc_SystemExit);
Bram Moolenaar8661b172013-05-15 15:44:28 +0200908 Py_XINCREF(p3imp_PyExc_RuntimeError);
Bram Moolenaarc09a6d62013-06-10 21:27:29 +0200909 Py_XINCREF(p3imp_PyExc_ImportError);
Bram Moolenaar141be8a2013-06-23 14:16:57 +0200910 Py_XINCREF(p3imp_PyExc_OverflowError);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200911 Py_XDECREF(exmod);
912}
Bram Moolenaar2ab2e862019-12-04 21:24:53 +0100913#endif // DYNAMIC_PYTHON3
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200914
Bram Moolenaardb913952012-06-29 12:54:53 +0200915static int py3initialised = 0;
Bram Moolenaardb913952012-06-29 12:54:53 +0200916#define PYINITIALISED py3initialised
Bram Moolenaarc4f83382017-07-07 14:50:44 +0200917static int python_end_called = FALSE;
Bram Moolenaardb913952012-06-29 12:54:53 +0200918
Bram Moolenaar774267b2013-05-21 20:51:59 +0200919#define DESTRUCTOR_FINISH(self) Py_TYPE(self)->tp_free((PyObject*)self)
Bram Moolenaardb913952012-06-29 12:54:53 +0200920
Bram Moolenaar971db462013-05-12 18:44:48 +0200921#define WIN_PYTHON_REF(win) win->w_python3_ref
922#define BUF_PYTHON_REF(buf) buf->b_python3_ref
Bram Moolenaar5e538ec2013-05-15 15:12:29 +0200923#define TAB_PYTHON_REF(tab) tab->tp_python3_ref
Bram Moolenaar971db462013-05-12 18:44:48 +0200924
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200925 static void
926call_PyObject_Free(void *p)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200927{
Bram Moolenaar0014a532013-05-29 21:33:39 +0200928#if defined(Py_DEBUG) && !defined(Py_DEBUG_NO_PYMALLOC)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200929 _PyObject_DebugFree(p);
930#else
931 PyObject_Free(p);
932#endif
933}
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200934
935 static PyObject *
936call_PyType_GenericNew(PyTypeObject *type, PyObject *args, PyObject *kwds)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200937{
938 return PyType_GenericNew(type,args,kwds);
939}
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200940
941 static PyObject *
942call_PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200943{
944 return PyType_GenericAlloc(type,nitems);
945}
946
Bram Moolenaar4d1da492013-04-24 13:39:15 +0200947static PyObject *OutputGetattro(PyObject *, PyObject *);
948static int OutputSetattro(PyObject *, PyObject *, PyObject *);
949static PyObject *BufferGetattro(PyObject *, PyObject *);
Bram Moolenaare9ba5162013-05-29 22:02:22 +0200950static int BufferSetattro(PyObject *, PyObject *, PyObject *);
Bram Moolenaar5e538ec2013-05-15 15:12:29 +0200951static PyObject *TabPageGetattro(PyObject *, PyObject *);
Bram Moolenaar4d1da492013-04-24 13:39:15 +0200952static PyObject *WindowGetattro(PyObject *, PyObject *);
953static int WindowSetattro(PyObject *, PyObject *, PyObject *);
954static PyObject *RangeGetattro(PyObject *, PyObject *);
955static PyObject *CurrentGetattro(PyObject *, PyObject *);
956static int CurrentSetattro(PyObject *, PyObject *, PyObject *);
957static PyObject *DictionaryGetattro(PyObject *, PyObject *);
958static int DictionarySetattro(PyObject *, PyObject *, PyObject *);
959static PyObject *ListGetattro(PyObject *, PyObject *);
960static int ListSetattro(PyObject *, PyObject *, PyObject *);
961static PyObject *FunctionGetattro(PyObject *, PyObject *);
962
963static struct PyModuleDef vimmodule;
964
Bram Moolenaar2a0f3d32013-05-21 22:23:56 +0200965#define PY_CAN_RECURSE
966
Bram Moolenaar4d1da492013-04-24 13:39:15 +0200967/*
968 * Include the code shared with if_python.c
969 */
970#include "if_py_both.h"
971
Bram Moolenaar828bff12019-03-19 22:11:41 +0100972// NOTE: Must always be used at the start of a block, since it declares "name".
Bram Moolenaar4d1da492013-04-24 13:39:15 +0200973#define GET_ATTR_STRING(name, nameobj) \
974 char *name = ""; \
975 if (PyUnicode_Check(nameobj)) \
Bram Moolenaar828bff12019-03-19 22:11:41 +0100976 name = (char *)_PyUnicode_AsString(nameobj)
Bram Moolenaar4d1da492013-04-24 13:39:15 +0200977
978#define PY3OBJ_DELETED(obj) (obj->ob_base.ob_refcnt<=0)
979
Bram Moolenaar2ab2e862019-12-04 21:24:53 +0100980///////////////////////////////////////////////////////
981// Internal function prototypes.
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200982
Bram Moolenaar7854e3a2012-11-28 15:33:14 +0100983static PyObject *Py3Init_vim(void);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200984
Bram Moolenaar2ab2e862019-12-04 21:24:53 +0100985///////////////////////////////////////////////////////
986// 1. Python interpreter main program.
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200987
Bram Moolenaar170bf1a2010-07-24 23:51:45 +0200988 void
Bram Moolenaar68c2f632016-01-30 17:24:07 +0100989python3_end(void)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200990{
991 static int recurse = 0;
992
Bram Moolenaar2ab2e862019-12-04 21:24:53 +0100993 // If a crash occurs while doing this, don't try again.
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200994 if (recurse != 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +0200995 return;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200996
Bram Moolenaarc4f83382017-07-07 14:50:44 +0200997 python_end_called = TRUE;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +0200998 ++recurse;
999
1000#ifdef DYNAMIC_PYTHON3
1001 if (hinstPy3)
1002#endif
1003 if (Py_IsInitialized())
1004 {
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001005 // acquire lock before finalizing
Bram Moolenaar71700b82013-05-15 17:49:05 +02001006 PyGILState_Ensure();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001007
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001008 Py_Finalize();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001009 }
1010
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001011 --recurse;
1012}
1013
Bram Moolenaar094454f2015-10-07 10:39:55 +02001014#if (defined(DYNAMIC_PYTHON3) && defined(DYNAMIC_PYTHON) && defined(FEAT_PYTHON) && defined(UNIX)) || defined(PROTO)
Bram Moolenaar4c3a3262010-07-24 15:42:14 +02001015 int
Bram Moolenaar68c2f632016-01-30 17:24:07 +01001016python3_loaded(void)
Bram Moolenaar4c3a3262010-07-24 15:42:14 +02001017{
1018 return (hinstPy3 != 0);
1019}
1020#endif
1021
Bram Moolenaar94073162018-01-31 21:49:05 +01001022static wchar_t *py_home_buf = NULL;
1023
Bram Moolenaar56b8dc32020-08-06 21:47:11 +02001024#if defined(MSWIN) && (PY_VERSION_HEX >= 0x030500f0)
Bram Moolenaarc6ed2542020-10-10 23:26:28 +02001025/*
1026 * Return TRUE if stdin is readable from Python 3.
1027 */
1028 static BOOL
1029is_stdin_readable(void)
1030{
1031 DWORD mode, eventnum;
1032 struct _stat st;
1033 int fd = fileno(stdin);
1034 HANDLE hstdin = (HANDLE)_get_osfhandle(fd);
1035
1036 // Check if stdin is connected to the console.
1037 if (GetConsoleMode(hstdin, &mode))
1038 // Check if it is opened as input.
1039 return GetNumberOfConsoleInputEvents(hstdin, &eventnum);
1040
1041 return _fstat(fd, &st) == 0;
1042}
1043
1044// Python 3.5 or later will abort inside Py_Initialize() when stdin has
1045// been closed (i.e. executed by "vim -"). Reconnect stdin to CONIN$.
Bram Moolenaar56b8dc32020-08-06 21:47:11 +02001046// Note that the python DLL is linked to its own stdio DLL which can be
1047// differ from Vim's stdio.
1048 static void
1049reset_stdin(void)
1050{
1051 FILE *(*py__acrt_iob_func)(unsigned) = NULL;
1052 FILE *(*pyfreopen)(const char *, const char *, FILE *) = NULL;
Bram Moolenaar63ff72a2022-02-07 13:54:01 +00001053 HINSTANCE hinst = hinstPy3;
Bram Moolenaar56b8dc32020-08-06 21:47:11 +02001054
Bram Moolenaarc6ed2542020-10-10 23:26:28 +02001055 if (hinst == NULL || is_stdin_readable())
Bram Moolenaar56b8dc32020-08-06 21:47:11 +02001056 return;
1057
1058 // Get "freopen" and "stdin" which are used in the python DLL.
1059 // "stdin" is defined as "__acrt_iob_func(0)" in VC++ 2015 or later.
1060 py__acrt_iob_func = get_dll_import_func(hinst, "__acrt_iob_func");
1061 if (py__acrt_iob_func)
1062 {
1063 HINSTANCE hpystdiodll = find_imported_module_by_funcname(hinst,
Bram Moolenaar253b16a2020-10-06 19:59:06 +02001064 "__acrt_iob_func");
Bram Moolenaar56b8dc32020-08-06 21:47:11 +02001065 if (hpystdiodll)
Bram Moolenaar253b16a2020-10-06 19:59:06 +02001066 pyfreopen = (void *)GetProcAddress(hpystdiodll, "freopen");
Bram Moolenaar56b8dc32020-08-06 21:47:11 +02001067 }
1068
Bram Moolenaarc6ed2542020-10-10 23:26:28 +02001069 // Reconnect stdin to CONIN$.
Bram Moolenaar253b16a2020-10-06 19:59:06 +02001070 if (pyfreopen != NULL)
Bram Moolenaarc6ed2542020-10-10 23:26:28 +02001071 pyfreopen("CONIN$", "r", py__acrt_iob_func(0));
Bram Moolenaar56b8dc32020-08-06 21:47:11 +02001072 else
Bram Moolenaarc6ed2542020-10-10 23:26:28 +02001073 freopen("CONIN$", "r", stdin);
Bram Moolenaar56b8dc32020-08-06 21:47:11 +02001074}
1075#else
1076# define reset_stdin()
1077#endif
1078
Bram Moolenaar63ff72a2022-02-07 13:54:01 +00001079// Python 3.2 or later will abort inside Py_Initialize() when mandatory
1080// modules cannot be loaded (e.g. 'pythonthreehome' is wrongly set.).
1081// Install a hook to python dll's exit() and recover from it.
1082#if defined(MSWIN) && (PY_VERSION_HEX >= 0x030200f0)
1083# define HOOK_EXIT
1084# include <setjmp.h>
1085
1086static jmp_buf exit_hook_jump_buf;
1087static void *orig_exit = NULL;
1088
1089/*
1090 * Function that replaces exit() while calling Py_Initialize().
1091 */
1092 static void
1093hooked_exit(int ret)
1094{
1095 // Recover from exit.
1096 longjmp(exit_hook_jump_buf, 1);
1097}
1098
1099/*
1100 * Install a hook to python dll's exit().
1101 */
1102 static void
1103hook_py_exit(void)
1104{
1105 HINSTANCE hinst = hinstPy3;
1106
1107 if (hinst == NULL || orig_exit != NULL)
1108 return;
1109
1110 orig_exit = hook_dll_import_func(hinst, "exit", (void *)hooked_exit);
1111}
1112
1113/*
1114 * Remove the hook installed by hook_py_exit().
1115 */
1116 static void
1117restore_py_exit(void)
1118{
1119 HINSTANCE hinst = hinstPy3;
1120
1121 if (hinst == NULL)
1122 return;
1123
1124 if (orig_exit != NULL)
1125 hook_dll_import_func(hinst, "exit", orig_exit);
1126 orig_exit = NULL;
1127}
1128#endif
1129
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001130 static int
1131Python3_Init(void)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001132{
1133 if (!py3initialised)
1134 {
1135#ifdef DYNAMIC_PYTHON3
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001136 if (!python3_enabled(TRUE))
1137 {
Bram Moolenaar9a846fb2022-01-01 21:59:18 +00001138 emsg(_(e_sorry_this_command_is_disabled_python_library_could_not_be_found));
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001139 goto fail;
1140 }
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001141#endif
1142
1143 init_structs();
1144
Bram Moolenaar94073162018-01-31 21:49:05 +01001145 if (*p_py3home != NUL)
1146 {
1147 size_t len = mbstowcs(NULL, (char *)p_py3home, 0) + 1;
Bram Moolenaar644d37b2010-11-16 19:26:02 +01001148
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001149 // The string must not change later, make a copy in static memory.
Bram Moolenaarc799fe22019-05-28 23:08:19 +02001150 py_home_buf = ALLOC_MULT(wchar_t, len);
Bram Moolenaar94073162018-01-31 21:49:05 +01001151 if (py_home_buf != NULL && mbstowcs(
1152 py_home_buf, (char *)p_py3home, len) != (size_t)-1)
1153 Py_SetPythonHome(py_home_buf);
1154 }
Bram Moolenaar644d37b2010-11-16 19:26:02 +01001155#ifdef PYTHON3_HOME
Bram Moolenaar94073162018-01-31 21:49:05 +01001156 else if (mch_getenv((char_u *)"PYTHONHOME") == NULL)
Bram Moolenaar10005652015-12-31 21:03:23 +01001157 Py_SetPythonHome(PYTHON3_HOME);
Bram Moolenaar644d37b2010-11-16 19:26:02 +01001158#endif
1159
Bram Moolenaar7bc4f932012-10-14 03:22:56 +02001160 PyImport_AppendInittab("vim", Py3Init_vim);
1161
Bram Moolenaar63ff72a2022-02-07 13:54:01 +00001162#if !defined(DYNAMIC_PYTHON3) && defined(MSWIN)
1163 hinstPy3 = GetModuleHandle(PYTHON3_DLL);
1164#endif
Bram Moolenaar56b8dc32020-08-06 21:47:11 +02001165 reset_stdin();
Bram Moolenaar63ff72a2022-02-07 13:54:01 +00001166
1167#ifdef HOOK_EXIT
1168 // Catch exit() called in Py_Initialize().
1169 hook_py_exit();
1170 if (setjmp(exit_hook_jump_buf) == 0)
Bram Moolenaar63ff72a2022-02-07 13:54:01 +00001171 {
1172 Py_Initialize();
Bram Moolenaar63ff72a2022-02-07 13:54:01 +00001173 restore_py_exit();
Bram Moolenaar63ff72a2022-02-07 13:54:01 +00001174 }
Bram Moolenaar63ff72a2022-02-07 13:54:01 +00001175 else
1176 {
1177 // exit() was called in Py_Initialize().
1178 restore_py_exit();
1179 emsg(_(e_critical_error_in_python3_initialization_check_your_installation));
1180 goto fail;
1181 }
K.Takataa7fbaa42022-12-26 14:46:51 +00001182#else
1183 Py_Initialize();
Bram Moolenaar63ff72a2022-02-07 13:54:01 +00001184#endif
Bram Moolenaard0573012017-10-28 21:11:06 +02001185
Bram Moolenaarefc0d942020-10-11 18:05:02 +02001186#if PY_VERSION_HEX < 0x03090000
1187 // Initialise threads. This is deprecated since Python 3.9.
Bram Moolenaar456f2bb2011-06-12 21:37:13 +02001188 PyEval_InitThreads();
Bram Moolenaarefc0d942020-10-11 18:05:02 +02001189#endif
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001190#ifdef DYNAMIC_PYTHON3
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001191 get_py3_exceptions();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001192#endif
1193
Bram Moolenaar1dc28782013-05-21 19:11:01 +02001194 if (PythonIO_Init_io())
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001195 goto fail;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001196
Bram Moolenaardb913952012-06-29 12:54:53 +02001197 globals = PyModule_GetDict(PyImport_AddModule("__main__"));
1198
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001199 // Remove the element from sys.path that was added because of our
1200 // argv[0] value in Py3Init_vim(). Previously we used an empty
1201 // string, but depending on the OS we then get an empty entry or
1202 // the current directory in sys.path.
1203 // Only after vim has been imported, the element does exist in
1204 // sys.path.
Bram Moolenaar19e60942011-06-19 00:27:51 +02001205 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 +02001206
Bram Moolenaarefc0d942020-10-11 18:05:02 +02001207 // Without the call to PyEval_SaveThread, thread specific state (such
1208 // as the system trace hook), will be lost between invocations of
1209 // Python code.
1210 // GIL may have been created and acquired in PyEval_InitThreads() and
1211 // thread state is created in Py_Initialize(); there
1212 // _PyGILState_NoteThreadState() also sets gilcounter to 1 (python must
1213 // have threads enabled!), so the following does both: unlock GIL and
1214 // save thread state in TLS without deleting thread state
Bram Moolenaar76d711c2013-02-13 14:17:08 +01001215 PyEval_SaveThread();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001216
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001217 py3initialised = 1;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001218 }
1219
1220 return 0;
1221
1222fail:
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001223 // We call PythonIO_Flush() here to print any Python errors.
1224 // This is OK, as it is possible to call this function even
1225 // if PythonIO_Init_io() has not completed successfully (it will
1226 // not do anything in this case).
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001227 PythonIO_Flush();
1228 return -1;
1229}
1230
1231/*
1232 * External interface
1233 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001234 static void
Bram Moolenaarb52f4c02013-05-21 18:19:38 +02001235DoPyCommand(const char *cmd, rangeinitializer init_range, runner run, void *arg)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001236{
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001237#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001238 char *saved_locale;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001239#endif
Bram Moolenaar19e60942011-06-19 00:27:51 +02001240 PyObject *cmdstr;
1241 PyObject *cmdbytes;
Bram Moolenaar71700b82013-05-15 17:49:05 +02001242 PyGILState_STATE pygilstate;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001243
Bram Moolenaarc4f83382017-07-07 14:50:44 +02001244 if (python_end_called)
1245 goto theend;
1246
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001247 if (Python3_Init())
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001248 goto theend;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001249
Bram Moolenaarb52f4c02013-05-21 18:19:38 +02001250 init_range(arg);
1251
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001252 Python_Release_Vim(); // leave Vim
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001253
1254#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001255 // Python only works properly when the LC_NUMERIC locale is "C".
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001256 saved_locale = setlocale(LC_NUMERIC, NULL);
1257 if (saved_locale == NULL || STRCMP(saved_locale, "C") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001258 saved_locale = NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001259 else
1260 {
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001261 // Need to make a copy, value may change when setting new locale.
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001262 saved_locale = (char *)vim_strsave((char_u *)saved_locale);
1263 (void)setlocale(LC_NUMERIC, "C");
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001264 }
1265#endif
1266
1267 pygilstate = PyGILState_Ensure();
1268
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001269 // PyRun_SimpleString expects a UTF-8 string. Wrong encoding may cause
1270 // SyntaxError (unicode error).
Bram Moolenaar3d64a312011-07-15 15:54:44 +02001271 cmdstr = PyUnicode_Decode(cmd, strlen(cmd),
Bram Moolenaar2e2f52a2020-12-21 16:03:02 +01001272 (char *)ENC_OPT, ERRORS_DECODE_ARG);
1273 cmdbytes = PyUnicode_AsEncodedString(cmdstr, "utf-8", ERRORS_ENCODE_ARG);
Bram Moolenaar19e60942011-06-19 00:27:51 +02001274 Py_XDECREF(cmdstr);
Bram Moolenaardb913952012-06-29 12:54:53 +02001275
Bram Moolenaarb52f4c02013-05-21 18:19:38 +02001276 run(PyBytes_AsString(cmdbytes), arg, &pygilstate);
Bram Moolenaar19e60942011-06-19 00:27:51 +02001277 Py_XDECREF(cmdbytes);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001278
1279 PyGILState_Release(pygilstate);
1280
1281#if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
1282 if (saved_locale != NULL)
1283 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001284 (void)setlocale(LC_NUMERIC, saved_locale);
1285 vim_free(saved_locale);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001286 }
1287#endif
1288
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001289 Python_Lock_Vim(); // enter Vim
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001290 PythonIO_Flush();
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001291
1292theend:
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001293 return; // keeps lint happy
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001294}
1295
1296/*
Bram Moolenaar368373e2010-07-19 20:46:22 +02001297 * ":py3"
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001298 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001299 void
1300ex_py3(exarg_T *eap)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001301{
1302 char_u *script;
1303
1304 script = script_get(eap, eap->arg);
1305 if (!eap->skip)
1306 {
Bram Moolenaar14816ad2019-02-18 22:04:56 +01001307 if (p_pyx == 0)
1308 p_pyx = 3;
1309
Bram Moolenaarb52f4c02013-05-21 18:19:38 +02001310 DoPyCommand(script == NULL ? (char *) eap->arg : (char *) script,
1311 (rangeinitializer) init_range_cmd,
1312 (runner) run_cmd,
1313 (void *) eap);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001314 }
1315 vim_free(script);
1316}
1317
1318#define BUFFER_SIZE 2048
1319
1320/*
Bram Moolenaar6df6f472010-07-18 18:04:50 +02001321 * ":py3file"
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001322 */
1323 void
1324ex_py3file(exarg_T *eap)
1325{
1326 static char buffer[BUFFER_SIZE];
1327 const char *file;
1328 char *p;
1329 int i;
1330
Bram Moolenaarf42dd3c2017-01-28 16:06:38 +01001331 if (p_pyx == 0)
1332 p_pyx = 3;
1333
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001334 // Have to do it like this. PyRun_SimpleFile requires you to pass a
1335 // stdio file pointer, but Vim and the Python DLL are compiled with
1336 // different options under Windows, meaning that stdio pointers aren't
1337 // compatible between the two. Yuk.
1338 //
1339 // construct: exec(compile(open('a_filename', 'rb').read(), 'a_filename', 'exec'))
1340 //
1341 // Using bytes so that Python can detect the source encoding as it normally
1342 // does. The doc does not say "compile" accept bytes, though.
1343 //
1344 // We need to escape any backslashes or single quotes in the file name, so that
1345 // Python won't mangle the file name.
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001346
1347 strcpy(buffer, "exec(compile(open('");
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001348 p = buffer + 19; // size of "exec(compile(open('"
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001349
1350 for (i=0; i<2; ++i)
1351 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001352 file = (char *)eap->arg;
1353 while (*file && p < buffer + (BUFFER_SIZE - 3))
1354 {
1355 if (*file == '\\' || *file == '\'')
1356 *p++ = '\\';
1357 *p++ = *file++;
1358 }
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001359 // If we didn't finish the file name, we hit a buffer overflow
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001360 if (*file != '\0')
1361 return;
1362 if (i==0)
1363 {
Bram Moolenaar19e60942011-06-19 00:27:51 +02001364 strcpy(p,"','rb').read(),'");
1365 p += 16;
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001366 }
1367 else
1368 {
1369 strcpy(p,"','exec'))");
1370 p += 10;
1371 }
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001372 }
1373
1374
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001375 // Execute the file
Bram Moolenaarb52f4c02013-05-21 18:19:38 +02001376 DoPyCommand(buffer,
1377 (rangeinitializer) init_range_cmd,
1378 (runner) run_cmd,
1379 (void *) eap);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001380}
1381
Bram Moolenaar54e8f002013-05-15 19:44:39 +02001382 void
1383ex_py3do(exarg_T *eap)
Bram Moolenaar3dab2802013-05-15 18:28:13 +02001384{
Bram Moolenaarf42dd3c2017-01-28 16:06:38 +01001385 if (p_pyx == 0)
1386 p_pyx = 3;
1387
Bram Moolenaarb52f4c02013-05-21 18:19:38 +02001388 DoPyCommand((char *)eap->arg,
1389 (rangeinitializer)init_range_cmd,
1390 (runner)run_do,
1391 (void *)eap);
Bram Moolenaar3dab2802013-05-15 18:28:13 +02001392}
1393
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001394///////////////////////////////////////////////////////
1395// 2. Python output stream: writes output via [e]msg().
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001396
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001397// Implementation functions
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001398
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001399 static PyObject *
1400OutputGetattro(PyObject *self, PyObject *nameobj)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001401{
Bram Moolenaar77045652012-09-21 13:46:06 +02001402 GET_ATTR_STRING(name, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001403
1404 if (strcmp(name, "softspace") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001405 return PyLong_FromLong(((OutputObject *)(self))->softspace);
Bram Moolenaar6d4431e2016-04-21 20:00:56 +02001406 else if (strcmp(name, "errors") == 0)
1407 return PyString_FromString("strict");
1408 else if (strcmp(name, "encoding") == 0)
1409 return PyString_FromString(ENC_OPT);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001410
1411 return PyObject_GenericGetAttr(self, nameobj);
1412}
1413
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001414 static int
1415OutputSetattro(PyObject *self, PyObject *nameobj, PyObject *val)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001416{
Bram Moolenaar77045652012-09-21 13:46:06 +02001417 GET_ATTR_STRING(name, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001418
Bram Moolenaard6e39182013-05-21 18:30:34 +02001419 return OutputSetattr((OutputObject *)(self), name, val);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001420}
1421
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001422///////////////////////////////////////////////////////
1423// 3. Implementation of the Vim module for Python
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001424
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001425// Window type - Implementation functions
1426// --------------------------------------
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001427
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001428#define WindowType_Check(obj) ((obj)->ob_base.ob_type == &WindowType)
1429
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001430// Buffer type - Implementation functions
1431// --------------------------------------
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001432
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001433#define BufferType_Check(obj) ((obj)->ob_base.ob_type == &BufferType)
1434
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001435static PyObject* BufferSubscript(PyObject *self, PyObject *idx);
Bram Moolenaar4ce5fe42020-10-21 21:01:59 +02001436static int BufferAsSubscript(PyObject *self, PyObject *idx, PyObject *val);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001437
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001438// Line range type - Implementation functions
1439// --------------------------------------
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001440
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001441#define RangeType_Check(obj) ((obj)->ob_base.ob_type == &RangeType)
1442
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001443static PyObject* RangeSubscript(PyObject *self, PyObject *idx);
Bram Moolenaar4ce5fe42020-10-21 21:01:59 +02001444static int RangeAsItem(PyObject *, Py_ssize_t, PyObject *);
1445static int RangeAsSubscript(PyObject *self, PyObject *idx, PyObject *val);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001446
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001447// Current objects type - Implementation functions
1448// -----------------------------------------------
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001449
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001450static PySequenceMethods BufferAsSeq = {
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001451 (lenfunc) BufferLength, // sq_length, len(x)
1452 (binaryfunc) 0, // sq_concat, x+y
1453 (ssizeargfunc) 0, // sq_repeat, x*n
1454 (ssizeargfunc) BufferItem, // sq_item, x[i]
1455 0, // was_sq_slice, x[i:j]
1456 0, // sq_ass_item, x[i]=v
1457 0, // sq_ass_slice, x[i:j]=v
1458 0, // sq_contains
1459 0, // sq_inplace_concat
1460 0, // sq_inplace_repeat
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001461};
1462
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001463static PyMappingMethods BufferAsMapping = {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001464 /* mp_length */ (lenfunc)BufferLength,
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001465 /* mp_subscript */ (binaryfunc)BufferSubscript,
Bram Moolenaar19e60942011-06-19 00:27:51 +02001466 /* mp_ass_subscript */ (objobjargproc)BufferAsSubscript,
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001467};
1468
1469
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001470// Buffer object
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001471
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001472 static PyObject *
Bram Moolenaar9e822c02013-05-29 22:15:30 +02001473BufferGetattro(PyObject *self, PyObject *nameobj)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001474{
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001475 PyObject *r;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001476
Bram Moolenaar77045652012-09-21 13:46:06 +02001477 GET_ATTR_STRING(name, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001478
Bram Moolenaar9e822c02013-05-29 22:15:30 +02001479 if ((r = BufferAttrValid((BufferObject *)(self), name)))
1480 return r;
1481
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001482 if (CheckBuffer((BufferObject *)(self)))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001483 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001484
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001485 r = BufferAttr((BufferObject *)(self), name);
1486 if (r || PyErr_Occurred())
1487 return r;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001488 else
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001489 return PyObject_GenericGetAttr(self, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001490}
1491
Bram Moolenaare9ba5162013-05-29 22:02:22 +02001492 static int
1493BufferSetattro(PyObject *self, PyObject *nameobj, PyObject *val)
1494{
1495 GET_ATTR_STRING(name, nameobj);
1496
1497 return BufferSetattr((BufferObject *)(self), name, val);
1498}
1499
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001500//////////////////
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001501
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001502 static PyObject *
1503BufferSubscript(PyObject *self, PyObject* idx)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001504{
Bram Moolenaardb913952012-06-29 12:54:53 +02001505 if (PyLong_Check(idx))
1506 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001507 long _idx = PyLong_AsLong(idx);
Bram Moolenaard6e39182013-05-21 18:30:34 +02001508 return BufferItem((BufferObject *)(self), _idx);
Bram Moolenaarebfec1c2023-01-22 21:14:53 +00001509 }
1510 else if (PySlice_Check(idx))
Bram Moolenaardb913952012-06-29 12:54:53 +02001511 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001512 Py_ssize_t start, stop, step, slicelen;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001513
Bram Moolenaar8f1723d2013-05-12 20:36:14 +02001514 if (CheckBuffer((BufferObject *) self))
1515 return NULL;
1516
Bram Moolenaar922a4662014-03-30 16:11:43 +02001517 if (PySlice_GetIndicesEx((PySliceObject_T *)idx,
Bram Moolenaarbd80f352013-05-12 21:16:23 +02001518 (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count,
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001519 &start, &stop,
Bram Moolenaardb913952012-06-29 12:54:53 +02001520 &step, &slicelen) < 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001521 return NULL;
Bram Moolenaard6e39182013-05-21 18:30:34 +02001522 return BufferSlice((BufferObject *)(self), start, stop);
Bram Moolenaardb913952012-06-29 12:54:53 +02001523 }
1524 else
1525 {
Bram Moolenaarc476e522013-06-23 13:46:40 +02001526 RAISE_INVALID_INDEX_TYPE(idx);
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001527 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001528 }
1529}
1530
Bram Moolenaar4ce5fe42020-10-21 21:01:59 +02001531 static int
Bram Moolenaar19e60942011-06-19 00:27:51 +02001532BufferAsSubscript(PyObject *self, PyObject* idx, PyObject* val)
1533{
Bram Moolenaardb913952012-06-29 12:54:53 +02001534 if (PyLong_Check(idx))
1535 {
Bram Moolenaar19e60942011-06-19 00:27:51 +02001536 long n = PyLong_AsLong(idx);
Bram Moolenaarab589462020-07-06 21:03:06 +02001537
1538 if (CheckBuffer((BufferObject *) self))
1539 return -1;
1540
Bram Moolenaar19e60942011-06-19 00:27:51 +02001541 return RBAsItem((BufferObject *)(self), n, val, 1,
1542 (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1543 NULL);
Bram Moolenaarebfec1c2023-01-22 21:14:53 +00001544 }
1545 else if (PySlice_Check(idx))
Bram Moolenaardb913952012-06-29 12:54:53 +02001546 {
Bram Moolenaar19e60942011-06-19 00:27:51 +02001547 Py_ssize_t start, stop, step, slicelen;
1548
Bram Moolenaar8f1723d2013-05-12 20:36:14 +02001549 if (CheckBuffer((BufferObject *) self))
1550 return -1;
1551
Bram Moolenaar922a4662014-03-30 16:11:43 +02001552 if (PySlice_GetIndicesEx((PySliceObject_T *)idx,
Bram Moolenaarbd80f352013-05-12 21:16:23 +02001553 (Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count,
Bram Moolenaar19e60942011-06-19 00:27:51 +02001554 &start, &stop,
Bram Moolenaardb913952012-06-29 12:54:53 +02001555 &step, &slicelen) < 0)
Bram Moolenaar19e60942011-06-19 00:27:51 +02001556 return -1;
Bram Moolenaar19e60942011-06-19 00:27:51 +02001557 return RBAsSlice((BufferObject *)(self), start, stop, val, 1,
1558 (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
1559 NULL);
Bram Moolenaardb913952012-06-29 12:54:53 +02001560 }
1561 else
1562 {
Bram Moolenaarc476e522013-06-23 13:46:40 +02001563 RAISE_INVALID_INDEX_TYPE(idx);
Bram Moolenaar19e60942011-06-19 00:27:51 +02001564 return -1;
1565 }
1566}
1567
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001568static PySequenceMethods RangeAsSeq = {
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001569 (lenfunc) RangeLength, // sq_length, len(x)
1570 (binaryfunc) 0, // RangeConcat, sq_concat, x+y
1571 (ssizeargfunc) 0, // RangeRepeat, sq_repeat, x*n
1572 (ssizeargfunc) RangeItem, // sq_item, x[i]
1573 0, // was_sq_slice, x[i:j]
1574 (ssizeobjargproc) RangeAsItem, // sq_as_item, x[i]=v
1575 0, // sq_ass_slice, x[i:j]=v
1576 0, // sq_contains
1577 0, // sq_inplace_concat
1578 0, // sq_inplace_repeat
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001579};
1580
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001581static PyMappingMethods RangeAsMapping = {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001582 /* mp_length */ (lenfunc)RangeLength,
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001583 /* mp_subscript */ (binaryfunc)RangeSubscript,
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001584 /* mp_ass_subscript */ (objobjargproc)RangeAsSubscript,
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001585};
1586
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001587// Line range object - Implementation
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001588
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001589 static PyObject *
1590RangeGetattro(PyObject *self, PyObject *nameobj)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001591{
Bram Moolenaar77045652012-09-21 13:46:06 +02001592 GET_ATTR_STRING(name, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001593
1594 if (strcmp(name, "start") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001595 return Py_BuildValue("n", ((RangeObject *)(self))->start - 1);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001596 else if (strcmp(name, "end") == 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001597 return Py_BuildValue("n", ((RangeObject *)(self))->end - 1);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001598 else
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001599 return PyObject_GenericGetAttr(self, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001600}
1601
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001602////////////////
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001603
Bram Moolenaar4ce5fe42020-10-21 21:01:59 +02001604 static int
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001605RangeAsItem(PyObject *self, Py_ssize_t n, PyObject *val)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001606{
1607 return RBAsItem(((RangeObject *)(self))->buf, n, val,
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001608 ((RangeObject *)(self))->start,
1609 ((RangeObject *)(self))->end,
1610 &((RangeObject *)(self))->end);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001611}
1612
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001613 static Py_ssize_t
1614RangeAsSlice(PyObject *self, Py_ssize_t lo, Py_ssize_t hi, PyObject *val)
1615{
1616 return RBAsSlice(((RangeObject *)(self))->buf, lo, hi, val,
1617 ((RangeObject *)(self))->start,
1618 ((RangeObject *)(self))->end,
1619 &((RangeObject *)(self))->end);
1620}
1621
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001622 static PyObject *
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001623RangeSubscript(PyObject *self, PyObject* idx)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001624{
Bram Moolenaardb913952012-06-29 12:54:53 +02001625 if (PyLong_Check(idx))
1626 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001627 long _idx = PyLong_AsLong(idx);
Bram Moolenaard6e39182013-05-21 18:30:34 +02001628 return RangeItem((RangeObject *)(self), _idx);
Bram Moolenaarebfec1c2023-01-22 21:14:53 +00001629 }
1630 else if (PySlice_Check(idx))
Bram Moolenaardb913952012-06-29 12:54:53 +02001631 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001632 Py_ssize_t start, stop, step, slicelen;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001633
Bram Moolenaar922a4662014-03-30 16:11:43 +02001634 if (PySlice_GetIndicesEx((PySliceObject_T *)idx,
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001635 ((RangeObject *)(self))->end-((RangeObject *)(self))->start+1,
1636 &start, &stop,
Bram Moolenaardb913952012-06-29 12:54:53 +02001637 &step, &slicelen) < 0)
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001638 return NULL;
Bram Moolenaard6e39182013-05-21 18:30:34 +02001639 return RangeSlice((RangeObject *)(self), start, stop);
Bram Moolenaardb913952012-06-29 12:54:53 +02001640 }
1641 else
1642 {
Bram Moolenaarc476e522013-06-23 13:46:40 +02001643 RAISE_INVALID_INDEX_TYPE(idx);
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001644 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001645 }
1646}
1647
Bram Moolenaar4ce5fe42020-10-21 21:01:59 +02001648 static int
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001649RangeAsSubscript(PyObject *self, PyObject *idx, PyObject *val)
1650{
Bram Moolenaardb913952012-06-29 12:54:53 +02001651 if (PyLong_Check(idx))
1652 {
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001653 long n = PyLong_AsLong(idx);
1654 return RangeAsItem(self, n, val);
Bram Moolenaarabab0b02019-03-30 18:47:01 +01001655 }
1656 else if (PySlice_Check(idx))
Bram Moolenaardb913952012-06-29 12:54:53 +02001657 {
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001658 Py_ssize_t start, stop, step, slicelen;
1659
Bram Moolenaar922a4662014-03-30 16:11:43 +02001660 if (PySlice_GetIndicesEx((PySliceObject_T *)idx,
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001661 ((RangeObject *)(self))->end-((RangeObject *)(self))->start+1,
1662 &start, &stop,
Bram Moolenaardb913952012-06-29 12:54:53 +02001663 &step, &slicelen) < 0)
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001664 return -1;
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001665 return RangeAsSlice(self, start, stop, val);
Bram Moolenaardb913952012-06-29 12:54:53 +02001666 }
1667 else
1668 {
Bram Moolenaarc476e522013-06-23 13:46:40 +02001669 RAISE_INVALID_INDEX_TYPE(idx);
Bram Moolenaarba4897e2011-09-14 15:01:58 +02001670 return -1;
1671 }
1672}
1673
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001674// TabPage object - Implementation
Bram Moolenaar5e538ec2013-05-15 15:12:29 +02001675
1676 static PyObject *
1677TabPageGetattro(PyObject *self, PyObject *nameobj)
1678{
1679 PyObject *r;
1680
1681 GET_ATTR_STRING(name, nameobj);
1682
Bram Moolenaar9e822c02013-05-29 22:15:30 +02001683 if ((r = TabPageAttrValid((TabPageObject *)(self), name)))
1684 return r;
1685
Bram Moolenaar5e538ec2013-05-15 15:12:29 +02001686 if (CheckTabPage((TabPageObject *)(self)))
1687 return NULL;
1688
1689 r = TabPageAttr((TabPageObject *)(self), name);
1690 if (r || PyErr_Occurred())
1691 return r;
1692 else
1693 return PyObject_GenericGetAttr(self, nameobj);
1694}
1695
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001696// Window object - Implementation
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001697
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001698 static PyObject *
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001699WindowGetattro(PyObject *self, PyObject *nameobj)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001700{
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001701 PyObject *r;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001702
Bram Moolenaar77045652012-09-21 13:46:06 +02001703 GET_ATTR_STRING(name, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001704
Bram Moolenaar9e822c02013-05-29 22:15:30 +02001705 if ((r = WindowAttrValid((WindowObject *)(self), name)))
1706 return r;
1707
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001708 if (CheckWindow((WindowObject *)(self)))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001709 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001710
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001711 r = WindowAttr((WindowObject *)(self), name);
1712 if (r || PyErr_Occurred())
1713 return r;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001714 else
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001715 return PyObject_GenericGetAttr(self, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001716}
1717
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001718 static int
1719WindowSetattro(PyObject *self, PyObject *nameobj, PyObject *val)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001720{
Bram Moolenaar77045652012-09-21 13:46:06 +02001721 GET_ATTR_STRING(name, nameobj);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001722
Bram Moolenaard6e39182013-05-21 18:30:34 +02001723 return WindowSetattr((WindowObject *)(self), name, val);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001724}
1725
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001726// Tab page list object - Definitions
Bram Moolenaar5e538ec2013-05-15 15:12:29 +02001727
1728static PySequenceMethods TabListAsSeq = {
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001729 (lenfunc) TabListLength, // sq_length, len(x)
1730 (binaryfunc) 0, // sq_concat, x+y
1731 (ssizeargfunc) 0, // sq_repeat, x*n
1732 (ssizeargfunc) TabListItem, // sq_item, x[i]
1733 0, // sq_slice, x[i:j]
1734 (ssizeobjargproc)0, // sq_as_item, x[i]=v
1735 0, // sq_ass_slice, x[i:j]=v
1736 0, // sq_contains
1737 0, // sq_inplace_concat
1738 0, // sq_inplace_repeat
Bram Moolenaar5e538ec2013-05-15 15:12:29 +02001739};
1740
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001741// Window list object - Definitions
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001742
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001743static PySequenceMethods WinListAsSeq = {
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001744 (lenfunc) WinListLength, // sq_length, len(x)
1745 (binaryfunc) 0, // sq_concat, x+y
1746 (ssizeargfunc) 0, // sq_repeat, x*n
1747 (ssizeargfunc) WinListItem, // sq_item, x[i]
1748 0, // sq_slice, x[i:j]
1749 (ssizeobjargproc)0, // sq_as_item, x[i]=v
1750 0, // sq_ass_slice, x[i:j]=v
1751 0, // sq_contains
1752 0, // sq_inplace_concat
1753 0, // sq_inplace_repeat
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001754};
1755
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001756/*
1757 * Current items object - Implementation
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001758 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001759 static PyObject *
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001760CurrentGetattro(PyObject *self, PyObject *nameobj)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001761{
Bram Moolenaardd8aca62013-05-29 22:36:10 +02001762 PyObject *r;
Bram Moolenaar77045652012-09-21 13:46:06 +02001763 GET_ATTR_STRING(name, nameobj);
Bram Moolenaardd8aca62013-05-29 22:36:10 +02001764 if (!(r = CurrentGetattr(self, name)))
1765 return PyObject_GenericGetAttr(self, nameobj);
1766 return r;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001767}
1768
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001769 static int
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001770CurrentSetattro(PyObject *self, PyObject *nameobj, PyObject *value)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001771{
Bram Moolenaar4d1da492013-04-24 13:39:15 +02001772 GET_ATTR_STRING(name, nameobj);
1773 return CurrentSetattr(self, name, value);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001774}
1775
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001776// Dictionary object - Definitions
Bram Moolenaardb913952012-06-29 12:54:53 +02001777
Bram Moolenaar66b79852012-09-21 14:00:35 +02001778 static PyObject *
1779DictionaryGetattro(PyObject *self, PyObject *nameobj)
1780{
1781 DictionaryObject *this = ((DictionaryObject *) (self));
1782
1783 GET_ATTR_STRING(name, nameobj);
1784
1785 if (strcmp(name, "locked") == 0)
1786 return PyLong_FromLong(this->dict->dv_lock);
1787 else if (strcmp(name, "scope") == 0)
1788 return PyLong_FromLong(this->dict->dv_scope);
1789
1790 return PyObject_GenericGetAttr(self, nameobj);
1791}
1792
1793 static int
1794DictionarySetattro(PyObject *self, PyObject *nameobj, PyObject *val)
1795{
1796 GET_ATTR_STRING(name, nameobj);
Bram Moolenaard6e39182013-05-21 18:30:34 +02001797 return DictionarySetattr((DictionaryObject *)(self), name, val);
Bram Moolenaardb913952012-06-29 12:54:53 +02001798}
1799
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001800// List object - Definitions
Bram Moolenaardb913952012-06-29 12:54:53 +02001801
Bram Moolenaar66b79852012-09-21 14:00:35 +02001802 static PyObject *
1803ListGetattro(PyObject *self, PyObject *nameobj)
1804{
1805 GET_ATTR_STRING(name, nameobj);
1806
1807 if (strcmp(name, "locked") == 0)
1808 return PyLong_FromLong(((ListObject *) (self))->list->lv_lock);
1809
1810 return PyObject_GenericGetAttr(self, nameobj);
1811}
1812
1813 static int
1814ListSetattro(PyObject *self, PyObject *nameobj, PyObject *val)
1815{
1816 GET_ATTR_STRING(name, nameobj);
Bram Moolenaard6e39182013-05-21 18:30:34 +02001817 return ListSetattr((ListObject *)(self), name, val);
Bram Moolenaardb913952012-06-29 12:54:53 +02001818}
1819
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001820// Function object - Definitions
Bram Moolenaardb913952012-06-29 12:54:53 +02001821
Bram Moolenaardb913952012-06-29 12:54:53 +02001822 static PyObject *
1823FunctionGetattro(PyObject *self, PyObject *nameobj)
1824{
Bram Moolenaar8110a092016-04-14 15:56:09 +02001825 PyObject *r;
Bram Moolenaardb913952012-06-29 12:54:53 +02001826 FunctionObject *this = (FunctionObject *)(self);
Bram Moolenaar77045652012-09-21 13:46:06 +02001827
1828 GET_ATTR_STRING(name, nameobj);
Bram Moolenaardb913952012-06-29 12:54:53 +02001829
Bram Moolenaar8110a092016-04-14 15:56:09 +02001830 r = FunctionAttr(this, name);
1831 if (r || PyErr_Occurred())
1832 return r;
1833 else
1834 return PyObject_GenericGetAttr(self, nameobj);
Bram Moolenaardb913952012-06-29 12:54:53 +02001835}
1836
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001837// External interface
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001838
1839 void
1840python3_buffer_free(buf_T *buf)
1841{
Yegappan Lakshmanan0233bdf2023-01-12 12:33:30 +00001842 BufferObject *bp = BUF_PYTHON_REF(buf);
1843 if (bp == NULL)
1844 return;
1845 bp->buf = INVALID_BUFFER_VALUE;
1846 BUF_PYTHON_REF(buf) = NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001847}
1848
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001849 void
1850python3_window_free(win_T *win)
1851{
Yegappan Lakshmanan0233bdf2023-01-12 12:33:30 +00001852 WindowObject *wp = WIN_PYTHON_REF(win);
1853 if (wp == NULL)
1854 return;
1855 wp->win = INVALID_WINDOW_VALUE;
1856 WIN_PYTHON_REF(win) = NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001857}
Bram Moolenaar5e538ec2013-05-15 15:12:29 +02001858
1859 void
1860python3_tabpage_free(tabpage_T *tab)
1861{
Yegappan Lakshmanan0233bdf2023-01-12 12:33:30 +00001862 TabPageObject *tp = TAB_PYTHON_REF(tab);
1863 if (tp == NULL)
1864 return;
1865 tp->tab = INVALID_TABPAGE_VALUE;
1866 TAB_PYTHON_REF(tab) = NULL;
Bram Moolenaar5e538ec2013-05-15 15:12:29 +02001867}
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001868
Bram Moolenaar7854e3a2012-11-28 15:33:14 +01001869 static PyObject *
1870Py3Init_vim(void)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001871{
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001872 // The special value is removed from sys.path in Python3_Init().
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001873 static wchar_t *(argv[2]) = {L"/must>not&exist/foo", NULL};
1874
Bram Moolenaar1dc28782013-05-21 19:11:01 +02001875 if (init_types())
1876 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001877
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001878 // Set sys.argv[] to avoid a crash in warn().
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001879 PySys_SetArgv(1, argv);
1880
Bram Moolenaarc09a6d62013-06-10 21:27:29 +02001881 if ((vim_module = PyModule_Create(&vimmodule)) == NULL)
Bram Moolenaar19e60942011-06-19 00:27:51 +02001882 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001883
Bram Moolenaardee2e312013-06-23 16:35:47 +02001884 if (populate_module(vim_module))
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001885 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001886
Bram Moolenaarc09a6d62013-06-10 21:27:29 +02001887 if (init_sys_path())
1888 return NULL;
1889
1890 return vim_module;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001891}
1892
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001893//////////////////////////////////////////////////////////////////////////
1894// 4. Utility functions for handling the interface between Vim and Python.
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001895
Bram Moolenaar2ab2e862019-12-04 21:24:53 +01001896/*
1897 * Convert a Vim line into a Python string.
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001898 * All internal newlines are replaced by null characters.
1899 *
1900 * On errors, the Python exception data is set, and NULL is returned.
1901 */
Bram Moolenaar170bf1a2010-07-24 23:51:45 +02001902 static PyObject *
1903LineToString(const char *str)
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001904{
1905 PyObject *result;
1906 Py_ssize_t len = strlen(str);
Bram Moolenaard672dde2020-02-26 13:43:51 +01001907 char *tmp, *p;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001908
Bram Moolenaarc799fe22019-05-28 23:08:19 +02001909 tmp = alloc(len + 1);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001910 p = tmp;
1911 if (p == NULL)
1912 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001913 PyErr_NoMemory();
1914 return NULL;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001915 }
1916
1917 while (*str)
1918 {
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001919 if (*str == '\n')
1920 *p = '\0';
1921 else
1922 *p = *str;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001923
Bram Moolenaar55d5c032010-07-17 23:52:29 +02001924 ++p;
1925 ++str;
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001926 }
1927 *p = '\0';
1928
Bram Moolenaar2e2f52a2020-12-21 16:03:02 +01001929 result = PyUnicode_Decode(tmp, len, (char *)ENC_OPT, ERRORS_DECODE_ARG);
Bram Moolenaarbd5e15f2010-07-17 21:19:38 +02001930
1931 vim_free(tmp);
1932 return result;
1933}
1934
Bram Moolenaardb913952012-06-29 12:54:53 +02001935 void
Bram Moolenaar8e9a24a2019-03-19 22:22:55 +01001936do_py3eval(char_u *str, typval_T *rettv)
Bram Moolenaardb913952012-06-29 12:54:53 +02001937{
Bram Moolenaarb52f4c02013-05-21 18:19:38 +02001938 DoPyCommand((char *) str,
1939 (rangeinitializer) init_range_eval,
1940 (runner) run_eval,
1941 (void *) rettv);
Bram Moolenaar8e9a24a2019-03-19 22:22:55 +01001942 if (rettv->v_type == VAR_UNKNOWN)
Bram Moolenaardb913952012-06-29 12:54:53 +02001943 {
Bram Moolenaar8e9a24a2019-03-19 22:22:55 +01001944 rettv->v_type = VAR_NUMBER;
1945 rettv->vval.v_number = 0;
Bram Moolenaardb913952012-06-29 12:54:53 +02001946 }
1947}
1948
Bram Moolenaar2459a5e2015-02-03 12:55:18 +01001949 int
Bram Moolenaar8e9a24a2019-03-19 22:22:55 +01001950set_ref_in_python3(int copyID)
Bram Moolenaardb913952012-06-29 12:54:53 +02001951{
Bram Moolenaarb641df42015-02-03 13:16:04 +01001952 return set_ref_in_py(copyID);
Bram Moolenaardb913952012-06-29 12:54:53 +02001953}