@@ -63,6 +63,7 @@ typedef enum {
6363 PyObject *prefix##_context0; \
6464 PyObject *prefix##_callbacks; \
6565 PyObject *prefix##_exception; \
66+ PyObject *prefix##_exception_tb; \
6667 PyObject *prefix##_result; \
6768 PyObject *prefix##_source_tb; \
6869 PyObject *prefix##_cancel_msg; \
@@ -487,6 +488,7 @@ future_init(FutureObj *fut, PyObject *loop)
487488 Py_CLEAR (fut -> fut_callbacks );
488489 Py_CLEAR (fut -> fut_result );
489490 Py_CLEAR (fut -> fut_exception );
491+ Py_CLEAR (fut -> fut_exception_tb );
490492 Py_CLEAR (fut -> fut_source_tb );
491493 Py_CLEAR (fut -> fut_cancel_msg );
492494 _PyErr_ClearExcState (& fut -> fut_cancelled_exc_state );
@@ -593,7 +595,9 @@ future_set_exception(FutureObj *fut, PyObject *exc)
593595 }
594596
595597 assert (!fut -> fut_exception );
598+ assert (!fut -> fut_exception_tb );
596599 fut -> fut_exception = exc_val ;
600+ fut -> fut_exception_tb = PyException_GetTraceback (exc_val );
597601 fut -> fut_state = STATE_FINISHED ;
598602
599603 if (future_schedule_callbacks (fut ) == -1 ) {
@@ -641,8 +645,16 @@ future_get_result(FutureObj *fut, PyObject **result)
641645
642646 fut -> fut_log_tb = 0 ;
643647 if (fut -> fut_exception != NULL ) {
648+ PyObject * tb = fut -> fut_exception_tb ;
649+ if (tb == NULL ) {
650+ tb = Py_None ;
651+ }
652+ if (PyException_SetTraceback (fut -> fut_exception , tb ) < 0 ) {
653+ return -1 ;
654+ }
644655 Py_INCREF (fut -> fut_exception );
645656 * result = fut -> fut_exception ;
657+ Py_CLEAR (fut -> fut_exception_tb );
646658 return 1 ;
647659 }
648660
@@ -784,6 +796,7 @@ FutureObj_clear(FutureObj *fut)
784796 Py_CLEAR (fut -> fut_callbacks );
785797 Py_CLEAR (fut -> fut_result );
786798 Py_CLEAR (fut -> fut_exception );
799+ Py_CLEAR (fut -> fut_exception_tb );
787800 Py_CLEAR (fut -> fut_source_tb );
788801 Py_CLEAR (fut -> fut_cancel_msg );
789802 _PyErr_ClearExcState (& fut -> fut_cancelled_exc_state );
@@ -800,6 +813,7 @@ FutureObj_traverse(FutureObj *fut, visitproc visit, void *arg)
800813 Py_VISIT (fut -> fut_callbacks );
801814 Py_VISIT (fut -> fut_result );
802815 Py_VISIT (fut -> fut_exception );
816+ Py_VISIT (fut -> fut_exception_tb );
803817 Py_VISIT (fut -> fut_source_tb );
804818 Py_VISIT (fut -> fut_cancel_msg );
805819 Py_VISIT (fut -> dict );
0 commit comments