From 11fbcd763a9ab7b4135693c510b8bb4e4709a438 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Sat, 25 Sep 2010 19:33:17 +0000 Subject: [PATCH] interruptible FFI: more robust handling of the exception case in the interpreter --- rts/Interpreter.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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, -- 1.7.10.4