X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FException.cmm;h=39a2abad9a6c44caaaaee55b57d440ccdaca41cd;hb=50c4d03919a9d5c37c14004e964083251f655e93;hp=f3564e453fae316279acec5f56b41e430607ff44;hpb=82f8341d3d87d9127c968baa9c3376e3f26caa81;p=ghc-hetmet.git diff --git a/rts/Exception.cmm b/rts/Exception.cmm index f3564e4..39a2aba 100644 --- a/rts/Exception.cmm +++ b/rts/Exception.cmm @@ -13,7 +13,9 @@ #include "Cmm.h" #include "RaiseAsync.h" +#ifdef __PIC__ import base_GHCziBase_True_closure; +#endif /* ----------------------------------------------------------------------------- Exception Primitives @@ -212,6 +214,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? */ @@ -428,14 +435,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 R1 = ioAction; - jump stg_ap_pppv_info; + jump RET_LBL(stg_ap_pppv); } }