From: Berker Peksag Date: Mon, 25 Jul 2016 01:40:39 +0000 (+0300) Subject: Issue #27454: Use PyDict_SetDefault in PyUnicode_InternInPlace X-Git-Tag: v3.6.0a4~122 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ced8d4c6ebc23598a9c14736dbc69533c80a78f7;p=python Issue #27454: Use PyDict_SetDefault in PyUnicode_InternInPlace Patch by INADA Naoki. --- diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index db6a51ca22..0932f35b76 100644 --- a/Objects/unicodeobject.c +++ b/Objects/unicodeobject.c @@ -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) { - Py_INCREF(t); - Py_SETREF(*p, t); + if (t == NULL) { + PyErr_Clear(); return; } - - PyThreadState_GET()->recursion_critical = 1; - if (PyDict_SetItem(interned, s, s) < 0) { - PyErr_Clear(); - PyThreadState_GET()->recursion_critical = 0; + if (t != s) { + Py_INCREF(t); + Py_SETREF(*p, t); 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;