69
69
_PyGen_Finalize (PyObject * self )
70
70
{
71
71
PyGenObject * gen = (PyGenObject * )self ;
72
- PyObject * res = NULL ;
73
- PyObject * error_type , * error_value , * error_traceback ;
74
72
75
73
if (gen -> gi_frame_state >= FRAME_COMPLETED ) {
76
74
/* Generator isn't paused, so no need to close */
@@ -82,23 +80,22 @@ _PyGen_Finalize(PyObject *self)
82
80
PyObject * finalizer = agen -> ag_origin_or_finalizer ;
83
81
if (finalizer && !agen -> ag_closed ) {
84
82
/* Save the current exception, if any. */
85
- PyErr_Fetch (& error_type , & error_value , & error_traceback );
86
-
87
- res = PyObject_CallOneArg (finalizer , self );
83
+ PyObject * exc = PyErr_GetRaisedException ();
88
84
85
+ PyObject * res = PyObject_CallOneArg (finalizer , self );
89
86
if (res == NULL ) {
90
87
PyErr_WriteUnraisable (self );
91
88
} else {
92
89
Py_DECREF (res );
93
90
}
94
91
/* Restore the saved exception. */
95
- PyErr_Restore ( error_type , error_value , error_traceback );
92
+ PyErr_SetRaisedException ( exc );
96
93
return ;
97
94
}
98
95
}
99
96
100
97
/* Save the current exception, if any. */
101
- PyErr_Fetch ( & error_type , & error_value , & error_traceback );
98
+ PyObject * exc = PyErr_GetRaisedException ( );
102
99
103
100
/* If `gen` is a coroutine, and if it was never awaited on,
104
101
issue a RuntimeWarning. */
@@ -109,20 +106,19 @@ _PyGen_Finalize(PyObject *self)
109
106
_PyErr_WarnUnawaitedCoroutine ((PyObject * )gen );
110
107
}
111
108
else {
112
- res = gen_close (gen , NULL );
113
- }
114
-
115
- if (res == NULL ) {
116
- if (PyErr_Occurred ()) {
117
- PyErr_WriteUnraisable (self );
109
+ PyObject * res = gen_close (gen , NULL );
110
+ if (res == NULL ) {
111
+ if (PyErr_Occurred ()) {
112
+ PyErr_WriteUnraisable (self );
113
+ }
114
+ }
115
+ else {
116
+ Py_DECREF (res );
118
117
}
119
- }
120
- else {
121
- Py_DECREF (res );
122
118
}
123
119
124
120
/* Restore the saved exception. */
125
- PyErr_Restore ( error_type , error_value , error_traceback );
121
+ PyErr_SetRaisedException ( exc );
126
122
}
127
123
128
124
static void
@@ -648,39 +644,14 @@ _PyGen_SetStopIterationValue(PyObject *value)
648
644
int
649
645
_PyGen_FetchStopIterationValue (PyObject * * pvalue )
650
646
{
651
- PyObject * et , * ev , * tb ;
652
647
PyObject * value = NULL ;
653
-
654
648
if (PyErr_ExceptionMatches (PyExc_StopIteration )) {
655
- PyErr_Fetch ( & et , & ev , & tb );
656
- if (ev ) {
649
+ PyObject * exc = PyErr_GetRaisedException ( );
650
+ if (exc ) {
657
651
/* exception will usually be normalised already */
658
- if (PyObject_TypeCheck (ev , (PyTypeObject * ) et )) {
659
- value = Py_NewRef (((PyStopIterationObject * )ev )-> value );
660
- Py_DECREF (ev );
661
- } else if (et == PyExc_StopIteration && !PyTuple_Check (ev )) {
662
- /* Avoid normalisation and take ev as value.
663
- *
664
- * Normalization is required if the value is a tuple, in
665
- * that case the value of StopIteration would be set to
666
- * the first element of the tuple.
667
- *
668
- * (See _PyErr_CreateException code for details.)
669
- */
670
- value = ev ;
671
- } else {
672
- /* normalisation required */
673
- PyErr_NormalizeException (& et , & ev , & tb );
674
- if (!PyObject_TypeCheck (ev , (PyTypeObject * )PyExc_StopIteration )) {
675
- PyErr_Restore (et , ev , tb );
676
- return -1 ;
677
- }
678
- value = Py_NewRef (((PyStopIterationObject * )ev )-> value );
679
- Py_DECREF (ev );
680
- }
652
+ value = Py_NewRef (((PyStopIterationObject * )exc )-> value );
653
+ Py_DECREF (exc );
681
654
}
682
- Py_XDECREF (et );
683
- Py_XDECREF (tb );
684
655
} else if (PyErr_Occurred ()) {
685
656
return -1 ;
686
657
}
0 commit comments