mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-10 07:50:24 +02:00
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.
This commit is contained in:
parent
486013d67c
commit
186b56c4dc
2 changed files with 9 additions and 2 deletions
|
@ -1111,7 +1111,7 @@ RTL_VM_NAME (SCM vm, SCM program, SCM *argv, size_t nargs_)
|
||||||
VM_ASSERT (FRAME_LOCALS_COUNT () > proc + nvalues,
|
VM_ASSERT (FRAME_LOCALS_COUNT () > proc + nvalues,
|
||||||
vm_error_not_enough_values ());
|
vm_error_not_enough_values ());
|
||||||
else
|
else
|
||||||
VM_ASSERT (FRAME_LOCALS_COUNT () == proc + nvalues,
|
VM_ASSERT (FRAME_LOCALS_COUNT () == proc + 1 + nvalues,
|
||||||
vm_error_wrong_number_of_values (nvalues));
|
vm_error_wrong_number_of_values (nvalues));
|
||||||
NEXT (2);
|
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 ();
|
scm_t_uint32 nlocals = FRAME_LOCALS_COUNT ();
|
||||||
|
|
||||||
ASSERT (nlocals >= 2);
|
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 ();
|
SYNC_IP ();
|
||||||
vm_abort (vm, LOCAL_REF (1), nlocals - 2, &LOCAL_REF (2),
|
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 */
|
/* vm_abort should not return */
|
||||||
abort ();
|
abort ();
|
||||||
|
|
|
@ -350,8 +350,11 @@ vm_reinstate_partial_continuation (SCM vm, SCM cont, size_t n, SCM *argv,
|
||||||
vp->sp++;
|
vp->sp++;
|
||||||
*vp->sp = argv_copy[i];
|
*vp->sp = argv_copy[i];
|
||||||
}
|
}
|
||||||
|
#if 0
|
||||||
|
/* The number-of-values marker, only used by the stack VM. */
|
||||||
vp->sp++;
|
vp->sp++;
|
||||||
*vp->sp = scm_from_size_t (n);
|
*vp->sp = scm_from_size_t (n);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* The prompt captured a slice of the dynamic stack. Here we wind
|
/* The prompt captured a slice of the dynamic stack. Here we wind
|
||||||
those entries onto the current thread's stack. We also have to
|
those entries onto the current thread's stack. We also have to
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue