summaryrefslogtreecommitdiffstats
path: root/Python/import.c
diff options
context:
space:
mode:
authorGuido van Rossum <guido@python.org>2001-07-23 13:27:49 (GMT)
committerGuido van Rossum <guido@python.org>2001-07-23 13:27:49 (GMT)
commitf48f11cd793a545251b83a6037e609a77f080c00 (patch)
tree9d8b99f5571f24298dac8375548b960a57bf0a11 /Python/import.c
parentfa712ca1ed5c04a07dca4ae6837c74509d89fa82 (diff)
downloadcpython-f48f11cd793a545251b83a6037e609a77f080c00.zip
cpython-f48f11cd793a545251b83a6037e609a77f080c00.tar.gz
cpython-f48f11cd793a545251b83a6037e609a77f080c00.tar.bz2
SF Patch #441791, with changes: when "import foo.bar" fails with an
exception in the execution of bar, ensure that foo.bar exists. (Previously, while sys.modules['foo.bar'] would exist, foo.bar would only be created upon successful execution of bar. This is inconvenient; some would say wrong. :-)
Diffstat (limited to 'Python/import.c')
-rw-r--r--Python/import.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/Python/import.c b/Python/import.c
index 7443724..456a5be 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1789,7 +1789,7 @@ static PyObject *
import_submodule(PyObject *mod, char *subname, char *fullname)
{
PyObject *modules = PyImport_GetModuleDict();
- PyObject *m;
+ PyObject *m, *res = NULL;
/* Require:
if mod == None: subname == fullname
@@ -1829,9 +1829,21 @@ import_submodule(PyObject *mod, char *subname, char *fullname)
m = load_module(fullname, fp, buf, fdp->type);
if (fp)
fclose(fp);
- if (m != NULL && mod != Py_None) {
- if (PyObject_SetAttrString(mod, subname, m) < 0) {
- Py_DECREF(m);
+ if (mod != Py_None) {
+ /* Irrespective of the success of this load, make a
+ reference to it in the parent package module.
+ A copy gets saved in the modules dictionary
+ under the full name, so get a reference from
+ there, if need be. (The exception is when
+ the load failed with a SyntaxError -- then
+ there's no trace in sys.modules. In that case,
+ of course, do nothing extra.) */
+ res = m;
+ if (res == NULL)
+ res = PyDict_GetItemString(modules, fullname);
+ if (res != NULL &&
+ PyObject_SetAttrString(mod, subname, res) < 0) {
+ Py_XDECREF(m);
m = NULL;
}
}