don't dictclear deleted modules in doneimport

This commit is contained in:
Guido van Rossum 1995-01-26 00:41:28 +00:00
parent 8bf7c484c1
commit 0de81bfec9

View file

@ -68,24 +68,17 @@ void
doneimport() doneimport()
{ {
if (import_modules != NULL) { if (import_modules != NULL) {
int pos; object *tmp = import_modules;
object *modname, *module; import_modules = NULL;
/* Explicitly erase all modules; this is the safest way /* This deletes all modules from sys.modules.
to get rid of at least *some* circular dependencies */ When a module is deallocated, it in turn clears its dictionary,
pos = 0; thus hopefully breaking any circular references between modules
while (mappinggetnext(import_modules, and between a module's dictionary and its functions.
&pos, &modname, &module)) { Note that "import" will fail while we are cleaning up.
if (is_moduleobject(module)) { */
object *dict; mappingclear(tmp);
dict = getmoduledict(module); DECREF(tmp);
if (dict != NULL && is_dictobject(dict))
mappingclear(dict);
}
}
mappingclear(import_modules);
DECREF(import_modules);
} }
import_modules = NULL;
} }
@ -119,6 +112,10 @@ add_module(name)
{ {
object *m; object *m;
if (import_modules == NULL) {
err_setstr(SystemError, "sys.modules has been deleted");
return NULL;
}
if ((m = dictlookup(import_modules, name)) != NULL && if ((m = dictlookup(import_modules, name)) != NULL &&
is_moduleobject(m)) is_moduleobject(m))
return m; return m;
@ -574,6 +571,10 @@ import_module(name)
{ {
object *m; object *m;
if (import_modules == NULL) {
err_setstr(SystemError, "sys.modules has been deleted");
return NULL;
}
if ((m = dictlookup(import_modules, name)) != NULL) { if ((m = dictlookup(import_modules, name)) != NULL) {
INCREF(m); INCREF(m);
} }
@ -615,6 +616,10 @@ reload_module(m)
name = getmodulename(m); name = getmodulename(m);
if (name == NULL) if (name == NULL)
return NULL; return NULL;
if (import_modules == NULL) {
err_setstr(SystemError, "sys.modules has been deleted");
return NULL;
}
if (m != dictlookup(import_modules, name)) { if (m != dictlookup(import_modules, name)) {
err_setstr(ImportError, "reload() module not in sys.modules"); err_setstr(ImportError, "reload() module not in sys.modules");
return NULL; return NULL;