Commit bc2eff31 authored by Brett Cannon's avatar Brett Cannon

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.
parent e1f2f303
...@@ -10,6 +10,9 @@ What's New in Python 3.2 Alpha 3? ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment