bpo-45711: [asyncio] Normalize exceptions immediately after Fetch, be… · python/cpython@2ff758b (original) (raw)
`@@ -2702,6 +2702,11 @@ task_step_impl(TaskObj *task, PyObject *exc)
`
2702
2702
`if (PyErr_ExceptionMatches(asyncio_CancelledError)) {
`
2703
2703
`/* CancelledError */
`
2704
2704
`PyErr_Fetch(&et, &ev, &tb);
`
``
2705
`+
assert(et);
`
``
2706
`+
PyErr_NormalizeException(&et, &ev, &tb);
`
``
2707
`+
if (tb != NULL) {
`
``
2708
`+
PyException_SetTraceback(ev, tb);
`
``
2709
`+
}
`
2705
2710
``
2706
2711
`FutureObj fut = (FutureObj)task;
`
2707
2712
`_PyErr_StackItem *exc_state = &fut->fut_cancelled_exc_state;
`
`@@ -2714,14 +2719,12 @@ task_step_impl(TaskObj *task, PyObject *exc)
`
2714
2719
``
2715
2720
`/* Some other exception; pop it and call Task.set_exception() */
`
2716
2721
`PyErr_Fetch(&et, &ev, &tb);
`
2717
``
-
2718
2722
`assert(et);
`
2719
``
`-
if (!ev || !PyObject_TypeCheck(ev, (PyTypeObject *) et)) {
`
2720
``
`-
PyErr_NormalizeException(&et, &ev, &tb);
`
2721
``
`-
}
`
``
2723
`+
PyErr_NormalizeException(&et, &ev, &tb);
`
2722
2724
`if (tb != NULL) {
`
2723
2725
`PyException_SetTraceback(ev, tb);
`
2724
2726
` }
`
``
2727
+
2725
2728
`o = future_set_exception((FutureObj*)task, ev);
`
2726
2729
`if (!o) {
`
2727
2730
`/* An exception in Task.set_exception() */
`
`@@ -2965,7 +2968,7 @@ task_step(TaskObj *task, PyObject *exc)
`
2965
2968
`PyObject *et, *ev, *tb;
`
2966
2969
`PyErr_Fetch(&et, &ev, &tb);
`
2967
2970
`leave_task(task->task_loop, (PyObject*)task);
`
2968
``
`-
_PyErr_ChainExceptions(et, ev, tb);
`
``
2971
`+
_PyErr_ChainExceptions(et, ev, tb); /* Normalizes (et, ev, tb) */
`
2969
2972
`return NULL;
`
2970
2973
` }
`
2971
2974
`else {
`
`@@ -3014,8 +3017,10 @@ task_wakeup(TaskObj *task, PyObject *o)
`
3014
3017
` }
`
3015
3018
``
3016
3019
`PyErr_Fetch(&et, &ev, &tb);
`
3017
``
`-
if (!ev || !PyObject_TypeCheck(ev, (PyTypeObject *) et)) {
`
3018
``
`-
PyErr_NormalizeException(&et, &ev, &tb);
`
``
3020
`+
assert(et);
`
``
3021
`+
PyErr_NormalizeException(&et, &ev, &tb);
`
``
3022
`+
if (tb != NULL) {
`
``
3023
`+
PyException_SetTraceback(ev, tb);
`
3019
3024
` }
`
3020
3025
``
3021
3026
`result = task_step(task, ev);
`