diff -r 3fffe9681f60 Objects/abstract.c --- a/Objects/abstract.c Mon Jun 23 15:14:50 2014 +0200 +++ b/Objects/abstract.c Tue Jun 24 11:48:33 2014 +0200 @@ -82,6 +82,10 @@ PyObject_LengthHint(PyObject *o, Py_ssiz PyObject *hint, *result; Py_ssize_t res; _Py_IDENTIFIER(__length_hint__); + + /* PyErr_Clear() is used below */ + assert(!PyErr_Occurred()); + if (_PyObject_HasLen(o)) { res = PyObject_Length(o); if (res < 0 && PyErr_Occurred()) { @@ -280,6 +284,9 @@ PyObject_CheckReadBuffer(PyObject *obj) PyBufferProcs *pb = obj->ob_type->tp_as_buffer; Py_buffer view; + /* PyErr_Clear() is used below */ + assert(!PyErr_Occurred()); + if (pb == NULL || pb->bf_getbuffer == NULL) return 0; @@ -1218,7 +1225,12 @@ PyNumber_AsSsize_t(PyObject *item, PyObj { Py_ssize_t result; PyObject *runerr; - PyObject *value = PyNumber_Index(item); + PyObject *value; + + /* PyErr_Clear() is used below */ + assert(!PyErr_Occurred()); + + value = PyNumber_Index(item); if (value == NULL) return -1; @@ -1985,6 +1997,9 @@ PyMapping_HasKeyString(PyObject *o, cons { PyObject *v; + /* PyErr_Clear() is used below */ + assert(!PyErr_Occurred()); + v = PyMapping_GetItemString(o, key); if (v) { Py_DECREF(v); @@ -1999,6 +2014,9 @@ PyMapping_HasKey(PyObject *o, PyObject * { PyObject *v; + /* PyErr_Clear() is used below */ + assert(!PyErr_Occurred()); + v = PyObject_GetItem(o, key); if (v) { Py_DECREF(v); @@ -2412,6 +2430,9 @@ abstract_get_bases(PyObject *cls) _Py_IDENTIFIER(__bases__); PyObject *bases; + /* PyErr_Clear() is used below */ + assert(!PyErr_Occurred()); + Py_ALLOW_RECURSION bases = _PyObject_GetAttrId(cls, &PyId___bases__); Py_END_ALLOW_RECURSION @@ -2486,6 +2507,9 @@ recursive_isinstance(PyObject *inst, PyO int retval = 0; _Py_IDENTIFIER(__class__); + /* PyErr_Clear() is used below */ + assert(!PyErr_Occurred()); + if (PyType_Check(cls)) { retval = PyObject_TypeCheck(inst, (PyTypeObject *)cls); if (retval == 0) { @@ -2691,6 +2715,10 @@ PyObject * PyIter_Next(PyObject *iter) { PyObject *result; + + /* PyErr_Clear() is used below */ + assert(!PyErr_Occurred()); + result = (*iter->ob_type->tp_iternext)(iter); if (result == NULL && PyErr_Occurred() && diff -r 3fffe9681f60 Objects/rangeobject.c --- a/Objects/rangeobject.c Mon Jun 23 15:14:50 2014 +0200 +++ b/Objects/rangeobject.c Tue Jun 24 11:48:33 2014 +0200 @@ -24,6 +24,9 @@ typedef struct { static PyObject * validate_step(PyObject *step) { + /* PyNumber_AsSsize_t() can clear the current exception */ + assert(!PyErr_Occurred()); + /* No step specified, use a step of 1. */ if (!step) return PyLong_FromLong(1); @@ -116,7 +119,7 @@ range_new(PyTypeObject *type, PyObject * Py_DECREF(start); return NULL; } - step = validate_step(step); /* Caution, this can clear exceptions */ + step = validate_step(step); if (!step) { Py_DECREF(start); Py_DECREF(stop); @@ -987,7 +990,7 @@ static PyObject * longrangeiter_setstate(longrangeiterobject *r, PyObject *state) { int cmp; - + /* clip the value */ PyObject *zero = PyLong_FromLong(0); if (zero == NULL) @@ -1007,7 +1010,7 @@ longrangeiter_setstate(longrangeiterobje return NULL; if (cmp > 0) state = r->len; - + Py_CLEAR(r->index); r->index = state; Py_INCREF(r->index);