#else /* Python 3+ */
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
- PyObject *owned_type = NULL, *owned_value = NULL, *owned_tb = NULL;
+ PyObject* owned_instance = NULL;
if (tb == Py_None) {
tb = 0;
} else if (tb && !PyTraceBack_Check(tb)) {
"raise: arg 3 must be a traceback or None");
goto bad;
}
+ if (value == Py_None)
+ value = 0;
if (PyExceptionInstance_Check(type)) {
- if (value && value != Py_None) {
+ if (value) {
PyErr_SetString(PyExc_TypeError,
"instance exception may not have a separate value");
goto bad;
type = (PyObject*) Py_TYPE(value);
} else if (PyExceptionClass_Check(type)) {
// instantiate the type now (we don't know when and how it will be caught)
- PyErr_NormalizeException(&type, &value, &owned_tb);
- if (!tb && owned_tb)
- tb = owned_tb;
- owned_type = type;
- owned_value = value;
+ PyObject *args;
+ if (!value)
+ args = PyTuple_New(0);
+ else if (PyTuple_Check(value)) {
+ Py_INCREF(value);
+ args = value;
+ } else
+ args = PyTuple_Pack(1, value);
+ if (!args)
+ goto bad;
+ owned_instance = PyEval_CallObject(type, args);
+ Py_DECREF(args);
+ if (!owned_instance)
+ goto bad;
+ value = owned_instance;
if (!PyExceptionInstance_Check(value)) {
PyErr_Format(PyExc_TypeError,
"calling %R should have returned an instance of "
}
bad:
- Py_XDECREF(owned_type);
- Py_XDECREF(owned_value);
- Py_XDECREF(owned_tb);
-
+ Py_XDECREF(owned_instance);
return;
}
#endif