Commit 85c21a75 authored by Brett Cannon's avatar Brett Cannon

Issue #20942: PyImport_ImportFrozenModuleObject() no longer sets

__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).
parent 9dab9941
...@@ -245,6 +245,9 @@ Importing Modules ...@@ -245,6 +245,9 @@ Importing Modules
.. versionadded:: 3.3 .. versionadded:: 3.3
.. versionchanged:: 3.4
The ``__file__`` attribute is no longer set on the module.
.. c:function:: int PyImport_ImportFrozenModule(const char *name) .. c:function:: int PyImport_ImportFrozenModule(const char *name)
......
...@@ -109,6 +109,12 @@ IDLE ...@@ -109,6 +109,12 @@ IDLE
- Issue #17654: Ensure IDLE menus are customized properly on OS X for - Issue #17654: Ensure IDLE menus are customized properly on OS X for
non-framework builds and for all variants of Tk. 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 Documentation
------------- -------------
......
...@@ -837,12 +837,10 @@ error: ...@@ -837,12 +837,10 @@ error:
return m; return m;
} }
PyObject* static PyObject *
PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, module_dict_for_exec(PyObject *name)
PyObject *cpathname)
{ {
PyObject *modules = PyImport_GetModuleDict(); PyObject *m, *d = NULL;
PyObject *m, *d, *v;
m = PyImport_AddModuleObject(name); m = PyImport_AddModuleObject(name);
if (m == NULL) if (m == NULL)
...@@ -852,9 +850,51 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, ...@@ -852,9 +850,51 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
d = PyModule_GetDict(m); d = PyModule_GetDict(m);
if (PyDict_GetItemString(d, "__builtins__") == NULL) { if (PyDict_GetItemString(d, "__builtins__") == NULL) {
if (PyDict_SetItemString(d, "__builtins__", if (PyDict_SetItemString(d, "__builtins__",
PyEval_GetBuiltins()) != 0) PyEval_GetBuiltins()) != 0) {
goto error; 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) { if (pathname != NULL) {
v = pathname; v = pathname;
} }
...@@ -874,25 +914,7 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname, ...@@ -874,25 +914,7 @@ PyImport_ExecCodeModuleObject(PyObject *name, PyObject *co, PyObject *pathname,
if (PyDict_SetItemString(d, "__cached__", v) != 0) if (PyDict_SetItemString(d, "__cached__", v) != 0)
PyErr_Clear(); /* Not important enough to report */ PyErr_Clear(); /* Not important enough to report */
v = PyEval_EvalCode(co, d, d); return exec_code_in_module(name, d, co);
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;
} }
...@@ -1206,7 +1228,7 @@ int ...@@ -1206,7 +1228,7 @@ int
PyImport_ImportFrozenModuleObject(PyObject *name) PyImport_ImportFrozenModuleObject(PyObject *name)
{ {
const struct _frozen *p; const struct _frozen *p;
PyObject *co, *m, *path; PyObject *co, *m, *d;
int ispackage; int ispackage;
int size; int size;
...@@ -1235,7 +1257,7 @@ PyImport_ImportFrozenModuleObject(PyObject *name) ...@@ -1235,7 +1257,7 @@ PyImport_ImportFrozenModuleObject(PyObject *name)
} }
if (ispackage) { if (ispackage) {
/* Set __path__ to the empty list */ /* Set __path__ to the empty list */
PyObject *d, *l; PyObject *l;
int err; int err;
m = PyImport_AddModuleObject(name); m = PyImport_AddModuleObject(name);
if (m == NULL) if (m == NULL)
...@@ -1250,11 +1272,11 @@ PyImport_ImportFrozenModuleObject(PyObject *name) ...@@ -1250,11 +1272,11 @@ PyImport_ImportFrozenModuleObject(PyObject *name)
if (err != 0) if (err != 0)
goto err_return; goto err_return;
} }
path = PyUnicode_FromString("<frozen>"); d = module_dict_for_exec(name);
if (path == NULL) if (d == NULL) {
goto err_return; goto err_return;
m = PyImport_ExecCodeModuleObject(name, co, path, NULL); }
Py_DECREF(path); m = exec_code_in_module(name, d, co);
if (m == NULL) if (m == NULL)
goto err_return; goto err_return;
Py_DECREF(co); Py_DECREF(co);
......
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