]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
don't dictclear deleted modules in doneimport
authorGuido van Rossum <guido@python.org>
Thu, 26 Jan 1995 00:41:28 +0000 (00:41 +0000)
committerGuido van Rossum <guido@python.org>
Thu, 26 Jan 1995 00:41:28 +0000 (00:41 +0000)
Python/import.c

index 9219c365f25c6b2d6f2d736c04078475b4a5c5ba..58a09fdfc9240b1c40be279222cd35e54cb271a7 100644 (file)
@@ -68,24 +68,17 @@ void
 doneimport()
 {
        if (import_modules != NULL) {
-               int pos;
-               object *modname, *module;
-               /* Explicitly erase all modules; this is the safest way
-                  to get rid of at least *some* circular dependencies */
-               pos = 0;
-               while (mappinggetnext(import_modules,
-                                     &pos, &modname, &module)) {
-                       if (is_moduleobject(module)) {
-                               object *dict;
-                               dict = getmoduledict(module);
-                               if (dict != NULL && is_dictobject(dict))
-                                       mappingclear(dict);
-                       }
-               }
-               mappingclear(import_modules);
-               DECREF(import_modules);
+               object *tmp = import_modules;
+               import_modules = NULL;
+               /* This deletes all modules from sys.modules.
+                  When a module is deallocated, it in turn clears its dictionary,
+                  thus hopefully breaking any circular references between modules
+                  and between a module's dictionary and its functions.
+                  Note that "import" will fail while we are cleaning up.
+                  */
+               mappingclear(tmp);
+               DECREF(tmp);
        }
-       import_modules = NULL;
 }
 
 
@@ -119,6 +112,10 @@ add_module(name)
 {
        object *m;
 
+       if (import_modules == NULL) {
+               err_setstr(SystemError, "sys.modules has been deleted");
+               return NULL;
+       }
        if ((m = dictlookup(import_modules, name)) != NULL &&
            is_moduleobject(m))
                return m;
@@ -574,6 +571,10 @@ import_module(name)
 {
        object *m;
 
+       if (import_modules == NULL) {
+               err_setstr(SystemError, "sys.modules has been deleted");
+               return NULL;
+       }
        if ((m = dictlookup(import_modules, name)) != NULL) {
                INCREF(m);
        }
@@ -615,6 +616,10 @@ reload_module(m)
        name = getmodulename(m);
        if (name == NULL)
                return NULL;
+       if (import_modules == NULL) {
+               err_setstr(SystemError, "sys.modules has been deleted");
+               return NULL;
+       }
        if (m != dictlookup(import_modules, name)) {
                err_setstr(ImportError, "reload() module not in sys.modules");
                return NULL;