diff options
author | Guido van Rossum <guido@python.org> | 1990-11-18 17:41:40 +0000 |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1990-11-18 17:41:40 +0000 |
commit | 5b3138bec047cfe9d284516be3958680f4fcf4ab (patch) | |
tree | 64b0f0f2eb3984a09549c017ce922b568e0bc851 /Python/sysmodule.c | |
parent | 392ab328594bbf299f63ca9c3ba064e9a1a2deb1 (diff) | |
download | cpython-git-5b3138bec047cfe9d284516be3958680f4fcf4ab.tar.gz |
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...)
Diffstat (limited to 'Python/sysmodule.c')
-rw-r--r-- | Python/sysmodule.c | 47 |
1 files changed, 41 insertions, 6 deletions
diff --git a/Python/sysmodule.c b/Python/sysmodule.c index 845ccfca56..f276fb4347 100644 --- a/Python/sysmodule.c +++ b/Python/sysmodule.c @@ -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); } |