Mercurial > cpython-lru_cache-weakref
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); }
