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`.

This changes a number of internal usages of `PyDict_SetDefault` to
use `PyDict_SetDefaultRef`.
  • Loading branch information
colesbury committed Nov 17, 2023
1 parent 74b1d0b commit 370587f
Show file tree
Hide file tree
Showing 7 changed files with 35 additions and 26 deletions.
5 changes: 2 additions & 3 deletions Modules/_json.c
Original file line number Diff line number Diff line change
Expand Up @@ -690,11 +690,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 @@ -1614,7 +1614,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 @@ -1622,7 +1622,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
2 changes: 1 addition & 1 deletion Objects/dictobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -2869,7 +2869,7 @@ PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
}
}
else {
if (PyDict_SetDefault(d, key, value) == NULL) {
if (PyDict_SetDefaultRef(d, key, value, NULL) < 0) {
Py_DECREF(key);
Py_DECREF(value);
goto Fail;
Expand Down
6 changes: 3 additions & 3 deletions Objects/typeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -6636,7 +6636,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 @@ -6684,7 +6684,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 @@ -6709,7 +6709,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 @@ -14878,16 +14878,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
31 changes: 19 additions & 12 deletions Python/compile.c
Original file line number Diff line number Diff line change
Expand Up @@ -981,14 +981,18 @@ 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) {
Py_DECREF(key);
return NULL;
}
if (res == 1) {
// o was already registered in const_cache. Just use it.
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 @@ -7537,22 +7541,25 @@ _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);
Py_SETREF(*obj, Py_NewRef(PyTuple_GET_ITEM(t, 1)));
Py_DECREF(t);
}
else {
Py_SETREF(*obj, t);
}

Py_SETREF(*obj, Py_NewRef(t));
return SUCCESS;
}

Expand Down

0 comments on commit 370587f

Please sign in to comment.