]> granicus.if.org Git - python/commitdiff
Issue #27454: Use PyDict_SetDefault in PyUnicode_InternInPlace
authorBerker Peksag <berker.peksag@gmail.com>
Mon, 25 Jul 2016 01:40:39 +0000 (04:40 +0300)
committerBerker Peksag <berker.peksag@gmail.com>
Mon, 25 Jul 2016 01:40:39 +0000 (04:40 +0300)
Patch by INADA Naoki.

Objects/unicodeobject.c

index db6a51ca22ae0fd9b7d311ce9242cb7065da2c8f..0932f35b7668c3634f838f80aa137d4f11822283 100644 (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) {
-        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;