summaryrefslogtreecommitdiffstats
path: root/Objects/dictobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'Objects/dictobject.c')
-rw-r--r--Objects/dictobject.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/Objects/dictobject.c b/Objects/dictobject.c
index 5aa2c0d..719d438 100644
--- a/Objects/dictobject.c
+++ b/Objects/dictobject.c
@@ -1663,8 +1663,8 @@ _PyDict_FromItems(PyObject *const *keys, Py_ssize_t keys_offset,
* function hits a stack-depth error, which can cause this to return NULL
* even if the key is present.
*/
-PyObject *
-PyDict_GetItem(PyObject *op, PyObject *key)
+static PyObject *
+dict_getitem(PyObject *op, PyObject *key, const char *warnmsg)
{
if (!PyDict_Check(op)) {
return NULL;
@@ -1675,7 +1675,7 @@ PyDict_GetItem(PyObject *op, PyObject *key)
if (!PyUnicode_CheckExact(key) || (hash = unicode_get_hash(key)) == -1) {
hash = PyObject_Hash(key);
if (hash == -1) {
- PyErr_Clear();
+ PyErr_FormatUnraisable(warnmsg);
return NULL;
}
}
@@ -1696,12 +1696,24 @@ PyDict_GetItem(PyObject *op, PyObject *key)
ix = _Py_dict_lookup(mp, key, hash, &value);
/* Ignore any exception raised by the lookup */
+ PyObject *exc2 = _PyErr_Occurred(tstate);
+ if (exc2 && !PyErr_GivenExceptionMatches(exc2, PyExc_KeyError)) {
+ PyErr_FormatUnraisable(warnmsg);
+ }
_PyErr_SetRaisedException(tstate, exc);
assert(ix >= 0 || value == NULL);
return value; // borrowed reference
}
+PyObject *
+PyDict_GetItem(PyObject *op, PyObject *key)
+{
+ return dict_getitem(op, key,
+ "Exception ignored in PyDict_GetItem(); consider using "
+ "PyDict_GetItemRef() or PyDict_GetItemWithError()");
+}
+
Py_ssize_t
_PyDict_LookupIndex(PyDictObject *mp, PyObject *key)
{
@@ -3925,10 +3937,14 @@ PyDict_GetItemString(PyObject *v, const char *key)
PyObject *kv, *rv;
kv = PyUnicode_FromString(key);
if (kv == NULL) {
- PyErr_Clear();
+ PyErr_FormatUnraisable(
+ "Exception ignored in PyDict_GetItemString(); consider using "
+ "PyDict_GetItemRefString()");
return NULL;
}
- rv = PyDict_GetItem(v, kv);
+ rv = dict_getitem(v, kv,
+ "Exception ignored in PyDict_GetItemString(); consider using "
+ "PyDict_GetItemRefString()");
Py_DECREF(kv);
return rv; // borrowed reference
}