@@ -68,6 +68,7 @@ typedef enum {
6868 PyObject *prefix##_context0; \
6969 PyObject *prefix##_callbacks; \
7070 PyObject *prefix##_exception; \
71+ PyObject *prefix##_exception_tb; \
7172 PyObject *prefix##_result; \
7273 PyObject *prefix##_source_tb; \
7374 PyObject *prefix##_cancel_msg; \
@@ -492,6 +493,7 @@ future_init(FutureObj *fut, PyObject *loop)
492493 Py_CLEAR (fut -> fut_callbacks );
493494 Py_CLEAR (fut -> fut_result );
494495 Py_CLEAR (fut -> fut_exception );
496+ Py_CLEAR (fut -> fut_exception_tb );
495497 Py_CLEAR (fut -> fut_source_tb );
496498 Py_CLEAR (fut -> fut_cancel_msg );
497499 _PyErr_ClearExcState (& fut -> fut_cancelled_exc_state );
@@ -598,7 +600,9 @@ future_set_exception(FutureObj *fut, PyObject *exc)
598600 }
599601
600602 assert (!fut -> fut_exception );
603+ assert (!fut -> fut_exception_tb );
601604 fut -> fut_exception = exc_val ;
605+ fut -> fut_exception_tb = PyException_GetTraceback (exc_val );
602606 fut -> fut_state = STATE_FINISHED ;
603607
604608 if (future_schedule_callbacks (fut ) == -1 ) {
@@ -646,6 +650,15 @@ future_get_result(FutureObj *fut, PyObject **result)
646650
647651 fut -> fut_log_tb = 0 ;
648652 if (fut -> fut_exception != NULL ) {
653+ if (fut -> fut_exception_tb != NULL ) {
654+ if (PyException_SetTraceback (fut -> fut_exception , fut -> fut_exception_tb ) < 0 )
655+ {
656+ return -1 ;
657+ }
658+ }
659+ else {
660+ PyException_SetTraceback (fut -> fut_exception , Py_None );
661+ }
649662 Py_INCREF (fut -> fut_exception );
650663 * result = fut -> fut_exception ;
651664 return 1 ;
@@ -789,6 +802,7 @@ FutureObj_clear(FutureObj *fut)
789802 Py_CLEAR (fut -> fut_callbacks );
790803 Py_CLEAR (fut -> fut_result );
791804 Py_CLEAR (fut -> fut_exception );
805+ Py_CLEAR (fut -> fut_exception_tb );
792806 Py_CLEAR (fut -> fut_source_tb );
793807 Py_CLEAR (fut -> fut_cancel_msg );
794808 _PyErr_ClearExcState (& fut -> fut_cancelled_exc_state );
@@ -805,6 +819,7 @@ FutureObj_traverse(FutureObj *fut, visitproc visit, void *arg)
805819 Py_VISIT (fut -> fut_callbacks );
806820 Py_VISIT (fut -> fut_result );
807821 Py_VISIT (fut -> fut_exception );
822+ Py_VISIT (fut -> fut_exception_tb );
808823 Py_VISIT (fut -> fut_source_tb );
809824 Py_VISIT (fut -> fut_cancel_msg );
810825 Py_VISIT (fut -> dict );
0 commit comments