@@ -35,35 +35,75 @@ _PyErr_SetRaisedException(PyThreadState *tstate, PyObject *exc)
35
35
Py_XDECREF (old_exc );
36
36
}
37
37
38
+ static PyObject *
39
+ _PyErr_CreateException (PyObject * exception_type , PyObject * value )
40
+ {
41
+ PyObject * exc ;
42
+
43
+ if (value == NULL || value == Py_None ) {
44
+ exc = _PyObject_CallNoArgs (exception_type );
45
+ }
46
+ else if (PyTuple_Check (value )) {
47
+ exc = PyObject_Call (exception_type , value , NULL );
48
+ }
49
+ else {
50
+ exc = PyObject_CallOneArg (exception_type , value );
51
+ }
52
+
53
+ if (exc != NULL && !PyExceptionInstance_Check (exc )) {
54
+ PyErr_Format (PyExc_TypeError ,
55
+ "calling %R should have returned an instance of "
56
+ "BaseException, not %s" ,
57
+ exception_type , Py_TYPE (exc )-> tp_name );
58
+ Py_CLEAR (exc );
59
+ }
60
+
61
+ return exc ;
62
+ }
63
+
38
64
void
39
65
_PyErr_Restore (PyThreadState * tstate , PyObject * type , PyObject * value ,
40
66
PyObject * traceback )
41
67
{
42
- #ifdef Py_DEBUG
43
- /* Check that we are being passed a normalized exception.
44
- *
45
- * Exceptions are normalized if all NULL,
46
- * or if curexc_type = Py_TYPE(curexc_value) and
47
- * curexc_traceback = curexc_value->traceback
48
- * and both type and traceback are valid */
49
- if (value == NULL ) {
50
- assert (type == NULL );
68
+ if (type == NULL ) {
69
+ assert (value == NULL );
51
70
assert (traceback == NULL );
71
+ _PyErr_SetRaisedException (tstate , NULL );
72
+ return ;
52
73
}
53
- else {
54
- assert ( PyExceptionClass_Check ( type ));
55
- assert ( type == ( PyObject * ) Py_TYPE ( value ));
74
+ assert ( PyExceptionClass_Check ( type ));
75
+ if ( value != NULL && type == ( PyObject * ) Py_TYPE ( value )) {
76
+ /* Already normalized */
56
77
assert (((PyBaseExceptionObject * )value )-> traceback != Py_None );
57
- assert (traceback == ((PyBaseExceptionObject * )value )-> traceback ||
58
- (traceback == Py_None &&
59
- ((PyBaseExceptionObject * )value )-> traceback == NULL )
60
- );
61
78
}
62
- #endif
63
-
79
+ else {
80
+ PyObject * exc = _PyErr_CreateException (type , value );
81
+ Py_XDECREF (value );
82
+ if (exc == NULL ) {
83
+ Py_DECREF (type );
84
+ Py_XDECREF (traceback );
85
+ return ;
86
+ }
87
+ value = exc ;
88
+ }
89
+ assert (PyExceptionInstance_Check (value ));
90
+ if (traceback != NULL && !PyTraceBack_Check (traceback )) {
91
+ if (traceback == Py_None ) {
92
+ Py_DECREF (Py_None );
93
+ traceback = NULL ;
94
+ }
95
+ else {
96
+ PyErr_SetString (PyExc_TypeError , "traceback must be a Traceback or None" );
97
+ Py_DECREF (type );
98
+ Py_XDECREF (traceback );
99
+ return ;
100
+ }
101
+ }
102
+ PyObject * old_traceback = ((PyBaseExceptionObject * )value )-> traceback ;
103
+ ((PyBaseExceptionObject * )value )-> traceback = traceback ;
104
+ Py_XDECREF (old_traceback );
64
105
_PyErr_SetRaisedException (tstate , value );
65
- Py_XDECREF (type );
66
- Py_XDECREF (traceback );
106
+ Py_DECREF (type );
67
107
}
68
108
69
109
void
@@ -94,32 +134,6 @@ _PyErr_GetTopmostException(PyThreadState *tstate)
94
134
return exc_info ;
95
135
}
96
136
97
- static PyObject *
98
- _PyErr_CreateException (PyObject * exception_type , PyObject * value )
99
- {
100
- PyObject * exc ;
101
-
102
- if (value == NULL || value == Py_None ) {
103
- exc = _PyObject_CallNoArgs (exception_type );
104
- }
105
- else if (PyTuple_Check (value )) {
106
- exc = PyObject_Call (exception_type , value , NULL );
107
- }
108
- else {
109
- exc = PyObject_CallOneArg (exception_type , value );
110
- }
111
-
112
- if (exc != NULL && !PyExceptionInstance_Check (exc )) {
113
- PyErr_Format (PyExc_TypeError ,
114
- "calling %R should have returned an instance of "
115
- "BaseException, not %s" ,
116
- exception_type , Py_TYPE (exc )-> tp_name );
117
- Py_CLEAR (exc );
118
- }
119
-
120
- return exc ;
121
- }
122
-
123
137
void
124
138
_PyErr_SetObject (PyThreadState * tstate , PyObject * exception , PyObject * value )
125
139
{
0 commit comments