back out the last two exception raising changes
authorStefan Behnel <stefan_ml@behnel.de>
Sat, 23 Nov 2013 10:30:19 +0000 (11:30 +0100)
committerStefan Behnel <stefan_ml@behnel.de>
Sat, 23 Nov 2013 10:30:19 +0000 (11:30 +0100)
Cython/Utility/Exceptions.c

index 3e36a3b..3c3b642 100644 (file)
@@ -135,7 +135,7 @@ raise_error:
 #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)) {
@@ -143,9 +143,11 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
             "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;
@@ -154,11 +156,21 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
         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 "
@@ -210,10 +222,7 @@ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject
     }
 
 bad:
-    Py_XDECREF(owned_type);
-    Py_XDECREF(owned_value);
-    Py_XDECREF(owned_tb);
-
+    Py_XDECREF(owned_instance);
     return;
 }
 #endif