future: fix problem related to continuation marks

Capturing, restoring, then capturing again a future's continuation
marks did not work right.
This commit is contained in:
Matthew Flatt 2017-08-04 10:13:52 -06:00
parent f6e863a4dd
commit d062212ebc
3 changed files with 6 additions and 11 deletions

View File

@ -9025,7 +9025,7 @@ Scheme_Lightweight_Continuation *scheme_capture_lightweight_continuation(Scheme_
seg = p->cont_mark_stack_segments[i >> SCHEME_LOG_MARK_SEGMENT_SIZE];
pos = i & SCHEME_MARK_SEGMENT_MASK;
memcpy(cont_mark_stack_slice + i, seg + pos, sizeof(Scheme_Cont_Mark));
memcpy(cont_mark_stack_slice + j, seg + pos, sizeof(Scheme_Cont_Mark));
}
return lw;

View File

@ -2369,6 +2369,8 @@ void *worker_thread_future_loop(void *arg)
Scheme_Object *rator, **argv;
int argc;
scheme_fill_lwc_start();
if (ft->suspended_lw_stack) {
Scheme_Lightweight_Continuation *lc;
@ -2387,7 +2389,6 @@ void *worker_thread_future_loop(void *arg)
argv = NULL;
}
scheme_fill_lwc_start();
jitcode = ((Scheme_Native_Closure *)rator)->code->start_code;
v = scheme_call_as_lightweight_continuation(jitcode, rator, argc, argv);
if (SAME_OBJ(v, SCHEME_TAIL_CALL_WAITING))

View File

@ -132,16 +132,13 @@ THREAD_LOCAL_DECL(Scheme_Current_LWC *scheme_current_lwc);
static Scheme_Object *do_call_as_lwc(Scheme_Native_Proc *code,
void *data,
int argc,
Scheme_Object **argv,
MZ_MARK_STACK_TYPE cont_mark_stack_start)
Scheme_Object **argv)
{
#ifdef JIT_THREAD_LOCAL
# define THDLOC &BOTTOM_VARIABLE
#else
# define THDLOC NULL
#endif
scheme_current_lwc->runstack_start = MZ_RUNSTACK;
scheme_current_lwc->cont_mark_stack_start = cont_mark_stack_start;
return sjc.native_starter_code(data, argc, argv, THDLOC, code, (void **)&scheme_current_lwc->stack_start);
#undef THDLOC
}
@ -151,16 +148,13 @@ Scheme_Object *scheme_call_as_lightweight_continuation(Scheme_Native_Proc *code,
int argc,
Scheme_Object **argv)
{
return do_call_as_lwc(code, data, argc, argv, MZ_CONT_MARK_STACK);
return do_call_as_lwc(code, data, argc, argv);
}
#ifdef MZ_USE_FUTURES
Scheme_Object *scheme_force_value_same_mark_as_lightweight_continuation(Scheme_Object *v)
{
/* Providing 0 as cont_mark_stack_start is the "same_mark" part:
it preserves any continuation marks that are in place as part
of the continuation. */
return do_call_as_lwc(sjc.force_value_same_mark_code, NULL, 0, NULL, 0);
return do_call_as_lwc(sjc.force_value_same_mark_code, NULL, 0, NULL);
}
#endif