]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Empty all modules' symbol tables, so most circular references are
authorGuido van Rossum <guido@python.org>
Sun, 18 Nov 1990 17:41:40 +0000 (17:41 +0000)
committerGuido van Rossum <guido@python.org>
Sun, 18 Nov 1990 17:41:40 +0000 (17:41 +0000)
cleared up.
(A function definition references its module's symbol table but
the symbol table of course references the function...)

Python/sysmodule.c

index 845ccfca56f3ff5202fa5e46e687153f7b48bced..f276fb434720da0581a713e6a9315fab40534729 100644 (file)
@@ -131,6 +131,7 @@ initsys(argc, argv)
        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 @@ initsys(argc, argv)
                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);
 }