diff options
author | Thomas A Caswell <tcaswell@gmail.com> | 2017-10-28 14:10:57 -0400 |
---|---|---|
committer | Stefan Behnel <stefan_ml@behnel.de> | 2017-10-28 22:44:58 +0200 |
commit | 2d3392463b77eb550bd54a69bd28cc161947acb5 (patch) | |
tree | dd32333de2fabe7abd0a8080334c3421e7c3742d | |
parent | ce2e53c93141000455ed89e7659a2eec39296e0b (diff) | |
download | cython-2d3392463b77eb550bd54a69bd28cc161947acb5.tar.gz |
FIX: account for change in how exception information is stored
CPython change how the exception information is stored internally in
3.7a3.
This simply adds fences based on python version around how to access
the objects.
Xref:
https://github.com/python/cpython/commit/ae3087c6382011c47db82fea4d05f8bbf514265d
https://bugs.python.org/issue25612
https://github.com/python/cpython/pull/1773
-rw-r--r-- | Cython/Utility/Exceptions.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/Cython/Utility/Exceptions.c b/Cython/Utility/Exceptions.c index 3228cd238..86f29f684 100644 --- a/Cython/Utility/Exceptions.c +++ b/Cython/Utility/Exceptions.c @@ -359,12 +359,21 @@ static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) *value = local_value; *tb = local_tb; #if CYTHON_FAST_THREAD_STATE + #if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 7 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = local_type; + tstate->exc_state.exc_value = local_value; + tstate->exc_state.exc_traceback = local_tb; + #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = local_type; tstate->exc_value = local_value; tstate->exc_traceback = local_tb; + #endif // Make sure tstate is in a consistent state when we XDECREF // these objects (DECREF may run arbitrary code). Py_XDECREF(tmp_type); @@ -394,9 +403,15 @@ static CYTHON_INLINE void __Pyx_ReraiseException(void) { PyObject *type = NULL, *value = NULL, *tb = NULL; #if CYTHON_FAST_THREAD_STATE PyThreadState *tstate = PyThreadState_GET(); + #if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 7 + type = tstate->exc_state.exc_type; + value = tstate->exc_state.exc_value; + tb = tstate->exc_state.exc_traceback; + #else type = tstate->exc_type; value = tstate->exc_value; tb = tstate->exc_traceback; + #endif #else PyErr_GetExcInfo(&type, &value, &tb); #endif @@ -440,9 +455,15 @@ static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 7 + *type = tstate->exc_state.exc_type; + *value = tstate->exc_state.exc_value; + *tb = tstate->exc_state.exc_traceback; + #else *type = tstate->exc_type; *value = tstate->exc_value; *tb = tstate->exc_traceback; + #endif Py_XINCREF(*type); Py_XINCREF(*value); Py_XINCREF(*tb); @@ -450,12 +471,22 @@ static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject * static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; + + #if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 7 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + tstate->exc_state.exc_type = type; + tstate->exc_state.exc_value = value; + tstate->exc_state.exc_traceback = tb; + #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; tstate->exc_type = type; tstate->exc_value = value; tstate->exc_traceback = tb; + #endif Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); @@ -478,6 +509,16 @@ static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, #if CYTHON_FAST_THREAD_STATE static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; + + #if PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 7 + tmp_type = tstate->exc_state.exc_type; + tmp_value = tstate->exc_state.exc_value; + tmp_tb = tstate->exc_state.exc_traceback; + + tstate->exc_state.exc_type = *type; + tstate->exc_state.exc_value = *value; + tstate->exc_state.exc_traceback = *tb; + #else tmp_type = tstate->exc_type; tmp_value = tstate->exc_value; tmp_tb = tstate->exc_traceback; @@ -486,6 +527,7 @@ static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject * tstate->exc_value = *value; tstate->exc_traceback = *tb; + #endif *type = tmp_type; *value = tmp_value; *tb = tmp_tb; |