diff options
Diffstat (limited to 'src/if_py_both.h')
-rw-r--r-- | src/if_py_both.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/src/if_py_both.h b/src/if_py_both.h index 417f86cbb..58db254dc 100644 --- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -88,8 +88,12 @@ static PyObject *py_getcwd; static PyObject *vim_module; static PyObject *vim_special_path_object; +#if PY_VERSION_HEX >= 0x030700f0 +static PyObject *py_find_spec; +#else static PyObject *py_find_module; static PyObject *py_load_module; +#endif static PyObject *VimError; @@ -539,6 +543,7 @@ PythonIO_Init_io(void) return 0; } +#if PY_VERSION_HEX < 0x030700f0 typedef struct { PyObject_HEAD @@ -567,6 +572,7 @@ static struct PyMethodDef LoaderMethods[] = { {"load_module", (PyCFunction)LoaderLoadModule, METH_VARARGS, ""}, { NULL, NULL, 0, NULL} }; +#endif /* Check to see whether a Vim error has been reported, or a keyboard * interrupt has been detected. @@ -1163,6 +1169,37 @@ Vim_GetPaths(PyObject *self UNUSED) return ret; } +#if PY_VERSION_HEX >= 0x030700f0 + static PyObject * +FinderFindSpec(PyObject *self, PyObject *args) +{ + char *fullname; + PyObject *paths; + PyObject *target = Py_None; + PyObject *spec; + + if (!PyArg_ParseTuple(args, "s|O", &fullname, &target)) + return NULL; + + if (!(paths = Vim_GetPaths(self))) + return NULL; + + spec = PyObject_CallFunction(py_find_spec, "sNN", fullname, paths, target); + + Py_DECREF(paths); + + if (!spec) + { + if (PyErr_Occurred()) + return NULL; + + Py_INCREF(Py_None); + return Py_None; + } + + return spec; +} +#else static PyObject * call_load_module(char *name, int len, PyObject *find_module_result) { @@ -1305,6 +1342,7 @@ FinderFindModule(PyObject *self, PyObject *args) return (PyObject *) loader; } +#endif static PyObject * VimPathHook(PyObject *self UNUSED, PyObject *args) @@ -1336,7 +1374,11 @@ static struct PyMethodDef VimMethods[] = { {"chdir", (PyCFunction)VimChdir, METH_VARARGS|METH_KEYWORDS, "Change directory"}, {"fchdir", (PyCFunction)VimFchdir, METH_VARARGS|METH_KEYWORDS, "Change directory"}, {"foreach_rtp", VimForeachRTP, METH_O, "Call given callable for each path in &rtp"}, +#if PY_VERSION_HEX >= 0x030700f0 + {"find_spec", FinderFindSpec, METH_VARARGS, "Internal use only, returns spec object for any input it receives"}, +#else {"find_module", FinderFindModule, METH_VARARGS, "Internal use only, returns loader object for any input it receives"}, +#endif {"path_hook", VimPathHook, METH_VARARGS, "Hook function to install in sys.path_hooks"}, {"_get_paths", (PyCFunction)Vim_GetPaths, METH_NOARGS, "Get &rtp-based additions to sys.path"}, { NULL, NULL, 0, NULL} @@ -6545,6 +6587,7 @@ init_structs(void) OptionsType.tp_traverse = (traverseproc)OptionsTraverse; OptionsType.tp_clear = (inquiry)OptionsClear; +#if PY_VERSION_HEX < 0x030700f0 vim_memset(&LoaderType, 0, sizeof(LoaderType)); LoaderType.tp_name = "vim.Loader"; LoaderType.tp_basicsize = sizeof(LoaderObject); @@ -6552,6 +6595,7 @@ init_structs(void) LoaderType.tp_doc = "vim message object"; LoaderType.tp_methods = LoaderMethods; LoaderType.tp_dealloc = (destructor)LoaderDestructor; +#endif #if PY_MAJOR_VERSION >= 3 vim_memset(&vimmodule, 0, sizeof(vimmodule)); @@ -6583,7 +6627,9 @@ init_types(void) PYTYPE_READY(FunctionType); PYTYPE_READY(OptionsType); PYTYPE_READY(OutputType); +#if PY_VERSION_HEX < 0x030700f0 PYTYPE_READY(LoaderType); +#endif return 0; } @@ -6707,7 +6753,9 @@ static struct object_constant { {"List", (PyObject *)&ListType}, {"Function", (PyObject *)&FunctionType}, {"Options", (PyObject *)&OptionsType}, +#if PY_VERSION_HEX < 0x030700f0 {"_Loader", (PyObject *)&LoaderType}, +#endif }; #define ADD_OBJECT(m, name, obj) \ @@ -6729,6 +6777,10 @@ populate_module(PyObject *m) PyObject *other_module; PyObject *attr; PyObject *imp; +#if PY_VERSION_HEX >= 0x030700f0 + PyObject *dict; + PyObject *cls; +#endif for (i = 0; i < (int)(sizeof(numeric_constants) / sizeof(struct numeric_constant)); @@ -6801,6 +6853,28 @@ populate_module(PyObject *m) ADD_OBJECT(m, "VIM_SPECIAL_PATH", vim_special_path_object); +#if PY_VERSION_HEX >= 0x030700f0 + if (!(imp = PyImport_ImportModule("importlib.machinery"))) + return -1; + + dict = PyModule_GetDict(imp); + + if (!(cls = PyDict_GetItemString(dict, "PathFinder"))) + { + Py_DECREF(imp); + return -1; + } + + if (!(py_find_spec = PyObject_GetAttrString(cls, "find_spec"))) + { + Py_DECREF(imp); + return -1; + } + + Py_DECREF(imp); + + ADD_OBJECT(m, "_find_spec", py_find_spec); +#else if (!(imp = PyImport_ImportModule("imp"))) return -1; @@ -6821,6 +6895,7 @@ populate_module(PyObject *m) ADD_OBJECT(m, "_find_module", py_find_module); ADD_OBJECT(m, "_load_module", py_load_module); +#endif return 0; } |