From ced8d4c6ebc23598a9c14736dbc69533c80a78f7 Mon Sep 17 00:00:00 2001 From: Berker Peksag Date: Mon, 25 Jul 2016 04:40:39 +0300 Subject: Issue #27454: Use PyDict_SetDefault in PyUnicode_InternInPlace Patch by INADA Naoki. --- Objects/unicodeobject.c | 20 ++++++-------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/Objects/unicodeobject.c b/Objects/unicodeobject.c index db6a51c..0932f35 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; -- cgit v0.12