diff Python/sysmodule.c @ 83:f6bcf3c1d714 legacy-trunk

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...)
author Guido van Rossum <guido@python.org>
date Sun, 18 Nov 1990 17:41:40 +0000
parents fc6fcd7df4f7
children a6934380c6e7
line wrap: on
line diff
--- a/Python/sysmodule.c	Sun Nov 18 17:41:19 1990 +0000
+++ b/Python/sysmodule.c	Sun Nov 18 17:41:40 1990 +0000
@@ -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);
 }