diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2015-11-05 12:56:58 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2015-11-05 12:56:58 (GMT) |
commit | e20310fa19188f764b84fbdc40d32d6933f98af9 (patch) | |
tree | c73dc9663e3eae48af1d2933c60ae3b8d9de9641 | |
parent | ef072961e1773ad6b066ae22fc507c28f91c6a3a (diff) | |
download | cpython-e20310fa19188f764b84fbdc40d32d6933f98af9.zip cpython-e20310fa19188f764b84fbdc40d32d6933f98af9.tar.gz cpython-e20310fa19188f764b84fbdc40d32d6933f98af9.tar.bz2 |
Issue #25556: Add assertions to PyObject_GetItem() to ensure that an exception
is raised when it returns NULL.
Simplify also ceval.c: rely on the fact that PyObject_GetItem() raised an
exception when it returns NULL.
-rw-r--r-- | Objects/abstract.c | 11 | ||||
-rw-r--r-- | Python/ceval.c | 4 |
2 files changed, 10 insertions, 5 deletions
diff --git a/Objects/abstract.c b/Objects/abstract.c index 63fcf15..2c1c76e 100644 --- a/Objects/abstract.c +++ b/Objects/abstract.c @@ -141,8 +141,11 @@ PyObject_GetItem(PyObject *o, PyObject *key) return null_error(); m = o->ob_type->tp_as_mapping; - if (m && m->mp_subscript) - return m->mp_subscript(o, key); + if (m && m->mp_subscript) { + PyObject *item = m->mp_subscript(o, key); + assert((item != NULL) ^ (PyErr_Occurred() != NULL)); + return item; + } if (o->ob_type->tp_as_sequence) { if (PyIndex_Check(key)) { @@ -1526,8 +1529,10 @@ PySequence_GetItem(PyObject *s, Py_ssize_t i) if (i < 0) { if (m->sq_length) { Py_ssize_t l = (*m->sq_length)(s); - if (l < 0) + if (l < 0) { + assert(PyErr_Occurred()); return NULL; + } i += l; } } diff --git a/Python/ceval.c b/Python/ceval.c index 67ea388..7f9ef6f 100644 --- a/Python/ceval.c +++ b/Python/ceval.c @@ -2307,7 +2307,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) } else { v = PyObject_GetItem(locals, name); - if (v == NULL && _PyErr_OCCURRED()) { + if (v == NULL) { if (!PyErr_ExceptionMatches(PyExc_KeyError)) goto error; PyErr_Clear(); @@ -2426,7 +2426,7 @@ PyEval_EvalFrameEx(PyFrameObject *f, int throwflag) } else { value = PyObject_GetItem(locals, name); - if (value == NULL && PyErr_Occurred()) { + if (value == NULL) { if (!PyErr_ExceptionMatches(PyExc_KeyError)) goto error; PyErr_Clear(); |