diff options
Diffstat (limited to 'Python/compile.c')
| -rw-r--r-- | Python/compile.c | 29 | 
1 files changed, 17 insertions, 12 deletions
diff --git a/Python/compile.c b/Python/compile.c index 4c1d3bb..15e5cf3 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -958,14 +958,15 @@ merge_consts_recursive(PyObject *const_cache, PyObject *o)          return NULL;      } -    // t is borrowed reference -    PyObject *t = PyDict_SetDefault(const_cache, key, key); -    if (t != key) { -        // o is registered in const_cache.  Just use it. -        Py_XINCREF(t); +    PyObject *t; +    int res = PyDict_SetDefaultRef(const_cache, key, key, &t); +    if (res != 0) { +        // o was not inserted into const_cache. t is either the existing value +        // or NULL (on error).          Py_DECREF(key);          return t;      } +    Py_DECREF(t);      // We registered o in const_cache.      // When o is a tuple or frozenset, we want to merge its @@ -7527,22 +7528,26 @@ _PyCompile_ConstCacheMergeOne(PyObject *const_cache, PyObject **obj)          return ERROR;      } -    // t is borrowed reference -    PyObject *t = PyDict_SetDefault(const_cache, key, key); +    PyObject *t; +    int res = PyDict_SetDefaultRef(const_cache, key, key, &t);      Py_DECREF(key); -    if (t == NULL) { +    if (res < 0) {          return ERROR;      } -    if (t == key) {  // obj is new constant. +    if (res == 0) {  // inserted: obj is new constant. +        Py_DECREF(t);          return SUCCESS;      }      if (PyTuple_CheckExact(t)) { -        // t is still borrowed reference -        t = PyTuple_GET_ITEM(t, 1); +        PyObject *item = PyTuple_GET_ITEM(t, 1); +        Py_SETREF(*obj, Py_NewRef(item)); +        Py_DECREF(t); +    } +    else { +        Py_SETREF(*obj, t);      } -    Py_SETREF(*obj, Py_NewRef(t));      return SUCCESS;  }  | 
