diff options
author | junyixie <xiejunyi.arch@bytedance.com> | 2021-03-22 09:47:10 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-22 09:47:10 (GMT) |
commit | 88d9983b561cd59e5f186d98227de0c1a022b498 (patch) | |
tree | a62667b35fe872cfe0c143b67bd2f72bffa75ac6 /Python | |
parent | 56f031ec5281723b7c617edfa5748f2ae6a4c347 (diff) | |
download | cpython-88d9983b561cd59e5f186d98227de0c1a022b498.zip cpython-88d9983b561cd59e5f186d98227de0c1a022b498.tar.gz cpython-88d9983b561cd59e5f186d98227de0c1a022b498.tar.bz2 |
bpo-43551: Fix PyImport_Import() for subinterpreters (GH-24929)
Avoid static variables.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/import.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/Python/import.c b/Python/import.c index d92e46a..b898a2b 100644 --- a/Python/import.c +++ b/Python/import.c @@ -1744,26 +1744,29 @@ PyImport_ReloadModule(PyObject *m) PyObject * PyImport_Import(PyObject *module_name) { + _Py_IDENTIFIER(__import__); + _Py_IDENTIFIER(__builtins__); + PyThreadState *tstate = _PyThreadState_GET(); - static PyObject *silly_list = NULL; - static PyObject *builtins_str = NULL; - static PyObject *import_str = NULL; PyObject *globals = NULL; PyObject *import = NULL; PyObject *builtins = NULL; PyObject *r = NULL; /* Initialize constant string objects */ - if (silly_list == NULL) { - import_str = PyUnicode_InternFromString("__import__"); - if (import_str == NULL) - return NULL; - builtins_str = PyUnicode_InternFromString("__builtins__"); - if (builtins_str == NULL) - return NULL; - silly_list = PyList_New(0); - if (silly_list == NULL) - return NULL; + PyObject *import_str = _PyUnicode_FromId(&PyId___import__); // borrowed ref + if (import_str == NULL) { + return NULL; + } + + PyObject *builtins_str = _PyUnicode_FromId(&PyId___builtins__); // borrowed ref + if (builtins_str == NULL) { + return NULL; + } + + PyObject *from_list = PyList_New(0); + if (from_list == NULL) { + goto err; } /* Get the builtins from current globals */ @@ -1778,8 +1781,9 @@ PyImport_Import(PyObject *module_name) /* No globals -- use standard builtins, and fake globals */ builtins = PyImport_ImportModuleLevel("builtins", NULL, NULL, NULL, 0); - if (builtins == NULL) - return NULL; + if (builtins == NULL) { + goto err; + } globals = Py_BuildValue("{OO}", builtins_str, builtins); if (globals == NULL) goto err; @@ -1801,7 +1805,7 @@ PyImport_Import(PyObject *module_name) Always use absolute import here. Calling for side-effect of import. */ r = PyObject_CallFunction(import, "OOOOi", module_name, globals, - globals, silly_list, 0, NULL); + globals, from_list, 0, NULL); if (r == NULL) goto err; Py_DECREF(r); @@ -1815,6 +1819,7 @@ PyImport_Import(PyObject *module_name) Py_XDECREF(globals); Py_XDECREF(builtins); Py_XDECREF(import); + Py_XDECREF(from_list); return r; } |