Commit 7e0bfbb0 authored by Guido van Rossum's avatar Guido van Rossum

Change the Fini function to only remove otherwise unreferenced strings

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.
parent 08be105f
...@@ -1043,8 +1043,6 @@ PyString_InternInPlace(p) ...@@ -1043,8 +1043,6 @@ PyString_InternInPlace(p)
interned = PyDict_New(); interned = PyDict_New();
if (interned == NULL) if (interned == NULL)
return; return;
/* Force slow lookups: */
PyDict_SetItem(interned, Py_None, Py_None);
} }
if ((t = PyDict_GetItem(interned, (PyObject *)s)) != NULL) { if ((t = PyDict_GetItem(interned, (PyObject *)s)) != NULL) {
Py_INCREF(t); Py_INCREF(t);
...@@ -1078,10 +1076,6 @@ void ...@@ -1078,10 +1076,6 @@ void
PyString_Fini() PyString_Fini()
{ {
int i; int i;
#ifdef INTERN_STRINGS
Py_XDECREF(interned);
interned = NULL;
#endif
for (i = 0; i < UCHAR_MAX + 1; i++) { for (i = 0; i < UCHAR_MAX + 1; i++) {
Py_XDECREF(characters[i]); Py_XDECREF(characters[i]);
characters[i] = NULL; characters[i] = NULL;
...@@ -1090,4 +1084,20 @@ PyString_Fini() ...@@ -1090,4 +1084,20 @@ PyString_Fini()
Py_XDECREF(nullstring); Py_XDECREF(nullstring);
nullstring = NULL; nullstring = NULL;
#endif #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
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment