]> granicus.if.org Git - python/commitdiff
Issue #20942: PyImport_ImportFrozenModuleObject() no longer sets
authorBrett Cannon <brett@python.org>
Fri, 4 Apr 2014 14:01:46 +0000 (10:01 -0400)
committerBrett Cannon <brett@python.org>
Fri, 4 Apr 2014 14:01:46 +0000 (10:01 -0400)
__file__.

This causes _frozen_importlib to no longer have __file__ set as well
as any frozen module imported using imp.init_frozen() (which is
deprecated).

Doc/c-api/import.rst
Misc/NEWS
Python/import.c

index 6cd2b8bea0e1bf1d97c55e4ba4b3dc510a7d37d5..0dcac2d4cf7c4ba21785e316d546c5043e9cd4a4 100644 (file)
@@ -245,6 +245,9 @@ Importing Modules
 
    .. versionadded:: 3.3
 
+   .. versionchanged:: 3.4
+      The ``__file__`` attribute is no longer set on the module.
+
 
 .. c:function:: int PyImport_ImportFrozenModule(const char *name)
 
index 4f27a991e94d0260fc3dd84a0661c87ccfd7f2e4..fd5e71b7d7a36ba89906e961c1b6a1ef7c574cdf 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -109,6 +109,12 @@ IDLE
 - Issue #17654: Ensure IDLE menus are customized properly on OS X for
   non-framework builds and for all variants of Tk.
 
+C API
+-----
+- Issue #20942: PyImport_ImportFrozenModuleObject() no longer sets __file__ to
+  match what importlib does; this affects _frozen_importlib as well as any
+  module loaded using imp.init_frozen().
+
 Documentation
 -------------
 
index 7972f8612f7e2b5ff03d40729768a4ce6f8146f0..0e26ffcd94b17af55256d23edec6cad3ba9bfa4a 100644 (file)
@@ -837,12 +837,10 @@ error:
     return m;
 }
 
-PyObject*
-PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
-                              PyObject *cpathname)
+static PyObject *
+module_dict_for_exec(PyObject *name)
 {
-    PyObject *modules = PyImport_GetModuleDict();
-    PyObject *m, *d, *v;
+    PyObject *m, *d = NULL;
 
     m = PyImport_AddModuleObject(name);
     if (m == NULL)
@@ -852,9 +850,51 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
     d = PyModule_GetDict(m);
     if (PyDict_GetItemString(d, "__builtins__") == NULL) {
         if (PyDict_SetItemString(d, "__builtins__",
-                                 PyEval_GetBuiltins()) != 0)
-            goto error;
+                                 PyEval_GetBuiltins()) != 0) {
+            remove_module(name);
+            return NULL;
+        }
+    }
+
+    return d;
+}
+
+static PyObject *
+exec_code_in_module(PyObject *name, PyObject *module_dict, PyObject *code_object)
+{
+    PyObject *modules = PyImport_GetModuleDict();
+    PyObject *v, *m;
+
+    v = PyEval_EvalCode(code_object, module_dict, module_dict);
+    if (v == NULL) {
+        remove_module(name);
+        return NULL;
+    }
+    Py_DECREF(v);
+
+    if ((m = PyDict_GetItem(modules, name)) == NULL) {
+        PyErr_Format(PyExc_ImportError,
+                     "Loaded module %R not found in sys.modules",
+                     name);
+        return NULL;
+    }
+
+    Py_INCREF(m);
+
+    return m;
+}
+
+PyObject*
+PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
+                              PyObject *cpathname)
+{
+    PyObject *d, *v;
+
+    d = module_dict_for_exec(name);
+    if (d == NULL) {
+        return NULL;
     }
+
     if (pathname != NULL) {
         v = pathname;
     }
@@ -874,25 +914,7 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
     if (PyDict_SetItemString(d, "__cached__", v) != 0)
         PyErr_Clear(); /* Not important enough to report */
 
-    v = PyEval_EvalCode(co, d, d);
-    if (v == NULL)
-        goto error;
-    Py_DECREF(v);
-
-    if ((m = PyDict_GetItem(modules, name)) == NULL) {
-        PyErr_Format(PyExc_ImportError,
-                     "Loaded module %R not found in sys.modules",
-                     name);
-        return NULL;
-    }
-
-    Py_INCREF(m);
-
-    return m;
-
-  error:
-    remove_module(name);
-    return NULL;
+    return exec_code_in_module(name, d, co);
 }
 
 
@@ -1206,7 +1228,7 @@ int
 PyImport_ImportFrozenModuleObject(PyObject *name)
 {
     const struct _frozen *p;
-    PyObject *co, *m, *path;
+    PyObject *co, *m, *d;
     int ispackage;
     int size;
 
@@ -1235,7 +1257,7 @@ PyImport_ImportFrozenModuleObject(PyObject *name)
     }
     if (ispackage) {
         /* Set __path__ to the empty list */
-        PyObject *d, *l;
+        PyObject *l;
         int err;
         m = PyImport_AddModuleObject(name);
         if (m == NULL)
@@ -1250,11 +1272,11 @@ PyImport_ImportFrozenModuleObject(PyObject *name)
         if (err != 0)
             goto err_return;
     }
-    path = PyUnicode_FromString("<frozen>");
-    if (path == NULL)
+    d = module_dict_for_exec(name);
+    if (d == NULL) {
         goto err_return;
-    m = PyImport_ExecCodeModuleObject(name, co, path, NULL);
-    Py_DECREF(path);
+    }
+    m = exec_code_in_module(name, d, co);
     if (m == NULL)
         goto err_return;
     Py_DECREF(co);