Issue #21715: Extracted shared complicated code in the _io module to new

_PyErr_ChainExceptions() function.
This commit is contained in:
Serhiy Storchaka 2014-10-08 22:32:50 +03:00
commit 78184af9b5
5 changed files with 33 additions and 42 deletions

View file

@ -384,6 +384,30 @@ PyErr_SetExcInfo(PyObject *p_type, PyObject *p_value, PyObject *p_traceback)
Py_XDECREF(oldtraceback);
}
/* Like PyErr_Restore(), but if an exception is already set,
set the context associated with it.
*/
void
_PyErr_ChainExceptions(PyObject *exc, PyObject *val, PyObject *tb)
{
if (exc == NULL)
return;
if (PyErr_Occurred()) {
PyObject *exc2, *val2, *tb2;
PyErr_Fetch(&exc2, &val2, &tb2);
PyErr_NormalizeException(&exc, &val, &tb);
Py_DECREF(exc);
Py_XDECREF(tb);
PyErr_NormalizeException(&exc2, &val2, &tb2);
PyException_SetContext(val2, val);
PyErr_Restore(exc2, val2, tb2);
}
else {
PyErr_Restore(exc, val, tb);
}
}
/* Convenience functions to set a type error exception and return 0 */
int