-#define CATCH_RETRY_FRAME_ENTRY_TEMPLATE(label,ret) \
- label \
- { \
- W_ r, frame, trec, outer; \
- IF_NOT_REG_R1(W_ rval; rval = Sp(0); Sp_adj(1); ) \
- \
- frame = Sp; \
- trec = StgTSO_trec(CurrentTSO); \
- "ptr" outer = foreign "C" stmGetEnclosingTRec(trec "ptr"); \
- r = foreign "C" stmCommitTransaction(trec "ptr"); \
- if (r) { \
- /* Succeeded (either first branch or second branch) */ \
- StgTSO_trec(CurrentTSO) = outer; \
- Sp = Sp + SIZEOF_StgCatchRetryFrame; \
- IF_NOT_REG_R1(Sp_adj(-1); Sp(0) = rval;) \
- jump ret; \
- } else { \
- /* Did not commit: retry */ \
- W_ new_trec; \
- "ptr" new_trec = foreign "C" stmStartTransaction(outer "ptr"); \
- StgTSO_trec(CurrentTSO) = new_trec; \
- if (StgCatchRetryFrame_running_alt_code(frame)) { \
- R1 = StgCatchRetryFrame_alt_code(frame); \
- } else { \
- R1 = StgCatchRetryFrame_first_code(frame); \
- StgCatchRetryFrame_first_code_trec(frame) = new_trec; \
- } \
- Sp_adj(-1); \
- jump RET_LBL(stg_ap_v); \
- } \
- }
-
-CATCH_RETRY_FRAME_ENTRY_TEMPLATE(stg_catch_retry_frame_0_ret,%RET_VEC(Sp(SP_OFF),0))
-CATCH_RETRY_FRAME_ENTRY_TEMPLATE(stg_catch_retry_frame_1_ret,%RET_VEC(Sp(SP_OFF),1))
-CATCH_RETRY_FRAME_ENTRY_TEMPLATE(stg_catch_retry_frame_2_ret,%RET_VEC(Sp(SP_OFF),2))
-CATCH_RETRY_FRAME_ENTRY_TEMPLATE(stg_catch_retry_frame_3_ret,%RET_VEC(Sp(SP_OFF),3))
-CATCH_RETRY_FRAME_ENTRY_TEMPLATE(stg_catch_retry_frame_4_ret,%RET_VEC(Sp(SP_OFF),4))
-CATCH_RETRY_FRAME_ENTRY_TEMPLATE(stg_catch_retry_frame_5_ret,%RET_VEC(Sp(SP_OFF),5))
-CATCH_RETRY_FRAME_ENTRY_TEMPLATE(stg_catch_retry_frame_6_ret,%RET_VEC(Sp(SP_OFF),6))
-CATCH_RETRY_FRAME_ENTRY_TEMPLATE(stg_catch_retry_frame_7_ret,%RET_VEC(Sp(SP_OFF),7))
+CATCH_RETRY_FRAME_ERROR(stg_catch_retry_frame_0_ret)
+CATCH_RETRY_FRAME_ERROR(stg_catch_retry_frame_1_ret)
+CATCH_RETRY_FRAME_ERROR(stg_catch_retry_frame_2_ret)
+CATCH_RETRY_FRAME_ERROR(stg_catch_retry_frame_3_ret)
+CATCH_RETRY_FRAME_ERROR(stg_catch_retry_frame_4_ret)
+CATCH_RETRY_FRAME_ERROR(stg_catch_retry_frame_5_ret)
+CATCH_RETRY_FRAME_ERROR(stg_catch_retry_frame_6_ret)
+CATCH_RETRY_FRAME_ERROR(stg_catch_retry_frame_7_ret)