diff options
author | Brett Cannon <brett@python.org> | 2014-04-04 14:03:42 (GMT) |
---|---|---|
committer | Brett Cannon <brett@python.org> | 2014-04-04 14:03:42 (GMT) |
commit | e7ef80583320cdb9a76bc47ba5c24ecc1801a282 (patch) | |
tree | 5012bbde25fef7ba4132fa06fff1023ee56981bb | |
parent | bcc174615ca2bd5fe60442407ca1411759d823cf (diff) | |
parent | 18fc4e70f3cd18803fda01667dcc0d6bab9f9b25 (diff) | |
download | cpython-e7ef80583320cdb9a76bc47ba5c24ecc1801a282.zip cpython-e7ef80583320cdb9a76bc47ba5c24ecc1801a282.tar.gz cpython-e7ef80583320cdb9a76bc47ba5c24ecc1801a282.tar.bz2 |
merge of fix for issue #20942
-rw-r--r-- | Doc/c-api/import.rst | 3 | ||||
-rw-r--r-- | Misc/NEWS | 6 | ||||
-rw-r--r-- | Python/import.c | 86 |
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) @@ -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); |