diff -r 57550e1f57d9 Modules/atexitmodule.c --- a/Modules/atexitmodule.c Tue Mar 24 14:01:32 2015 +0100 +++ b/Modules/atexitmodule.c Tue Mar 24 15:38:57 2015 +0100 @@ -97,7 +97,8 @@ atexit_callfuncs(void) Py_XDECREF(exc_tb); } PyErr_Fetch(&exc_type, &exc_value, &exc_tb); - if (!PyErr_ExceptionMatches(PyExc_SystemExit)) { + if (exc_type + && !PyErr_GivenExceptionMatches(exc_type, PyExc_SystemExit)) { PySys_WriteStderr("Error in atexit._run_exitfuncs:\n"); PyErr_NormalizeException(&exc_type, &exc_value, &exc_tb); PyErr_Display(exc_type, exc_value, exc_tb); diff -r 57550e1f57d9 Objects/genobject.c --- a/Objects/genobject.c Tue Mar 24 14:01:32 2015 +0100 +++ b/Objects/genobject.c Tue Mar 24 15:38:57 2015 +0100 @@ -394,7 +394,8 @@ int PyObject *et, *ev, *tb; PyObject *value = NULL; - if (PyErr_ExceptionMatches(PyExc_StopIteration)) { + et = PyErr_Occurred(); + if (et && PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) { PyErr_Fetch(&et, &ev, &tb); Py_XDECREF(et); Py_XDECREF(tb); @@ -403,7 +404,7 @@ int Py_INCREF(value); Py_DECREF(ev); } - } else if (PyErr_Occurred()) { + } else if (et) { return -1; } if (value == NULL) { diff -r 57550e1f57d9 Python/ceval.c --- a/Python/ceval.c Tue Mar 24 14:01:32 2015 +0100 +++ b/Python/ceval.c Tue Mar 24 15:38:57 2015 +0100 @@ -1940,9 +1940,13 @@ PyEval_EvalFrameEx(PyFrameObject *f, int Py_DECREF(v); if (retval == NULL) { PyObject *val; - if (tstate->c_tracefunc != NULL - && PyErr_ExceptionMatches(PyExc_StopIteration)) - call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, tstate, f); + if (tstate->c_tracefunc != NULL) { + PyObject *exc_type = PyErr_Occurred(); + if (exc_type != NULL + && PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) + call_exc_trace(tstate->c_tracefunc, tstate->c_traceobj, + tstate, f); + } err = _PyGen_FetchStopIterationValue(&val); if (err < 0) goto error; diff -r 57550e1f57d9 Python/errors.c --- a/Python/errors.c Tue Mar 24 14:01:32 2015 +0100 +++ b/Python/errors.c Tue Mar 24 15:38:57 2015 +0100 @@ -210,7 +210,9 @@ PyErr_GivenExceptionMatches(PyObject *er int PyErr_ExceptionMatches(PyObject *exc) { - return PyErr_GivenExceptionMatches(PyErr_Occurred(), exc); + PyObject *cur_exc = PyErr_Occurred(); + assert(cur_exc != NULL); + return PyErr_GivenExceptionMatches(cur_exc, exc); }