Exceptions.c revision 5f1c94371a64b3196d4be9466099bb892df9b88e
15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Exception raising code
25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//
35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// Exceptions are raised by __Pyx_Raise() and stored as plain
45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// type/value/tb in PyThreadState->curexc_*.  When being caught by an
55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 'except' statement, curexc_* is moved over to exc_* by
65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// __Pyx_GetException()
75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// PyErrFetchRestore.proto ///////////////
95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// PyErrFetchRestore ///////////////
145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *tmp_type, *tmp_value, *tmp_tb;
185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyThreadState *tstate = PyThreadState_GET();
195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_type = tstate->curexc_type;
215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_value = tstate->curexc_value;
225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_tb = tstate->curexc_traceback;
235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->curexc_type = type;
245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->curexc_value = value;
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->curexc_traceback = tb;
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(tmp_type);
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(tmp_value);
285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(tmp_tb);
295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_Restore(type, value, tb);
315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyThreadState *tstate = PyThreadState_GET();
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *type = tstate->curexc_type;
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *value = tstate->curexc_value;
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *tb = tstate->curexc_traceback;
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->curexc_type = 0;
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->curexc_value = 0;
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->curexc_traceback = 0;
445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_Fetch(type, value, tb);
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// RaiseException.proto ///////////////
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/
525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// RaiseException ///////////////
545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: PyErrFetchRestore
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The following function is based on do_raise() from ceval.c. There
575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// are separate versions for Python2 and Python3 as exception handling
585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// has changed quite a lot between the two versions.
595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if PY_MAJOR_VERSION < 3
615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                        CYTHON_UNUSED PyObject *cause) {
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    /* 'cause' is only used in Py3 */
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XINCREF(type);
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!value || value == Py_None)
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = NULL;
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    else
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(value);
695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!tb || tb == Py_None)
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        tb = NULL;
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    else {
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(tb);
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!PyTraceBack_Check(tb)) {
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyErr_SetString(PyExc_TypeError,
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "raise: arg 3 must be a traceback or None");
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto raise_error;
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #if PY_VERSION_HEX < 0x02050000
825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (PyClass_Check(type)) {
835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #else
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (PyType_Check(type)) {
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #endif
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        /* instantiate the type now (we don't know when and how it will be caught) */
875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_PYPY
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        /* PyPy can't handle value == NULL */
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!value) {
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            Py_INCREF(Py_None);
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            value = Py_None;
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyErr_NormalizeException(&type, &value, &tb);
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        /* Raising an instance.  The value should be a dummy. */
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (value) {
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyErr_SetString(PyExc_TypeError,
1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "instance exception may not have a separate value");
1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto raise_error;
1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        /* Normalize to raise <class>, <instance> */
1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = type;
1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        #if PY_VERSION_HEX < 0x02050000
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (PyInstance_Check(type)) {
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            type = (PyObject*) ((PyInstanceObject*)type)->in_class;
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            Py_INCREF(type);
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        } else {
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            type = 0;
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyErr_SetString(PyExc_TypeError,
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "raise: exception must be an old-style class or instance");
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto raise_error;
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        #else
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        type = (PyObject*) Py_TYPE(type);
1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(type);
1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyErr_SetString(PyExc_TypeError,
1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "raise: exception class must be a subclass of BaseException");
1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto raise_error;
1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        #endif
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    __Pyx_ErrRestore(type, value, tb);
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)raise_error:
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(value);
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(type);
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(tb);
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else /* Python 3+ */
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject* owned_instance = NULL;
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (tb == Py_None) {
1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        tb = 0;
1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else if (tb && !PyTraceBack_Check(tb)) {
1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyErr_SetString(PyExc_TypeError,
1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            "raise: arg 3 must be a traceback or None");
1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        goto bad;
1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (value == Py_None)
1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = 0;
1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (PyExceptionInstance_Check(type)) {
1505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (value) {
1515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyErr_SetString(PyExc_TypeError,
1525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "instance exception may not have a separate value");
1535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto bad;
1545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        value = type;
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        type = (PyObject*) Py_TYPE(value);
1575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else if (PyExceptionClass_Check(type)) {
1585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // make sure value is an exception instance of type
1595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyObject *instance_class = NULL;
1605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (value && PyExceptionInstance_Check(value)) {
1615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            instance_class = (PyObject*) Py_TYPE(value);
1625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (instance_class != type) {
1635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                if (PyObject_IsSubclass(instance_class, type)) {
1645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    // believe the instance
1655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    type = instance_class;
1665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                } else {
1675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                    instance_class = NULL;
1685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                }
1695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            }
1705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!instance_class) {
1725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            // instantiate the type now (we don't know when and how it will be caught)
1735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            // assuming that 'value' is an argument to the type's constructor
1745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            // not using PyErr_NormalizeException() to avoid ref-counting problems
1755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyObject *args;
1765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (!value)
1775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                args = PyTuple_New(0);
1785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            else if (PyTuple_Check(value)) {
1795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                Py_INCREF(value);
1805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                args = value;
1815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            } else
1825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                args = PyTuple_Pack(1, value);
1835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (!args)
1845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                goto bad;
1855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            owned_instance = PyObject_Call(type, args, NULL);
1865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            Py_DECREF(args);
1875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (!owned_instance)
1885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                goto bad;
1895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            value = owned_instance;
1905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (!PyExceptionInstance_Check(value)) {
1915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                PyErr_Format(PyExc_TypeError,
1925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             "calling %R should have returned an instance of "
1935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             "BaseException, not %R",
1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                             type, Py_TYPE(value));
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                goto bad;
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            }
1975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
1985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
1995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyErr_SetString(PyExc_TypeError,
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            "raise: exception class must be a subclass of BaseException");
2015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        goto bad;
2025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if PY_VERSION_HEX >= 0x03030000
2055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (cause) {
2065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (cause && cause != Py_None) {
2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyObject *fixed_cause;
2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (cause == Py_None) {
2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            // raise ... from None
2125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            fixed_cause = NULL;
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        } else if (PyExceptionClass_Check(cause)) {
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            fixed_cause = PyObject_CallObject(cause, NULL);
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            if (fixed_cause == NULL)
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                goto bad;
2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        } else if (PyExceptionInstance_Check(cause)) {
2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            fixed_cause = cause;
2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            Py_INCREF(fixed_cause);
2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        } else {
2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            PyErr_SetString(PyExc_TypeError,
2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            "exception causes must derive from "
2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                            "BaseException");
2245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto bad;
2255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
2265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyException_SetCause(value, fixed_cause);
2275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_SetObject(type, value);
2305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (tb) {
2325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyThreadState *tstate = PyThreadState_GET();
2335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyObject* tmp_tb = tstate->curexc_traceback;
2345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (tb != tmp_tb) {
2355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            Py_INCREF(tb);
2365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            tstate->curexc_traceback = tb;
2375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            Py_XDECREF(tmp_tb);
2385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        }
2395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bad:
2425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(owned_instance);
2435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return;
2445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
2455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
2465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// GetException.proto ///////////////
2485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
2505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// GetException ///////////////
2525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
2535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) {
2545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *local_type, *local_value, *local_tb;
2555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
2565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *tmp_type, *tmp_value, *tmp_tb;
2575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyThreadState *tstate = PyThreadState_GET();
2585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_type = tstate->curexc_type;
2595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_value = tstate->curexc_value;
2605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    local_tb = tstate->curexc_traceback;
2615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->curexc_type = 0;
2625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->curexc_value = 0;
2635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->curexc_traceback = 0;
2645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
2655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_Fetch(&local_type, &local_value, &local_tb);
2665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
2675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_NormalizeException(&local_type, &local_value, &local_tb);
2685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (unlikely(tstate->curexc_type))
2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (unlikely(PyErr_Occurred()))
2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        goto bad;
2745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #if PY_MAJOR_VERSION >= 3
2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (local_tb) {
2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            goto bad;
2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #endif
2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // traceback may be NULL for freshly raised exceptions
2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XINCREF(local_tb);
2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // exception state may be temporarily empty in parallel loops (race condition)
2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XINCREF(local_type);
2845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XINCREF(local_value);
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *type = local_type;
2865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *value = local_value;
2875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *tb = local_tb;
2885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
2895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_type = tstate->exc_type;
2905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_value = tstate->exc_value;
2915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_tb = tstate->exc_traceback;
2925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->exc_type = local_type;
2935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->exc_value = local_value;
2945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->exc_traceback = local_tb;
2955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // Make sure tstate is in a consistent state when we XDECREF
2965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    // these objects (DECREF may run arbitrary code).
2975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(tmp_type);
2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(tmp_value);
2995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(tmp_tb);
3005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
3015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_SetExcInfo(local_type, local_value, local_tb);
3025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return 0;
3045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bad:
3055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *type = 0;
3065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *value = 0;
3075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *tb = 0;
3085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(local_type);
3095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(local_value);
3105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(local_tb);
3115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return -1;
3125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// ReRaiseException.proto ///////////////
3155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE void __Pyx_ReraiseException(void); /*proto*/
3175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// ReRaiseException.proto ///////////////
3195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE void __Pyx_ReraiseException(void) {
3215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *type = NULL, *value = NULL, *tb = NULL;
3225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
3235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyThreadState *tstate = PyThreadState_GET();
3245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    type = tstate->exc_type;
3255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    value = tstate->exc_value;
3265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tb = tstate->exc_traceback;
3275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
3285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_GetExcInfo(&type, &value, &tb);
3295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!type || type == Py_None) {
3315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if !CYTHON_COMPILING_IN_CPYTHON
3325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_XDECREF(type);
3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_XDECREF(value);
3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_XDECREF(tb);
3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        // message copied from Py3
3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyErr_SetString(PyExc_RuntimeError,
3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            "No active exception to reraise");
3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_INCREF(type);
3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_XINCREF(value);
3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_XINCREF(tb);
3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyErr_Restore(type, value, tb);
3475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// SaveResetException.proto ///////////////
3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb); /*proto*/
3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// SaveResetException ///////////////
3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyThreadState *tstate = PyThreadState_GET();
3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *type = tstate->exc_type;
3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *value = tstate->exc_value;
3625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *tb = tstate->exc_traceback;
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XINCREF(*type);
3645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XINCREF(*value);
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XINCREF(*tb);
3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_GetExcInfo(type, value, tb);
3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) {
3725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
3735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *tmp_type, *tmp_value, *tmp_tb;
3745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyThreadState *tstate = PyThreadState_GET();
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_type = tstate->exc_type;
3765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_value = tstate->exc_value;
3775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_tb = tstate->exc_traceback;
3785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->exc_type = type;
3795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->exc_value = value;
3805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->exc_traceback = tb;
3815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(tmp_type);
3825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(tmp_value);
3835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(tmp_tb);
3845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
3855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_SetExcInfo(type, value, tb);
3865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
3875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
3885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// SwapException.proto ///////////////
3905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); /*proto*/
3925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// SwapException ///////////////
3945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
3955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
3965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *tmp_type, *tmp_value, *tmp_tb;
3975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#if CYTHON_COMPILING_IN_CPYTHON
3985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyThreadState *tstate = PyThreadState_GET();
3995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_type = tstate->exc_type;
4015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_value = tstate->exc_value;
4025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tmp_tb = tstate->exc_traceback;
4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->exc_type = *type;
4055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->exc_value = *value;
4065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    tstate->exc_traceback = *tb;
4075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#else
4085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
4095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyErr_SetExcInfo(*type, *value, *tb);
4105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#endif
4115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *type = tmp_type;
4135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *value = tmp_value;
4145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    *tb = tmp_tb;
4155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// WriteUnraisableException.proto ///////////////
4185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void __Pyx_WriteUnraisable(const char *name, int clineno,
4205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  int lineno, const char *filename,
4215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  int full_traceback); /*proto*/
4225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// WriteUnraisableException ///////////////
4245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: PyErrFetchRestore
4255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
4275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
4285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                  int full_traceback) {
4295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *old_exc, *old_val, *old_tb;
4305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *ctx;
4315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
4325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (full_traceback) {
4335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_XINCREF(old_exc);
4345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_XINCREF(old_val);
4355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_XINCREF(old_tb);
4365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        __Pyx_ErrRestore(old_exc, old_val, old_tb);
4375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyErr_PrintEx(1);
4385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
4395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #if PY_MAJOR_VERSION < 3
4405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ctx = PyString_FromString(name);
4415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #else
4425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    ctx = PyUnicode_FromString(name);
4435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #endif
4445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    __Pyx_ErrRestore(old_exc, old_val, old_tb);
4455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!ctx) {
4465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyErr_WriteUnraisable(Py_None);
4475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    } else {
4485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyErr_WriteUnraisable(ctx);
4495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        Py_DECREF(ctx);
4505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
4515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
4525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// AddTraceback.proto ///////////////
4545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void __Pyx_AddTraceback(const char *funcname, int c_line,
4565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               int py_line, const char *filename); /*proto*/
4575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)/////////////// AddTraceback ///////////////
4595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@requires: ModuleSetupCode.c::CodeObjectCache
4605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//@substitute: naming
4615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "compile.h"
4635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "frameobject.h"
4645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "traceback.h"
4655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
4675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            const char *funcname, int c_line,
4685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            int py_line, const char *filename) {
4695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyCodeObject *py_code = 0;
4705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *py_srcfile = 0;
4715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *py_funcname = 0;
4725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
4735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #if PY_MAJOR_VERSION < 3
4745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    py_srcfile = PyString_FromString(filename);
4755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #else
4765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    py_srcfile = PyUnicode_FromString(filename);
4775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    #endif
4785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!py_srcfile) goto bad;
4795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (c_line) {
4805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        #if PY_MAJOR_VERSION < 3
4815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, $cfilenm_cname, c_line);
4825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        #else
4835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, $cfilenm_cname, c_line);
4845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        #endif
4855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
4865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    else {
4875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        #if PY_MAJOR_VERSION < 3
4885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        py_funcname = PyString_FromString(funcname);
4895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        #else
4905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        py_funcname = PyUnicode_FromString(funcname);
4915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        #endif
4925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
4935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!py_funcname) goto bad;
4945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    py_code = __Pyx_PyCode_New(
4955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        0,            /*int argcount,*/
4965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        0,            /*int kwonlyargcount,*/
4975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        0,            /*int nlocals,*/
4985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        0,            /*int stacksize,*/
4995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        0,            /*int flags,*/
5005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $empty_bytes, /*PyObject *code,*/
5015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $empty_tuple, /*PyObject *consts,*/
5025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $empty_tuple, /*PyObject *names,*/
5035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $empty_tuple, /*PyObject *varnames,*/
5045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $empty_tuple, /*PyObject *freevars,*/
5055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $empty_tuple, /*PyObject *cellvars,*/
5065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        py_srcfile,   /*PyObject *filename,*/
5075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        py_funcname,  /*PyObject *name,*/
5085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        py_line,      /*int firstlineno,*/
5095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $empty_bytes  /*PyObject *lnotab*/
5105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    );
5115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_DECREF(py_srcfile);
5125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_DECREF(py_funcname);
5135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return py_code;
5145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bad:
5155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(py_srcfile);
5165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(py_funcname);
5175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return NULL;
5185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
5195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)static void __Pyx_AddTraceback(const char *funcname, int c_line,
5215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                               int py_line, const char *filename) {
5225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyCodeObject *py_code = 0;
5235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyObject *py_globals = 0;
5245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyFrameObject *py_frame = 0;
5255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
5265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    py_code = $global_code_object_cache_find(c_line ? c_line : py_line);
5275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!py_code) {
5285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        py_code = __Pyx_CreateCodeObjectForTraceback(
5295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)            funcname, c_line, py_line, filename);
5305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        if (!py_code) goto bad;
5315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        $global_code_object_cache_insert(c_line ? c_line : py_line, py_code);
5325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    }
5335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    py_globals = PyModule_GetDict($module_cname);
5345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!py_globals) goto bad;
5355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    py_frame = PyFrame_New(
5365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        PyThreadState_GET(), /*PyThreadState *tstate,*/
5375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        py_code,             /*PyCodeObject *code,*/
5385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        py_globals,          /*PyObject *globals,*/
5395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)        0                    /*PyObject *locals*/
5405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    );
5415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    if (!py_frame) goto bad;
5425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    py_frame->f_lineno = py_line;
5435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    PyTraceBack_Here(py_frame);
5445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)bad:
5455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(py_code);
5465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    Py_XDECREF(py_frame);
5475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
548