gh-112066: Use PyDict_SetDefaultRef in place of PyDict_SetDefault. (#112211)

This changes a number of internal usages of `PyDict_SetDefault` to use `PyDict_SetDefaultRef`.

Co-authored-by: Erlend E. Aasland <erlend.aasland@protonmail.com>
This commit is contained in:
Sam Gross 2024-02-07 13:43:18 -05:00 committed by GitHub
parent fedbf77191
commit ef3ceab09d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 32 additions and 25 deletions

View file

@ -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;
}