8000 Objects/genobject.c · python/cpython@c40fc27 · GitHub
[go: up one dir, main page]

Skip to content

Commit c40fc27

Browse files
committed
Objects/genobject.c
1 parent d5072bd commit c40fc27

File tree

1 file changed

+17
-46
lines changed

1 file changed

+17
-46
lines changed

Objects/genobject.c

Lines changed: 17 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,6 @@ void
6969
_PyGen_Finalize(PyObject *self)
7070
{
7171
PyGenObject *gen = (PyGenObject *)self;
72-
PyObject *res = NULL;
73-
PyObject *error_type, *error_value, *error_traceback;
7472

7573
if (gen->gi_frame_state >= FRAME_COMPLETED) {
7674
/* Generator isn't paused, so no need to close */
@@ -82,23 +80,22 @@ _PyGen_Finalize(PyObject *self)
8280
PyObject *finalizer = agen->ag_origin_or_finalizer;
8381
if (finalizer && !agen->ag_closed) {
8482
/* 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();
8884

85+
PyObject *res = PyObject_CallOneArg(finalizer, self);
8986
if (res == NULL) {
9087
PyErr_WriteUnraisable(self);
9188
} else {
9289
Py_DECREF(res);
9390
}
9491
/* Restore the saved exception. */
95-
PyErr_Restore(error_type, error_value, error_traceback);
92+
PyErr_SetRaisedException(exc);
9693
return;
9794
}
9895
}
9996

10097
/* Save the current exception, if any. */
101-
PyErr_Fetch(&error_type, &error_value, &error_traceback);
98+
PyObject *exc = PyErr_GetRaisedException();
10299

103100
/* If `gen` is a coroutine, and if it was never awaited on,
104101
issue a RuntimeWarning. */
@@ -109,20 +106,19 @@ _PyGen_Finalize(PyObject *self)
109106
_PyErr_WarnUnawaitedCoroutine((PyObject *)gen);
110107
}
111108
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);
118117
}
119-
}
120-
else {
121-
Py_DECREF(res);
122118
}
123119

124120
/* Restore the saved exception. */
125-
PyErr_Restore(error_type, error_value, error_traceback);
121+
PyErr_SetRaisedException(exc);
126122
}
127123

128124
static void
@@ -648,39 +644,14 @@ _PyGen_SetStopIterationValue(PyObject *value)
648644
int
649645
_PyGen_FetchStopIterationValue(PyObject **pvalue)
650646
{
651-
PyObject *et, *ev, *tb;
652647
PyObject *value = NULL;
653-
654648
if (PyErr_ExceptionMatches(PyExc_StopIteration)) {
655-
PyErr_Fetch(&et, &ev, &tb);
656-
if (ev) {
649+
PyObject *exc = PyErr_GetRaisedException();
650+
if (exc) {
657651
/* 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);
681654
}
682-
Py_XDECREF(et);
683-
Py_XDECREF(tb);
684655
} else if (PyErr_Occurred()) {
685656
return -1;
686657
}

0 commit comments

Comments
 (0)
0