X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FException.cmm;h=cba5d48d7236fdef7a1b7def101ffdab429860bb;hb=4cc1ed3b25dd2c565341665b3b4175dfdbc4328f;hp=e6c0c0ff353a219585367e71d8d6dc86469b0336;hpb=4d93c987a690eda8fbd9d2e4c7b103005dd8836a;p=ghc-hetmet.git diff --git a/rts/Exception.cmm b/rts/Exception.cmm index e6c0c0f..cba5d48 100644 --- a/rts/Exception.cmm +++ b/rts/Exception.cmm @@ -13,9 +13,7 @@ #include "Cmm.h" #include "RaiseAsync.h" -#ifdef __PIC__ -import base_GHCziBase_True_closure; -#endif +import ghczmprim_GHCziBool_True_closure; /* ----------------------------------------------------------------------------- Exception Primitives @@ -75,6 +73,14 @@ INFO_TABLE_RET( stg_unblockAsyncExceptionszh_ret, RET_SMALL ) */ Sp_adj(1); #endif + STK_CHK_GEN( WDS(2), R1_PTR, stg_unblockAsyncExceptionszh_ret_info); + Sp_adj(-2); + Sp(1) = R1; +#ifdef REG_R1 + Sp(0) = stg_gc_unpt_r1_info; +#else + Sp(0) = stg_ut_1_0_unreg_info; +#endif SAVE_THREAD_STATE(); (r) = foreign "C" maybePerformBlockedException (MyCapability() "ptr", CurrentTSO "ptr") [R1]; @@ -214,6 +220,11 @@ killThreadzh_fast * If the exception went to a catch frame, we'll just continue from * the handler. */ + loop: + if (StgTSO_what_next(target) == ThreadRelocated::I16) { + target = StgTSO__link(target); + goto loop; + } if (target == CurrentTSO) { SAVE_THREAD_STATE(); /* ToDo: what if the current thread is blocking exceptions? */ @@ -430,14 +441,15 @@ retry_pop_stack: // be per-thread. W_[rts_stop_on_exception] = 0; ("ptr" ioAction) = foreign "C" deRefStablePtr (W_[rts_breakpoint_io_action] "ptr") []; - Sp = Sp - WDS(6); - Sp(5) = exception; - Sp(4) = stg_raise_ret_info; + Sp = Sp - WDS(7); + Sp(6) = exception; + Sp(5) = stg_raise_ret_info; + Sp(4) = stg_noforceIO_info; // required for unregisterised Sp(3) = exception; // the AP_STACK - Sp(2) = base_GHCziBase_True_closure; // dummy breakpoint info - Sp(1) = base_GHCziBase_True_closure; // True <=> a breakpoint + Sp(2) = ghczmprim_GHCziBool_True_closure; // dummy breakpoint info + Sp(1) = ghczmprim_GHCziBool_True_closure; // True <=> a breakpoint R1 = ioAction; - jump stg_ap_pppv_info; + jump RET_LBL(stg_ap_pppv); } }