]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Change the Fini function to only remove otherwise unreferenced strings
authorGuido van Rossum <guido@python.org>
Tue, 5 Aug 1997 02:15:12 +0000 (02:15 +0000)
committerGuido van Rossum <guido@python.org>
Tue, 5 Aug 1997 02:15:12 +0000 (02:15 +0000)
from the interned table.  There are references in hard-to-find static
variables all over the interpreter, and it's not worth trying to get
rid of all those; but "uninterning" isn't fair either and may cause
subtle failures later -- so we have to keep them in the interned
table.

Also get rid of no-longer-needed insert of None in interned dict.

Objects/stringobject.c

index 40dfc9ecd8af1dcc5e342fd91392c623bd1da89a..cb370386ef08f48886560a6cb3e003ec98002f77 100644 (file)
@@ -1043,8 +1043,6 @@ PyString_InternInPlace(p)
                interned = PyDict_New();
                if (interned == NULL)
                        return;
-               /* Force slow lookups: */
-               PyDict_SetItem(interned, Py_None, Py_None);
        }
        if ((t = PyDict_GetItem(interned, (PyObject *)s)) != NULL) {
                Py_INCREF(t);
@@ -1078,10 +1076,6 @@ void
 PyString_Fini()
 {
        int i;
-#ifdef INTERN_STRINGS
-       Py_XDECREF(interned);
-       interned = NULL;
-#endif
        for (i = 0; i < UCHAR_MAX + 1; i++) {
                Py_XDECREF(characters[i]);
                characters[i] = NULL;
@@ -1090,4 +1084,20 @@ PyString_Fini()
        Py_XDECREF(nullstring);
        nullstring = NULL;
 #endif
+#ifdef INTERN_STRINGS
+       if (interned) {
+               int pos, changed;
+               PyObject *key, *value;
+               do {
+                       changed = 0;
+                       pos = 0;
+                       while (PyDict_Next(interned, &pos, &key, &value)) {
+                               if (key->ob_refcnt == 2 && key == value) {
+                                       PyDict_DelItem(interned, key);
+                                       changed = 1;
+                               }
+                       }
+               } while (changed);
+       }
+#endif
 }