Issue #27454: Use PyDict_SetDefault in PyUnicode_InternInPlace

Patch by INADA Naoki.
This commit is contained in:
Berker Peksag 2016-07-25 04:40:39 +03:00
parent 81fb0e33d6
commit ced8d4c6eb
1 changed files with 6 additions and 14 deletions

View File

@ -15039,26 +15039,18 @@ PyUnicode_InternInPlace(PyObject **p)
return;
}
}
/* It might be that the GetItem call fails even
though the key is present in the dictionary,
namely when this happens during a stack overflow. */
Py_ALLOW_RECURSION
t = PyDict_GetItem(interned, s);
t = PyDict_SetDefault(interned, s, s);
Py_END_ALLOW_RECURSION
if (t) {
if (t == NULL) {
PyErr_Clear();
return;
}
if (t != s) {
Py_INCREF(t);
Py_SETREF(*p, t);
return;
}
PyThreadState_GET()->recursion_critical = 1;
if (PyDict_SetItem(interned, s, s) < 0) {
PyErr_Clear();
PyThreadState_GET()->recursion_critical = 0;
return;
}
PyThreadState_GET()->recursion_critical = 0;
/* The two references in interned are not counted by refcnt.
The deallocator will take care of this */
Py_REFCNT(s) -= 2;