]> granicus.if.org Git - python/commitdiff
PyImport_Import was using the old import hack of sticking a dummy value into
authorBrett Cannon <bcannon@gmail.com>
Sun, 19 Sep 2010 21:39:02 +0000 (21:39 +0000)
committerBrett Cannon <bcannon@gmail.com>
Sun, 19 Sep 2010 21:39:02 +0000 (21:39 +0000)
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.

Misc/NEWS
Python/import.c

index ab01f4755257cd79436903aa299c320e828b5fc2..40c4cdd58f1101a27055254f472f2d52ff3845c5 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -10,6 +10,9 @@ What's New in Python 3.2 Alpha 3?
 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()
   methods, to conform to the Sequence ABC.  Patch by Daniel Urban and
   Daniel Stutzbach.
index b8cfbee61023487dba1d4f7e9d6e252313e16fab..3078734d8b5fb5523f5313d07b1e773a3800817a 100644 (file)
@@ -3044,7 +3044,7 @@ PyImport_ReloadModule(PyObject *m)
    more accurately -- it invokes the __import__() function from the
    builtins of the current globals.  This means that the import is
    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
    e.g. PyImport_Import(PyUnicode_FromString("win32com.client.gencache"))
    will return <module "gencache"> instead of <module "win32com">. */
@@ -3058,6 +3058,7 @@ PyImport_Import(PyObject *module_name)
     PyObject *globals = NULL;
     PyObject *import = NULL;
     PyObject *builtins = NULL;
+    PyObject *modules = NULL;
     PyObject *r = NULL;
 
     /* Initialize constant string objects */
@@ -3068,7 +3069,7 @@ PyImport_Import(PyObject *module_name)
         builtins_str = PyUnicode_InternFromString("__builtins__");
         if (builtins_str == NULL)
             return NULL;
-        silly_list = Py_BuildValue("[s]", "__doc__");
+        silly_list = PyList_New(0);
         if (silly_list == NULL)
             return NULL;
     }
@@ -3104,9 +3105,18 @@ PyImport_Import(PyObject *module_name)
         goto err;
 
     /* 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,
                               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:
     Py_XDECREF(globals);