From d485d418533c977fee9d85a516d7d80657139177 Mon Sep 17 00:00:00 2001 From: Stefan Behnel Date: Tue, 3 Mar 2009 20:44:15 +0100 Subject: [PATCH] work-around to fix ticket #228 at least work in Py2.x, while still preventing crashes in Py3 --- Cython/Compiler/Nodes.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/Cython/Compiler/Nodes.py b/Cython/Compiler/Nodes.py index 1a2a6d75..eacc97f0 100644 --- a/Cython/Compiler/Nodes.py +++ b/Cython/Compiler/Nodes.py @@ -5425,15 +5425,22 @@ static INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *t PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); - tmp_type = tstate->exc_type; - tmp_value = tstate->exc_value; - tmp_tb = tstate->exc_traceback; - tstate->exc_type = 0; - tstate->exc_value = 0; - tstate->exc_traceback = 0; - Py_XDECREF(tmp_type); - Py_XDECREF(tmp_value); - Py_XDECREF(tmp_tb); +#if PY_MAJOR_VERSION >= 3 + /* Note: this is a temporary work-around to prevent crashes in Python 3.0 */ + if ((tstate->exc_type != NULL) & (tstate->exc_type != Py_None)) { + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + PyErr_NormalizeException(&type, &value, &tb); + PyErr_NormalizeException(&tmp_type, &tmp_value, &tmp_tb); + tstate->exc_type = 0; + tstate->exc_value = 0; + tstate->exc_traceback = 0; + PyException_SetContext(value, tmp_value); + Py_DECREF(tmp_type); + Py_XDECREF(tmp_tb); + } +#endif tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; -- 2.26.2