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.
This commit is contained in:
Serhiy Storchaka 2020-10-26 12:47:57 +02:00 committed by GitHub
parent fb5db7ec58
commit b510e101f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 137 additions and 165 deletions

View file

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