mirror of
https://github.com/python/cpython.git
synced 2025-10-17 12:18:23 +00:00
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).
This commit is contained in:
parent
1cd9825457
commit
18fc4e70f3
3 changed files with 63 additions and 32 deletions
|
@ -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
|
||||||
- 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:
|
||||||
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,
|
||||||
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,
|
||||||
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
|
||||||
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)
|
||||||
}
|
}
|
||||||
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)
|
||||||
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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue