summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2020-10-26 10:47:57 (GMT)
committerGitHub <noreply@github.com>2020-10-26 10:47:57 (GMT)
commitb510e101f8b5b31276bf97b921ca9247162881d2 (patch)
tree582a988d8259c0d92d67fbe739852ea0ec46e4fa /Python
parentfb5db7ec58624cab0797b4050735be865d380823 (diff)
downloadcpython-b510e101f8b5b31276bf97b921ca9247162881d2.zip
cpython-b510e101f8b5b31276bf97b921ca9247162881d2.tar.gz
cpython-b510e101f8b5b31276bf97b921ca9247162881d2.tar.bz2
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 'Python')
-rw-r--r--Python/bltinmodule.c20
-rw-r--r--Python/errors.c9
-rw-r--r--Python/import.c24
3 files changed, 29 insertions, 24 deletions
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index 89b7fce..1ce55b6 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -924,12 +924,12 @@ builtin_eval_impl(PyObject *module, PyObject *source, PyObject *globals,
return NULL;
}
- if (_PyDict_GetItemIdWithError(globals, &PyId___builtins__) == NULL) {
- if (_PyDict_SetItemId(globals, &PyId___builtins__,
- PyEval_GetBuiltins()) != 0)
- return NULL;
+ int r = _PyDict_ContainsId(globals, &PyId___builtins__);
+ if (r == 0) {
+ r = _PyDict_SetItemId(globals, &PyId___builtins__,
+ PyEval_GetBuiltins());
}
- else if (PyErr_Occurred()) {
+ if (r < 0) {
return NULL;
}
@@ -1012,12 +1012,12 @@ builtin_exec_impl(PyObject *module, PyObject *source, PyObject *globals,
Py_TYPE(locals)->tp_name);
return NULL;
}
- if (_PyDict_GetItemIdWithError(globals, &PyId___builtins__) == NULL) {
- if (_PyDict_SetItemId(globals, &PyId___builtins__,
- PyEval_GetBuiltins()) != 0)
- return NULL;
+ int r = _PyDict_ContainsId(globals, &PyId___builtins__);
+ if (r == 0) {
+ r = _PyDict_SetItemId(globals, &PyId___builtins__,
+ PyEval_GetBuiltins());
}
- else if (PyErr_Occurred()) {
+ if (r < 0) {
return NULL;
}
diff --git a/Python/errors.c b/Python/errors.c
index 02cf479..f80ae21 100644
--- a/Python/errors.c
+++ b/Python/errors.c
@@ -1098,10 +1098,11 @@ PyErr_NewException(const char *name, PyObject *base, PyObject *dict)
goto failure;
}
- if (_PyDict_GetItemIdWithError(dict, &PyId___module__) == NULL) {
- if (_PyErr_Occurred(tstate)) {
- goto failure;
- }
+ int r = _PyDict_ContainsId(dict, &PyId___module__);
+ if (r < 0) {
+ goto failure;
+ }
+ if (r == 0) {
modulename = PyUnicode_FromStringAndSize(name,
(Py_ssize_t)(dot-name));
if (modulename == NULL)
diff --git a/Python/import.c b/Python/import.c
index 26b80f3..b79bda0 100644
--- a/Python/import.c
+++ b/Python/import.c
@@ -1018,14 +1018,14 @@ module_dict_for_exec(PyThreadState *tstate, PyObject *name)
/* If the module is being reloaded, we get the old module back
and re-use its dict to exec the new code. */
d = PyModule_GetDict(m);
- if (_PyDict_GetItemIdWithError(d, &PyId___builtins__) == NULL) {
- if (_PyErr_Occurred(tstate) ||
- _PyDict_SetItemId(d, &PyId___builtins__,
- PyEval_GetBuiltins()) != 0)
- {
- remove_module(tstate, name);
- return NULL;
- }
+ int r = _PyDict_ContainsId(d, &PyId___builtins__);
+ if (r == 0) {
+ r = _PyDict_SetItemId(d, &PyId___builtins__,
+ PyEval_GetBuiltins());
+ }
+ if (r < 0) {
+ remove_module(tstate, name);
+ return NULL;
}
return d; /* Return a borrowed reference. */
@@ -1660,10 +1660,14 @@ resolve_name(PyThreadState *tstate, PyObject *name, PyObject *globals, int level
goto error;
}
- if (_PyDict_GetItemIdWithError(globals, &PyId___path__) == NULL) {
+ int haspath = _PyDict_ContainsId(globals, &PyId___path__);
+ if (haspath < 0) {
+ goto error;
+ }
+ if (!haspath) {
Py_ssize_t dot;
- if (_PyErr_Occurred(tstate) || PyUnicode_READY(package) < 0) {
+ if (PyUnicode_READY(package) < 0) {
goto error;
}