bpo-42093: Cleanup _PyDict_GetItemHint() (GH-24582)

* No longer save/restore the current exception. It is no longer used
  with an exception raised.
* No longer clear the current exception on error: it's now up to the
  caller.
This commit is contained in:
Victor Stinner 2021-02-21 12:02:04 +01:00 committed by GitHub
parent 38b6c2acd4
commit d5fc998737
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 20 additions and 36 deletions

View file

@ -1439,11 +1439,8 @@ PyDict_GetItem(PyObject *op, PyObject *key)
Py_ssize_t
_PyDict_GetItemHint(PyDictObject *mp, PyObject *key,
Py_ssize_t hint, PyObject **value)
Py_ssize_t hint, PyObject **value)
{
Py_hash_t hash;
PyThreadState *tstate;
assert(*value == NULL);
assert(PyDict_CheckExact((PyObject*)mp));
assert(PyUnicode_CheckExact(key));
@ -1467,39 +1464,15 @@ _PyDict_GetItemHint(PyDictObject *mp, PyObject *key,
}
}
if ((hash = ((PyASCIIObject *) key)->hash) == -1)
{
Py_hash_t hash = ((PyASCIIObject *) key)->hash;
if (hash == -1) {
hash = PyObject_Hash(key);
if (hash == -1) {
PyErr_Clear();
return -1;
}
}
// We can arrive here with a NULL tstate during initialization: try
// running "python -Wi" for an example related to string interning
tstate = _PyThreadState_UncheckedGet();
Py_ssize_t ix = 0;
if (tstate != NULL && tstate->curexc_type != NULL) {
/* preserve the existing exception */
PyObject *err_type, *err_value, *err_tb;
PyErr_Fetch(&err_type, &err_value, &err_tb);
ix = (mp->ma_keys->dk_lookup)(mp, key, hash, value);
/* ignore errors */
PyErr_Restore(err_type, err_value, err_tb);
if (ix < 0) {
return -1;
}
}
else {
ix = (mp->ma_keys->dk_lookup)(mp, key, hash, value);
if (ix < 0) {
PyErr_Clear();
return -1;
}
}
return ix;
return (mp->ma_keys->dk_lookup)(mp, key, hash, value);
}
/* Same as PyDict_GetItemWithError() but with hash supplied by caller.