summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatti Picus <matti.picus@gmail.com>2022-05-17 13:45:51 +0300
committerStefan Behnel <stefan_ml@behnel.de>2022-05-17 12:47:24 +0200
commitaac58502a00cd52433cde9f83231e4f497b20f89 (patch)
tree88854578dcb23aa2e3da78987532f8fa0ba84de1
parent59e0f8903db832f2db4e015e6236ba90d5c95113 (diff)
downloadcython-aac58502a00cd52433cde9f83231e4f497b20f89.tar.gz
Move from deprecated find_loader() to find_spec() for setting up the import time package path (GH-4764)
Closes https://github.com/cython/cython/issues/4763
-rw-r--r--Cython/Compiler/ModuleNode.py10
-rw-r--r--Cython/Utility/ImportExport.c36
2 files changed, 14 insertions, 32 deletions
diff --git a/Cython/Compiler/ModuleNode.py b/Cython/Compiler/ModuleNode.py
index f89af8ca5..176e4afe0 100644
--- a/Cython/Compiler/ModuleNode.py
+++ b/Cython/Compiler/ModuleNode.py
@@ -2628,18 +2628,12 @@ class ModuleNode(Nodes.Node, Nodes.BlockNode):
# packages require __path__, so all we can do is try to figure
# out the module path at runtime by rerunning the import lookup
code.putln("if (!CYTHON_PEP489_MULTI_PHASE_INIT) {")
- package_name, _ = self.full_module_name.rsplit('.', 1)
- if '.' in package_name:
- parent_name = '"%s"' % (package_name.rsplit('.', 1)[0],)
- else:
- parent_name = 'NULL'
code.globalstate.use_utility_code(UtilityCode.load(
"SetPackagePathFromImportLib", "ImportExport.c"))
code.putln(code.error_goto_if_neg(
- '__Pyx_SetPackagePathFromImportLib(%s, %s)' % (
- parent_name,
+ '__Pyx_SetPackagePathFromImportLib(%s)' % (
code.globalstate.get_py_string_const(
- EncodedString(env.module_name)).cname),
+ self.full_module_name).cname),
self.pos))
code.putln("}")
diff --git a/Cython/Utility/ImportExport.c b/Cython/Utility/ImportExport.c
index 532ec326f..1689c1138 100644
--- a/Cython/Utility/ImportExport.c
+++ b/Cython/Utility/ImportExport.c
@@ -228,9 +228,9 @@ bad:
// PY_VERSION_HEX >= 0x03030000
#if PY_MAJOR_VERSION >= 3 && !CYTHON_PEP489_MULTI_PHASE_INIT
-static int __Pyx_SetPackagePathFromImportLib(const char* parent_package_name, PyObject *module_name);
+static int __Pyx_SetPackagePathFromImportLib(PyObject *module_name);
#else
-#define __Pyx_SetPackagePathFromImportLib(a, b) 0
+#define __Pyx_SetPackagePathFromImportLib(a) 0
#endif
/////////////// SetPackagePathFromImportLib ///////////////
@@ -239,32 +239,21 @@ static int __Pyx_SetPackagePathFromImportLib(const char* parent_package_name, Py
// PY_VERSION_HEX >= 0x03030000
#if PY_MAJOR_VERSION >= 3 && !CYTHON_PEP489_MULTI_PHASE_INIT
-static int __Pyx_SetPackagePathFromImportLib(const char* parent_package_name, PyObject *module_name) {
- PyObject *importlib, *loader, *osmod, *ossep, *parts, *package_path;
- PyObject *path = NULL, *file_path = NULL;
+static int __Pyx_SetPackagePathFromImportLib(PyObject *module_name) {
+ PyObject *importlib, *osmod, *ossep, *parts, *package_path;
+ PyObject *file_path = NULL;
int result;
- if (parent_package_name) {
- PyObject *package = PyImport_ImportModule(parent_package_name);
- if (unlikely(!package))
- goto bad;
- path = PyObject_GetAttrString(package, "__path__");
- Py_DECREF(package);
- if (unlikely(!path) || unlikely(path == Py_None))
- goto bad;
- } else {
- path = Py_None; Py_INCREF(Py_None);
- }
- // package_path = [importlib.find_loader(module_name, path).path.rsplit(os.sep, 1)[0]]
- importlib = PyImport_ImportModule("importlib");
+ PyObject *spec;
+ // package_path = [importlib.util.find_spec(module_name).origin.rsplit(os.sep, 1)[0]]
+ importlib = PyImport_ImportModule("importlib.util");
if (unlikely(!importlib))
goto bad;
- loader = PyObject_CallMethod(importlib, "find_loader", "(OO)", module_name, path);
+ spec = PyObject_CallMethod(importlib, "find_spec", "(O)", module_name);
Py_DECREF(importlib);
- Py_DECREF(path); path = NULL;
- if (unlikely(!loader))
+ if (unlikely(!spec))
goto bad;
- file_path = PyObject_GetAttrString(loader, "path");
- Py_DECREF(loader);
+ file_path = PyObject_GetAttrString(spec, "origin");
+ Py_DECREF(spec);
if (unlikely(!file_path))
goto bad;
@@ -291,7 +280,6 @@ static int __Pyx_SetPackagePathFromImportLib(const char* parent_package_name, Py
bad:
PyErr_WriteUnraisable(module_name);
- Py_XDECREF(path);
Py_XDECREF(file_path);
// set an empty path list on failure