changeset: 91123:a98fd4eeed40 branch: 3.4 parent: 91119:b841b80e6421 user: Serhiy Storchaka date: Wed Jun 11 07:18:53 2014 +0300 files: Modules/_io/_iomodule.c Modules/_io/bufferedio.c Modules/_io/textio.c description: PyErr_NormalizeException doesn't like being called with an exception set (issues #21677, #21310). diff -r b841b80e6421 -r a98fd4eeed40 Modules/_io/_iomodule.c --- a/Modules/_io/_iomodule.c Tue Jun 10 12:07:45 2014 -0500 +++ b/Modules/_io/_iomodule.c Wed Jun 11 07:18:53 2014 +0300 @@ -470,14 +470,14 @@ if (_PyObject_CallMethodId(result, &PyId_close, NULL) != NULL) PyErr_Restore(exc, val, tb); else { - PyObject *val2; + PyObject *exc2, *val2, *tb2; + PyErr_Fetch(&exc2, &val2, &tb2); PyErr_NormalizeException(&exc, &val, &tb); Py_XDECREF(exc); Py_XDECREF(tb); - PyErr_Fetch(&exc, &val2, &tb); - PyErr_NormalizeException(&exc, &val2, &tb); + PyErr_NormalizeException(&exc2, &val2, &tb2); PyException_SetContext(val2, val); - PyErr_Restore(exc, val2, tb); + PyErr_Restore(exc2, val2, tb2); } Py_DECREF(result); } diff -r b841b80e6421 -r a98fd4eeed40 Modules/_io/bufferedio.c --- a/Modules/_io/bufferedio.c Tue Jun 10 12:07:45 2014 -0500 +++ b/Modules/_io/bufferedio.c Wed Jun 11 07:18:53 2014 +0300 @@ -548,14 +548,14 @@ PyErr_Restore(exc, val, tb); } else { - PyObject *val2; + PyObject *exc2, *val2, *tb2; + PyErr_Fetch(&exc2, &val2, &tb2); PyErr_NormalizeException(&exc, &val, &tb); Py_DECREF(exc); Py_XDECREF(tb); - PyErr_Fetch(&exc, &val2, &tb); - PyErr_NormalizeException(&exc, &val2, &tb); + PyErr_NormalizeException(&exc2, &val2, &tb2); PyException_SetContext(val2, val); - PyErr_Restore(exc, val2, tb); + PyErr_Restore(exc2, val2, tb2); } } diff -r b841b80e6421 -r a98fd4eeed40 Modules/_io/textio.c --- a/Modules/_io/textio.c Tue Jun 10 12:07:45 2014 -0500 +++ b/Modules/_io/textio.c Wed Jun 11 07:18:53 2014 +0300 @@ -2613,14 +2613,14 @@ PyErr_Restore(exc, val, tb); } else { - PyObject *val2; + PyObject *exc2, *val2, *tb2; + PyErr_Fetch(&exc2, &val2, &tb2); PyErr_NormalizeException(&exc, &val, &tb); Py_DECREF(exc); Py_XDECREF(tb); - PyErr_Fetch(&exc, &val2, &tb); - PyErr_NormalizeException(&exc, &val2, &tb); + PyErr_NormalizeException(&exc2, &val2, &tb2); PyException_SetContext(val2, val); - PyErr_Restore(exc, val2, tb); + PyErr_Restore(exc2, val2, tb2); } } return res;