summaryrefslogtreecommitdiff
path: root/Objects/dictobject.c
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2020-10-26 12:47:57 +0200
committerGitHub <noreply@github.com>2020-10-26 12:47:57 +0200
commitb510e101f8b5b31276bf97b921ca9247162881d2 (patch)
tree582a988d8259c0d92d67fbe739852ea0ec46e4fa /Objects/dictobject.c
parentfb5db7ec58624cab0797b4050735be865d380823 (diff)
downloadcpython-git-b510e101f8b5b31276bf97b921ca9247162881d2.tar.gz
bpo-42152: Use PyDict_Contains and PyDict_SetDefault if appropriate. (GH-22986)
If PyDict_GetItemWithError is only used to check whether the key is in dict, it is better to use PyDict_Contains instead. And if it is used in combination with PyDict_SetItem, PyDict_SetDefault can replace the combination.
Diffstat (limited to 'Objects/dictobject.c')
-rw-r--r--Objects/dictobject.c45
1 files changed, 22 insertions, 23 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 00d6ab3be2..faa8696153 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -2544,8 +2544,8 @@ PyDict_MergeFromSeq2(PyObject *d, PyObject *seq2, int override)
goto Fail;
}
}
- else if (PyDict_GetItemWithError(d, key) == NULL) {
- if (PyErr_Occurred() || PyDict_SetItem(d, key, value) < 0) {
+ else {
+ if (PyDict_SetDefault(d, key, value) == NULL) {
Py_DECREF(key);
Py_DECREF(value);
goto Fail;
@@ -2660,19 +2660,20 @@ dict_merge(PyObject *a, PyObject *b, int override)
Py_INCREF(value);
if (override == 1)
err = insertdict(mp, key, hash, value);
- else if (_PyDict_GetItem_KnownHash(a, key, hash) == NULL) {
- if (PyErr_Occurred()) {
- Py_DECREF(value);
- Py_DECREF(key);
- return -1;
+ else {
+ err = _PyDict_Contains_KnownHash(a, key, hash);
+ if (err == 0) {
+ err = insertdict(mp, key, hash, value);
+ }
+ else if (err > 0) {
+ if (override != 0) {
+ _PyErr_SetKeyError(key);
+ Py_DECREF(value);
+ Py_DECREF(key);
+ return -1;
+ }
+ err = 0;
}
- err = insertdict(mp, key, hash, value);
- }
- else if (override != 0) {
- _PyErr_SetKeyError(key);
- Py_DECREF(value);
- Py_DECREF(key);
- return -1;
}
Py_DECREF(value);
Py_DECREF(key);
@@ -2709,18 +2710,16 @@ dict_merge(PyObject *a, PyObject *b, int override)
for (key = PyIter_Next(iter); key; key = PyIter_Next(iter)) {
if (override != 1) {
- if (PyDict_GetItemWithError(a, key) != NULL) {
- if (override != 0) {
+ status = PyDict_Contains(a, key);
+ if (status != 0) {
+ if (status > 0) {
+ if (override == 0) {
+ Py_DECREF(key);
+ continue;
+ }
_PyErr_SetKeyError(key);
- Py_DECREF(key);
- Py_DECREF(iter);
- return -1;
}
Py_DECREF(key);
- continue;
- }
- else if (PyErr_Occurred()) {
- Py_DECREF(key);
Py_DECREF(iter);
return -1;
}