Empty all modules' symbol tables, so most circular references are
cleared up.
(A function definition references its module's symbol table but
the symbol table of course references the function...)
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index 845ccfc..f276fb4 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -131,6 +131,7 @@
 	dictinsert(sysdict, "exit", exit);
 	if (err_occurred())
 		fatal("can't insert sys.* objects in sys dict");
+	DECREF(exit);
 	DECREF(v);
 	/* The other symbols are added elsewhere */
 	
@@ -141,16 +142,50 @@
 		fatal("can't create sys module");
 	if (setmoduledict(v, sysdict) != 0)
 		fatal("can't assign sys dict to sys module");
+	DECREF(v);
+}
+
+static void
+cleardict(d)
+	object *d;
+{
+	int i;
+	for (i = getdictsize(d); --i >= 0; ) {
+		char *k;
+		k = getdictkey(d, i);
+		if (k != NULL) {
+			(void) dictremove(d, k);
+		}
+	}
 }
 
 void
 closesys()
 {
-	object *mtab;
-	mtab = sysget("modules");
-	if (mtab != NULL && is_dictobject(mtab))
-		dictremove(mtab, "sys"); /* Get rid of recursion */
-	else
-		fprintf(stderr, "[module sys not found]\n");
+	object *modules;
+	modules = sysget("modules");
+	if (modules != NULL && is_dictobject(modules)) {
+		int i;
+		/* Explicitly erase all modules; this is the safest way
+		   to get rid of at least *some* circular dependencies */
+		INCREF(modules);
+		for (i = getdictsize(modules); --i >= 0; ) {
+			char *k;
+			k = getdictkey(modules, i);
+			if (k != NULL) {
+				object *m;
+				m = dictlookup(modules, k);
+				if (m != NULL && is_moduleobject(m)) {
+					object *d;
+					d = getmoduledict(m);
+					if (d != NULL && is_dictobject(d)) {
+						cleardict(d);
+					}
+				}
+			}
+		}
+		cleardict(modules);
+		DECREF(modules);
+	}
 	DECREF(sysdict);
 }