]> granicus.if.org Git - python/commitdiff
Issue #25556: Add assertions to PyObject_GetItem() to ensure that an exception
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 5 Nov 2015 12:56:58 +0000 (13:56 +0100)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 5 Nov 2015 12:56:58 +0000 (13:56 +0100)
is raised when it returns NULL.

Simplify also ceval.c: rely on the fact that PyObject_GetItem() raised an
exception when it returns NULL.

Objects/abstract.c
Python/ceval.c

index 63fcf156f3af288429a439e44f84be5f6dd90779..2c1c76e4bdd7eae2889070a6f7d7521722271483 100644 (file)
@@ -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;
             }
         }
index 67ea388d85f6273b71220c809f2ed941526733c1..7f9ef6fc5bba78170a34d852d8618fc720675dfd 100644 (file)
@@ -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();