rewind the dynamic state when entering a partial continuation
authorAndy Wingo <wingo@pobox.com>
Wed, 24 Feb 2010 16:43:02 +0000 (17:43 +0100)
committerAndy Wingo <wingo@pobox.com>
Wed, 24 Feb 2010 16:43:02 +0000 (17:43 +0100)
* libguile/control.c (cont_objcode):
* libguile/vm-i-system.c (partial-cont-call):
* libguile/vm.c (vm_reinstate_partial_continuation): Don't keep the
  "external winds" in a partial continuation, as they aren't logically
  part of the continuation. Reinstate the "internal winds" when entering
  a partial continuation. Things seem to work!

libguile/control.c
libguile/vm-i-system.c
libguile/vm.c

index cffc007..49a19cf 100644 (file)
@@ -100,9 +100,8 @@ SCM_STATIC_OBJCODE (cont_objcode) = {
   /* 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
@@ -110,7 +109,7 @@ SCM_STATIC_OBJCODE (cont_objcode) = {
   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 */
@@ -161,7 +160,7 @@ reify_partial_continuation (SCM vm, SCM prompt, SCM extwinds,
                                     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);
index 2f74a59..04ef951 100644 (file)
@@ -995,13 +995,11 @@ VM_DEFINE_INSTRUCTION (89, continuation_call, "continuation-call", 0, -1, 0)
 
 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 ();
index a5f4570..6fecd60 100644 (file)
@@ -230,7 +230,7 @@ vm_abort (SCM vm, size_t n, scm_t_int64 vm_cookie)
 
 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;
@@ -277,6 +277,15 @@ vm_reinstate_partial_continuation (SCM vm, SCM cont, SCM intwinds,
     }
   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