/* leave args on the stack */
/* 0 */ scm_op_object_ref, 0, /* push scm_vm_cont object */
/* 2 */ scm_op_object_ref, 1, /* push internal winds */
- /* 4 */ scm_op_object_ref, 2, /* push external winds */
- /* 6 */ scm_op_partial_cont_call, /* and go! */
- /* 7 */ scm_op_nop, /* pad to 8 bytes */
+ /* 4 */ scm_op_partial_cont_call, /* and go! */
+ /* 5 */ scm_op_nop, scm_op_nop, scm_op_nop, /* pad to 8 bytes */
/* 8 */
/* We could put some meta-info to say that this proc is a continuation. Not sure
META_HEADER (19),
/* 0 */ scm_op_make_eol, /* bindings */
/* 1 */ scm_op_make_eol, /* sources */
- /* 2 */ scm_op_make_int8, 0, scm_op_make_int8, 7, /* arity: from ip 0 to ip 7 */
+ /* 2 */ scm_op_make_int8, 0, scm_op_make_int8, 5, /* arity: from ip 0 to ip 7 */
/* 6 */ scm_op_make_int8_0, /* the arity is 0 required args */
/* 7 */ scm_op_make_int8_0, /* 0 optionals */
/* 8 */ scm_op_make_true, /* and a rest arg */
flags);
ret = scm_make_program (cont_objcode,
- scm_vector (scm_list_3 (vm_cont, intwinds, extwinds)),
+ scm_vector (scm_list_2 (vm_cont, intwinds)),
SCM_BOOL_F);
SCM_SET_CELL_WORD_0 (ret,
SCM_CELL_WORD_0 (ret) | SCM_F_PROGRAM_IS_CONTINUATION);
VM_DEFINE_INSTRUCTION (94, partial_cont_call, "partial-cont-call", 0, -1, 0)
{
- SCM vmcont, intwinds, extwinds;
- POP (extwinds);
+ SCM vmcont, intwinds;
POP (intwinds);
POP (vmcont);
SYNC_REGISTER ();
- vm_reinstate_partial_continuation (vm, vmcont, intwinds, extwinds,
- sp + 1 - fp, fp);
+ vm_reinstate_partial_continuation (vm, vmcont, intwinds, sp + 1 - fp, fp);
CACHE_REGISTER ();
program = SCM_FRAME_PROGRAM (fp);
CACHE_PROGRAM ();
static void
vm_reinstate_partial_continuation (SCM vm, SCM cont, SCM intwinds,
- SCM extwinds, size_t n, SCM *argv)
+ size_t n, SCM *argv)
{
struct scm_vm *vp;
struct scm_vm_cont *cp;
}
vp->sp++;
*vp->sp = scm_from_size_t (n);
+
+ /* Finally, rewind the dynamic state. */
+ {
+ long delta = 0;
+ SCM newwinds = scm_i_dynwinds ();
+ for (; scm_is_pair (intwinds); intwinds = scm_cdr (intwinds), delta--)
+ newwinds = scm_cons (scm_car (intwinds), newwinds);
+ scm_dowinds (newwinds, delta);
+ }
}
\f