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);

`