mirror of
https://github.com/vim/vim.git
synced 2025-09-25 03:54:15 -04:00
patch 8.1.0201: newer Python uses "importlib" instead of "imp"
Problem: Newer Python uses "importlib" instead of "imp". Solution: Use "importlib" for newer Python versions. (closes #3163)
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user