summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <victor.stinner@gmail.com>2015-11-05 12:56:58 (GMT)
committerVictor Stinner <victor.stinner@gmail.com>2015-11-05 12:56:58 (GMT)
commite20310fa19188f764b84fbdc40d32d6933f98af9 (patch)
treec73dc9663e3eae48af1d2933c60ae3b8d9de9641
parentef072961e1773ad6b066ae22fc507c28f91c6a3a (diff)
downloadcpython-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.c11
-rw-r--r--Python/ceval.c4
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();