summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--rts/Interpreter.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/rts/Interpreter.c b/rts/Interpreter.c
index 58ffd257af..fa4a46fd12 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,