Skip to content

Commit

Permalink
pythongh-112066: Use PyDict_SetDefaultRef in place of `PyDict_SetDe…
Browse files Browse the repository at this point in the history
…fault`. (python#112211)

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

Co-authored-by: Erlend E. Aasland <[email protected]>
  • Loading branch information
2 people authored and fsc-eriker committed Feb 14, 2024
1 parent 3eb2dfe commit 891db02
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 25 deletions.
5 changes: 2 additions & 3 deletions Modules/_json.c
Original file line number Diff line number Diff line change
Expand Up @@ -691,11 +691,10 @@ _parse_object_unicode(PyScannerObject *s, PyObject *memo, PyObject *pystr, Py_ss
key = scanstring_unicode(pystr, idx + 1, s->strict, &next_idx);
if (key == NULL)
goto bail;
memokey = PyDict_SetDefault(memo, key, key);
if (memokey == NULL) {
if (PyDict_SetDefaultRef(memo, key, key, &memokey) < 0) {
goto bail;
}
Py_SETREF(key, Py_NewRef(memokey));
Py_SETREF(key, memokey);
idx = next_idx;

/* skip whitespace between key and : delimiter, read :, skip whitespace */
Expand Down
2 changes: 1 addition & 1 deletion Modules/posixmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -1627,7 +1627,7 @@ convertenviron(void)
Py_DECREF(d);
return NULL;
}
if (PyDict_SetDefault(d, k, v) == NULL) {
if (PyDict_SetDefaultRef(d, k, v, NULL) < 0) {
Py_DECREF(v);
Py_DECREF(k);
Py_DECREF(d);
Expand Down
3 changes: 2 additions & 1 deletion Modules/pyexpat.c
Original file line number Diff line number Diff line change
Expand Up @@ -1615,7 +1615,8 @@ static int init_handler_descrs(pyexpat_state *state)
if (descr == NULL)
return -1;

if (PyDict_SetDefault(state->xml_parse_type->tp_dict, PyDescr_NAME(descr), descr) == NULL) {
if (PyDict_SetDefaultRef(state->xml_parse_type->tp_dict,
PyDescr_NAME(descr), descr, NULL) < 0) {
Py_DECREF(descr);
return -1;
}
Expand Down
6 changes: 3 additions & 3 deletions Objects/typeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -6683,7 +6683,7 @@ type_add_method(PyTypeObject *type, PyMethodDef *meth)
int err;
PyObject *dict = lookup_tp_dict(type);
if (!(meth->ml_flags & METH_COEXIST)) {
err = PyDict_SetDefault(dict, name, descr) == NULL;
err = PyDict_SetDefaultRef(dict, name, descr, NULL) < 0;
}
else {
err = PyDict_SetItem(dict, name, descr) < 0;
Expand Down Expand Up @@ -6731,7 +6731,7 @@ type_add_members(PyTypeObject *type)
if (descr == NULL)
return -1;

if (PyDict_SetDefault(dict, PyDescr_NAME(descr), descr) == NULL) {
if (PyDict_SetDefaultRef(dict, PyDescr_NAME(descr), descr, NULL) < 0) {
Py_DECREF(descr);
return -1;
}
Expand All @@ -6756,7 +6756,7 @@ type_add_getset(PyTypeObject *type)
return -1;
}

if (PyDict_SetDefault(dict, PyDescr_NAME(descr), descr) == NULL) {
if (PyDict_SetDefaultRef(dict, PyDescr_NAME(descr), descr, NULL) < 0) {
Py_DECREF(descr);
return -1;
}
Expand Down
12 changes: 7 additions & 5 deletions Objects/unicodeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -14894,16 +14894,18 @@ _PyUnicode_InternInPlace(PyInterpreterState *interp, PyObject **p)
PyObject *interned = get_interned_dict(interp);
assert(interned != NULL);

PyObject *t = PyDict_SetDefault(interned, s, s);
if (t == NULL) {
PyObject *t;
int res = PyDict_SetDefaultRef(interned, s, s, &t);
if (res < 0) {
PyErr_Clear();
return;
}

if (t != s) {
Py_SETREF(*p, Py_NewRef(t));
else if (res == 1) {
// value was already present (not inserted)
Py_SETREF(*p, t);
return;
}
Py_DECREF(t);

if (_Py_IsImmortal(s)) {
// XXX Restrict this to the main interpreter?
Expand Down
29 changes: 17 additions & 12 deletions Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
}

Expand Down

0 comments on commit 891db02

Please sign in to comment.