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. */
|
capturing the continuation, so we can jump directly. */
|
||||||
scheme_drop_prompt_meta_continuations(c->prompt_tag);
|
scheme_drop_prompt_meta_continuations(c->prompt_tag);
|
||||||
c->shortcut_prompt = prompt;
|
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);
|
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 {
|
} else {
|
||||||
p->cjs.jumping_to_continuation = (Scheme_Object *)prompt;
|
p->cjs.jumping_to_continuation = (Scheme_Object *)prompt;
|
||||||
p->cjs.num_vals = 1;
|
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);
|
copy_cjs(&p->cjs, &cont->cjs);
|
||||||
if (shortcut_prompt) {
|
if (shortcut_prompt) {
|
||||||
Scheme_Overflow *overflow;
|
Scheme_Overflow *overflow;
|
||||||
overflow = p->overflow;
|
overflow = clone_overflows(cont->save_overflow, NULL, p->overflow);
|
||||||
while (overflow
|
|
||||||
&& (!overflow->id
|
|
||||||
|| (overflow->id != shortcut_prompt->boundary_overflow_id))) {
|
|
||||||
overflow = overflow->prev;
|
|
||||||
}
|
|
||||||
overflow = clone_overflows(cont->save_overflow, NULL, overflow);
|
|
||||||
p->overflow = overflow;
|
p->overflow = overflow;
|
||||||
} else {
|
} else {
|
||||||
p->overflow = cont->save_overflow;
|
p->overflow = cont->save_overflow;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user