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