]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
New rules for deleting modules. Rather than having an elaborate
authorGuido van Rossum <guido@python.org>
Tue, 5 Aug 1997 02:20:51 +0000 (02:20 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 5 Aug 1997 02:20:51 +0000 (02:20 +0000)
scheme based on object's types, have a simple two-phase scheme based
on object's *names*:

/* To make the execution order of destructors for global
   objects a bit more predictable, we first zap all objects
   whose name starts with a single underscore, before we clear
   the entire dictionary.  We zap them by replacing them with
   None, rather than deleting them from the dictionary, to
   avoid rehashing the dictionary (to some extent). */

Python/import.c

index 2a77e5a3597e6cc91d8e93060aae882ab9175e0a..446b4991ce7ba92ceaf8f7182d4af9db9a5cbb70 100644 (file)
@@ -100,6 +100,34 @@ PyImport_GetModuleDict()
 }
 
 
+/* Helper for PyImport_Cleanup */
+
+static void
+clear_carefully(d)
+       PyObject *d;
+{
+       /* To make the execution order of destructors for global
+          objects a bit more predictable, we first zap all objects
+          whose name starts with a single underscore, before we clear
+          the entire dictionary.  We zap them by replacing them with
+          None, rather than deleting them from the dictionary, to
+          avoid rehashing the dictionary (to some extent). */
+
+       int pos;
+       PyObject *key, *value;
+
+       pos = 0;
+       while (PyDict_Next(d, &pos, &key, &value)) {
+               if (value != Py_None && PyString_Check(key)) {
+                       char *s = PyString_AsString(key);
+                       if (s[0] == '_' && s[1] != '_')
+                               PyDict_SetItem(d, key, Py_None);
+               }
+       }
+       
+       PyDict_Clear(d);
+}
+
 /* Un-initialize things, as good as we can */
 
 void
@@ -115,7 +143,7 @@ PyImport_Cleanup()
                while (PyDict_Next(tmp, &pos, &key, &value)) {
                        if (PyModule_Check(value)) {
                                PyObject *d = PyModule_GetDict(value);
-                               PyDict_Clear(d);
+                               clear_carefully(d);
                        }
                }
                PyDict_Clear(tmp);