summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrett Cannon <brett@python.org>2014-04-04 14:03:42 (GMT)
committerBrett Cannon <brett@python.org>2014-04-04 14:03:42 (GMT)
commite7ef80583320cdb9a76bc47ba5c24ecc1801a282 (patch)
tree5012bbde25fef7ba4132fa06fff1023ee56981bb
parentbcc174615ca2bd5fe60442407ca1411759d823cf (diff)
parent18fc4e70f3cd18803fda01667dcc0d6bab9f9b25 (diff)
downloadcpython-e7ef80583320cdb9a76bc47ba5c24ecc1801a282.zip
cpython-e7ef80583320cdb9a76bc47ba5c24ecc1801a282.tar.gz
cpython-e7ef80583320cdb9a76bc47ba5c24ecc1801a282.tar.bz2
merge of fix for issue #20942
-rw-r--r--Doc/c-api/import.rst3
-rw-r--r--Misc/NEWS6
-rw-r--r--Python/import.c86
3 files changed, 63 insertions, 32 deletions
diff --git a/Doc/c-api/import.rst b/Doc/c-api/import.rst
index 6cd2b8b..0dcac2d 100644
--- a/Doc/c-api/import.rst
+++ b/Doc/c-api/import.rst
@@ -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)
diff --git a/Misc/NEWS b/Misc/NEWS
index c8e84f4..3249baf 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -144,6 +144,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
-------------
diff --git a/Python/import.c b/Python/import.c
index 7972f86..0e26ffc 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -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);