fix wasn't right for interaction between continuation shortcut and stack overflow
svn: r5367
This commit is contained in:
parent
87c0d5754e
commit
c1cb5e34c0
|
@ -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;
|
||||
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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue
Block a user