From 186b56c4dc870e0441a69b35ac9ea504251b6ca8 Mon Sep 17 00:00:00 2001 From: Andy Wingo Date: Sun, 20 Oct 2013 18:09:52 +0200 Subject: [PATCH] Resumable partial continuations in the RTL VM * libguile/vm-engine.c (receive-values): Bugfix for the case where we want an exact number of values. (abort): Advance the IP before capturing. The captured SP is fp - 1, not fp. * libguile/vm.c (vm_reinstate_partial_continuation): Don't push on a number-of-values marker. --- libguile/vm-engine.c | 8 ++++++-- libguile/vm.c | 3 +++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libguile/vm-engine.c b/libguile/vm-engine.c index 978ec6b48..c4e0097c1 100644 --- a/libguile/vm-engine.c +++ b/libguile/vm-engine.c @@ -1111,7 +1111,7 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_) VM_ASSERT (FRAME_LOCALS_COUNT () > proc + nvalues, vm_error_not_enough_values ()); else - VM_ASSERT (FRAME_LOCALS_COUNT () == proc + nvalues, + VM_ASSERT (FRAME_LOCALS_COUNT () == proc + 1 + nvalues, vm_error_wrong_number_of_values (nvalues)); NEXT (2); } @@ -1427,9 +1427,13 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_) scm_t_uint32 nlocals = FRAME_LOCALS_COUNT (); ASSERT (nlocals >= 2); + /* FIXME: Really we should capture the caller's registers. Until + then, manually advance the IP so that when the prompt resumes, + it continues with the next instruction. */ + ip++; SYNC_IP (); vm_abort (vm, LOCAL_REF (1), nlocals - 2, &LOCAL_REF (2), - SCM_EOL, &LOCAL_REF (1), ®isters); + SCM_EOL, &LOCAL_REF (0), ®isters); /* vm_abort should not return */ abort (); diff --git a/libguile/vm.c b/libguile/vm.c index 4154cfe9f..c9ce3a31a 100644 --- a/libguile/vm.c +++ b/libguile/vm.c @@ -350,8 +350,11 @@ vm_reinstate_partial_continuation (SCM vm, SCM cont, size_t n, SCM *argv, vp->sp++; *vp->sp = argv_copy[i]; } +#if 0 + /* The number-of-values marker, only used by the stack VM. */ vp->sp++; *vp->sp = scm_from_size_t (n); +#endif /* The prompt captured a slice of the dynamic stack. Here we wind those entries onto the current thread's stack. We also have to