fix wasn't right for interaction between continuation shortcut and stack overflow

svn: r5367
This commit is contained in:
Matthew Flatt 2007-01-16 21:57:43 +00:00
parent 87c0d5754e
commit c1cb5e34c0
2 changed files with 20 additions and 9 deletions

View File

@ -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;

View File

@ -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;