From: Simon Marlow Date: Sat, 25 Sep 2010 19:33:17 +0000 (+0000) Subject: interruptible FFI: more robust handling of the exception case in the interpreter X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=11fbcd763a9ab7b4135693c510b8bb4e4709a438 interruptible FFI: more robust handling of the exception case in the interpreter --- diff --git a/rts/Interpreter.c b/rts/Interpreter.c index 58ffd25..fa4a46f 100644 --- a/rts/Interpreter.c +++ b/rts/Interpreter.c @@ -1454,11 +1454,12 @@ run_BCO: cap = (Capability *)((void *)((unsigned char*)resumeThread(tok) - STG_FIELD_OFFSET(Capability,r))); LOAD_STACK_POINTERS; - if (Sp[0] == (W_)&stg_enter_info) { - // Sp got clobbered due to an exception; so we should - // go run it instead. - Sp++; - goto eval; + if (Sp[0] != (W_)&stg_gc_gen_info) { + // the stack is not how we left it. This probably + // means that an exception got raised on exit from the + // foreign call, so we should just continue with + // whatever is on top of the stack now. + RETURN_TO_SCHEDULER_NO_PAUSE(ThreadRunGHC, ThreadYielding); } // Re-load the pointer to the BCO from the RET_DYN frame,