mirror of
https://github.com/python/cpython.git
synced 2025-08-04 17:08:35 +00:00
bpo-45924: Fix asyncio incorrect traceback when future's exception is raised multiple times (GH-30274)
This commit is contained in:
parent
f5b76330cf
commit
86c1df1872
4 changed files with 47 additions and 2 deletions
|
@ -70,6 +70,7 @@ typedef enum {
|
|||
PyObject *prefix##_context0; \
|
||||
PyObject *prefix##_callbacks; \
|
||||
PyObject *prefix##_exception; \
|
||||
PyObject *prefix##_exception_tb; \
|
||||
PyObject *prefix##_result; \
|
||||
PyObject *prefix##_source_tb; \
|
||||
PyObject *prefix##_cancel_msg; \
|
||||
|
@ -495,6 +496,7 @@ future_init(FutureObj *fut, PyObject *loop)
|
|||
Py_CLEAR(fut->fut_callbacks);
|
||||
Py_CLEAR(fut->fut_result);
|
||||
Py_CLEAR(fut->fut_exception);
|
||||
Py_CLEAR(fut->fut_exception_tb);
|
||||
Py_CLEAR(fut->fut_source_tb);
|
||||
Py_CLEAR(fut->fut_cancel_msg);
|
||||
Py_CLEAR(fut->fut_cancelled_exc);
|
||||
|
@ -601,7 +603,9 @@ future_set_exception(FutureObj *fut, PyObject *exc)
|
|||
}
|
||||
|
||||
assert(!fut->fut_exception);
|
||||
assert(!fut->fut_exception_tb);
|
||||
fut->fut_exception = exc_val;
|
||||
fut->fut_exception_tb = PyException_GetTraceback(exc_val);
|
||||
fut->fut_state = STATE_FINISHED;
|
||||
|
||||
if (future_schedule_callbacks(fut) == -1) {
|
||||
|
@ -656,8 +660,16 @@ future_get_result(FutureObj *fut, PyObject **result)
|
|||
|
||||
fut->fut_log_tb = 0;
|
||||
if (fut->fut_exception != NULL) {
|
||||
PyObject *tb = fut->fut_exception_tb;
|
||||
if (tb == NULL) {
|
||||
tb = Py_None;
|
||||
}
|
||||
if (PyException_SetTraceback(fut->fut_exception, tb) < 0) {
|
||||
return -1;
|
||||
}
|
||||
Py_INCREF(fut->fut_exception);
|
||||
*result = fut->fut_exception;
|
||||
Py_CLEAR(fut->fut_exception_tb);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
@ -799,6 +811,7 @@ FutureObj_clear(FutureObj *fut)
|
|||
Py_CLEAR(fut->fut_callbacks);
|
||||
Py_CLEAR(fut->fut_result);
|
||||
Py_CLEAR(fut->fut_exception);
|
||||
Py_CLEAR(fut->fut_exception_tb);
|
||||
Py_CLEAR(fut->fut_source_tb);
|
||||
Py_CLEAR(fut->fut_cancel_msg);
|
||||
Py_CLEAR(fut->fut_cancelled_exc);
|
||||
|
@ -815,6 +828,7 @@ FutureObj_traverse(FutureObj *fut, visitproc visit, void *arg)
|
|||
Py_VISIT(fut->fut_callbacks);
|
||||
Py_VISIT(fut->fut_result);
|
||||
Py_VISIT(fut->fut_exception);
|
||||
Py_VISIT(fut->fut_exception_tb);
|
||||
Py_VISIT(fut->fut_source_tb);
|
||||
Py_VISIT(fut->fut_cancel_msg);
|
||||
Py_VISIT(fut->fut_cancelled_exc);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue