[Python-Dev] Fix import errors to have data
Guido van Rossum
guido at python.org
Wed Jul 28 21:03:40 CEST 2004
I quickly whipped up this (procastinating on my OSCON keynote slides :-):
Index: import.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Python/import.c,v
retrieving revision 2.233
diff -c -u -r2.233 import.c
--- import.c 27 Jun 2004 16:51:46 -0000 2.233
+++ import.c 28 Jul 2004 18:57:15 -0000
@@ -572,17 +572,23 @@
{
PyObject *modules = PyImport_GetModuleDict();
PyObject *m, *d, *v;
+ int pre_existing = 0;
- m = PyImport_AddModule(name);
- if (m == NULL)
- return NULL;
+ if ((m = PyDict_GetItemString(modules, name)) != NULL &&
+ PyModule_Check(m))
+ pre_existing = 1;
+ else {
+ m = PyImport_AddModule(name);
+ if (m == NULL)
+ return NULL;
+ }
/* If the module is being reloaded, we get the old module back
and re-use its dict to exec the new code. */
d = PyModule_GetDict(m);
if (PyDict_GetItemString(d, "__builtins__") == NULL) {
if (PyDict_SetItemString(d, "__builtins__",
PyEval_GetBuiltins()) != 0)
- return NULL;
+ goto error;
}
/* Remember the filename as the __file__ attribute */
v = NULL;
@@ -601,7 +607,7 @@
v = PyEval_EvalCode((PyCodeObject *)co, d, d);
if (v == NULL)
- return NULL;
+ goto error;
Py_DECREF(v);
if ((m = PyDict_GetItemString(modules, name)) == NULL) {
@@ -614,6 +620,11 @@
Py_INCREF(m);
return m;
+
+ error:
+ if (!pre_existing)
+ PyDict_DelItemString(modules, name); /* If it fails, too bad */
+ return NULL;
}
Superficial testing suggests it works fine, except for one problem in
test_pkgimport which is testing specifically for the broken behavior.
BTW, building CVS Python gives these warnings for me:
/home/guido/projects/python/dist/src/Modules/cjkcodecs/_codecs_iso2022.c:120: array size missing in `designations'
/home/guido/projects/python/dist/src/Modules/cjkcodecs/_codecs_iso2022.c: In function `iso2022processesc':
/home/guido/projects/python/dist/src/Modules/cjkcodecs/_codecs_iso2022.c:306: warning: `esclen' might be used uninitialized in this function
/home/guido/projects/python/dist/src/Modules/cjkcodecs/_codecs_iso2022.c: At top level:
/home/guido/projects/python/dist/src/Modules/cjkcodecs/_codecs_iso2022.c:1053: warning: excess elements in array initializer
/home/guido/projects/python/dist/src/Modules/cjkcodecs/_codecs_iso2022.c:1053: warning: (near initialization for `iso2022_kr_config.designations')
/home/guido/projects/python/dist/src/Modules/cjkcodecs/_codecs_iso2022.c:1058: warning: excess elements in array initializer
[and many more similar]
Red Hat 7.3 using gcc 2.96.
--Guido van Rossum (home page: http://www.python.org/~guido/)
More information about the Python-Dev
mailing list