mirror of
https://github.com/python/cpython.git
synced 2025-08-31 14:07:50 +00:00
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.
This commit is contained in:
parent
1f39c5c666
commit
971a7aaeac
1 changed files with 16 additions and 6 deletions
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue