diff --git a/src/mzscheme/src/eval.c b/src/mzscheme/src/eval.c index 1dc7289847..f7b5ab87ec 100644 --- a/src/mzscheme/src/eval.c +++ b/src/mzscheme/src/eval.c @@ -6309,8 +6309,25 @@ scheme_do_eval(Scheme_Object *obj, int num_rands, Scheme_Object **rands, capturing the continuation, so we can jump directly. */ scheme_drop_prompt_meta_continuations(c->prompt_tag); c->shortcut_prompt = prompt; - p->stack_start = c->stack_start; - scheme_longjmpup(&c->buf); + if ((!prompt->boundary_overflow_id && !p->overflow) + || (prompt->boundary_overflow_id + && (prompt->boundary_overflow_id == p->overflow->id))) { + scheme_longjmpup(&c->buf); + } else { + /* Need to unwind overflows... */ + Scheme_Overflow *overflow; + overflow = p->overflow; + while (overflow->prev + && (!overflow->prev->id + || (overflow->prev->id != prompt->boundary_overflow_id))) { + overflow = overflow->prev; + } + /* Immediate destination is in scheme_handle_stack_overflow(). */ + p->cjs.jumping_to_continuation = (Scheme_Object *)c; + p->overflow = overflow; + p->stack_start = overflow->stack_start; + scheme_longjmpup(&overflow->jmp->cont); + } } else { p->cjs.jumping_to_continuation = (Scheme_Object *)prompt; p->cjs.num_vals = 1; diff --git a/src/mzscheme/src/fun.c b/src/mzscheme/src/fun.c index 0ade9793bc..65c551f686 100644 --- a/src/mzscheme/src/fun.c +++ b/src/mzscheme/src/fun.c @@ -4298,13 +4298,7 @@ static void restore_continuation(Scheme_Cont *cont, Scheme_Thread *p, int for_pr copy_cjs(&p->cjs, &cont->cjs); if (shortcut_prompt) { Scheme_Overflow *overflow; - overflow = p->overflow; - while (overflow - && (!overflow->id - || (overflow->id != shortcut_prompt->boundary_overflow_id))) { - overflow = overflow->prev; - } - overflow = clone_overflows(cont->save_overflow, NULL, overflow); + overflow = clone_overflows(cont->save_overflow, NULL, p->overflow); p->overflow = overflow; } else { p->overflow = cont->save_overflow;