RaiseException */
| 19620 | |
| 19621 | /* RaiseException */ |
| 19622 | static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { |
| 19623 | PyObject* owned_instance = NULL; |
| 19624 | if (tb == Py_None) { |
| 19625 | tb = 0; |
| 19626 | } else if (tb && !PyTraceBack_Check(tb)) { |
| 19627 | PyErr_SetString(PyExc_TypeError, |
| 19628 | "raise: arg 3 must be a traceback or None"); |
| 19629 | goto bad; |
| 19630 | } |
| 19631 | if (value == Py_None) |
| 19632 | value = 0; |
| 19633 | if (PyExceptionInstance_Check(type)) { |
| 19634 | if (value) { |
| 19635 | PyErr_SetString(PyExc_TypeError, |
| 19636 | "instance exception may not have a separate value"); |
| 19637 | goto bad; |
| 19638 | } |
| 19639 | value = type; |
| 19640 | type = (PyObject*) Py_TYPE(value); |
| 19641 | } else if (PyExceptionClass_Check(type)) { |
| 19642 | PyObject *instance_class = NULL; |
| 19643 | if (value && PyExceptionInstance_Check(value)) { |
| 19644 | instance_class = (PyObject*) Py_TYPE(value); |
| 19645 | if (instance_class != type) { |
| 19646 | int is_subclass = PyObject_IsSubclass(instance_class, type); |
| 19647 | if (!is_subclass) { |
| 19648 | instance_class = NULL; |
| 19649 | } else if (unlikely(is_subclass == -1)) { |
| 19650 | goto bad; |
| 19651 | } else { |
| 19652 | type = instance_class; |
| 19653 | } |
| 19654 | } |
| 19655 | } |
| 19656 | if (!instance_class) { |
| 19657 | PyObject *args; |
| 19658 | if (!value) |
| 19659 | args = PyTuple_New(0); |
| 19660 | else if (PyTuple_Check(value)) { |
| 19661 | Py_INCREF(value); |
| 19662 | args = value; |
| 19663 | } else |
| 19664 | args = PyTuple_Pack(1, value); |
| 19665 | if (!args) |
| 19666 | goto bad; |
| 19667 | owned_instance = PyObject_Call(type, args, NULL); |
| 19668 | Py_DECREF(args); |
| 19669 | if (!owned_instance) |
| 19670 | goto bad; |
| 19671 | value = owned_instance; |
| 19672 | if (!PyExceptionInstance_Check(value)) { |
| 19673 | PyErr_Format(PyExc_TypeError, |
| 19674 | "calling %R should have returned an instance of " |
| 19675 | "BaseException, not %R", |
| 19676 | type, Py_TYPE(value)); |
| 19677 | goto bad; |
| 19678 | } |
| 19679 | } |
no outgoing calls
no test coverage detected