mirror of
https://github.com/python/cpython.git
synced 2025-10-21 14:12:27 +00:00
PyImport_Import was using the old import hack of sticking a dummy value into
fromlist to get __import__ to return the module desired. Now it uses the proper approach of fetching the module from sys.modules. Closes issue #9252. Thanks to Alexander Belopolsky for the bug report.
This commit is contained in:
parent
e1f2f30328
commit
bc2eff3112
2 changed files with 16 additions and 3 deletions
|
@ -10,6 +10,9 @@ What's New in Python 3.2 Alpha 3?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #9252: PyImport_Import no longer uses a fromlist hack to return the
|
||||||
|
module that was imported, but instead gets the module from sys.modules.
|
||||||
|
|
||||||
- Issue #9212: The range type_items now provides index() and count()
|
- Issue #9212: The range type_items now provides index() and count()
|
||||||
methods, to conform to the Sequence ABC. Patch by Daniel Urban and
|
methods, to conform to the Sequence ABC. Patch by Daniel Urban and
|
||||||
Daniel Stutzbach.
|
Daniel Stutzbach.
|
||||||
|
|
|
@ -3044,7 +3044,7 @@ PyImport_ReloadModule(PyObject *m)
|
||||||
more accurately -- it invokes the __import__() function from the
|
more accurately -- it invokes the __import__() function from the
|
||||||
builtins of the current globals. This means that the import is
|
builtins of the current globals. This means that the import is
|
||||||
done using whatever import hooks are installed in the current
|
done using whatever import hooks are installed in the current
|
||||||
environment, e.g. by "rexec".
|
environment.
|
||||||
A dummy list ["__doc__"] is passed as the 4th argument so that
|
A dummy list ["__doc__"] is passed as the 4th argument so that
|
||||||
e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
|
e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
|
||||||
will return <module "gencache"> instead of <module "win32com">. */
|
will return <module "gencache"> instead of <module "win32com">. */
|
||||||
|
@ -3058,6 +3058,7 @@ PyImport_Import(PyObject *module_name)
|
||||||
PyObject *globals = NULL;
|
PyObject *globals = NULL;
|
||||||
PyObject *import = NULL;
|
PyObject *import = NULL;
|
||||||
PyObject *builtins = NULL;
|
PyObject *builtins = NULL;
|
||||||
|
PyObject *modules = NULL;
|
||||||
PyObject *r = NULL;
|
PyObject *r = NULL;
|
||||||
|
|
||||||
/* Initialize constant string objects */
|
/* Initialize constant string objects */
|
||||||
|
@ -3068,7 +3069,7 @@ PyImport_Import(PyObject *module_name)
|
||||||
builtins_str = PyUnicode_InternFromString("__builtins__");
|
builtins_str = PyUnicode_InternFromString("__builtins__");
|
||||||
if (builtins_str == NULL)
|
if (builtins_str == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
silly_list = Py_BuildValue("[s]", "__doc__");
|
silly_list = PyList_New(0);
|
||||||
if (silly_list == NULL)
|
if (silly_list == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -3104,9 +3105,18 @@ PyImport_Import(PyObject *module_name)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
/* Call the __import__ function with the proper argument list
|
/* Call the __import__ function with the proper argument list
|
||||||
* Always use absolute import here. */
|
Always use absolute import here.
|
||||||
|
Calling for side-effect of import. */
|
||||||
r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
|
r = PyObject_CallFunction(import, "OOOOi", module_name, globals,
|
||||||
globals, silly_list, 0, NULL);
|
globals, silly_list, 0, NULL);
|
||||||
|
if (r == NULL)
|
||||||
|
goto err;
|
||||||
|
Py_DECREF(r);
|
||||||
|
|
||||||
|
modules = PyImport_GetModuleDict();
|
||||||
|
r = PyDict_GetItem(modules, module_name);
|
||||||
|
if (r != NULL)
|
||||||
|
Py_INCREF(r);
|
||||||
|
|
||||||
err:
|
err:
|
||||||
Py_XDECREF(globals);
|
Py_XDECREF(globals);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue