Kaydet (Commit) 971a7aae authored tarafından 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.
üst 1f39c5c6
......@@ -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
}
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