mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-14 15:40:19 +02:00
NULLSTACK fixes for nonlocal exits in reentrant pre-wind handlers
* libguile/vm-i-system.c (goto/cc): Add some asserts here. * libguile/vm.c (capture_vm_cont): Add some asserts here too. (reinstate_vm_cont): Null the correct number of bytes. Add a FIXME. (vm_reset_stack): Make the code a bit clearer. Null the correct number of bytes. * libguile/vm-engine.h (NULLSTACK_FOR_NONLOCAL_EXIT): New macro, handles a very tricky case that took me days to find! Amply commented. Expands to nothing in the normal case. * libguile/vm-i-system.c (call, goto/args, mv-call): Call NULLSTACK_FOR_NONLOCAL_EXIT in the right places. Fixes continuations.test.
This commit is contained in:
parent
0570c3f197
commit
66db076ae1
3 changed files with 24 additions and 5 deletions
|
@ -567,6 +567,7 @@ VM_DEFINE_INSTRUCTION (call, "call", 1, -1, 1)
|
|||
SYNC_REGISTER ();
|
||||
/* keep args on stack so they are marked */
|
||||
sp[-1] = scm_apply (x, sp[0], SCM_EOL);
|
||||
NULLSTACK_FOR_NONLOCAL_EXIT ();
|
||||
/* FIXME what if SCM_VALUESP(*sp) */
|
||||
DROP ();
|
||||
NEXT;
|
||||
|
@ -754,6 +755,7 @@ VM_DEFINE_INSTRUCTION (goto_args, "goto/args", 1, -1, 1)
|
|||
POP_LIST (nargs);
|
||||
SYNC_REGISTER ();
|
||||
sp[-1] = scm_apply (x, sp[0], SCM_EOL);
|
||||
NULLSTACK_FOR_NONLOCAL_EXIT ();
|
||||
DROP ();
|
||||
/* FIXME what if SCM_VALUESP(*sp) */
|
||||
goto vm_return;
|
||||
|
@ -822,6 +824,7 @@ VM_DEFINE_INSTRUCTION (mv_call, "mv-call", 3, -1, 1)
|
|||
POP_LIST (nargs);
|
||||
SYNC_REGISTER ();
|
||||
sp[-1] = scm_apply (x, sp[0], SCM_EOL);
|
||||
NULLSTACK_FOR_NONLOCAL_EXIT ();
|
||||
DROP ();
|
||||
if (SCM_VALUESP (*sp))
|
||||
{
|
||||
|
@ -931,6 +934,9 @@ VM_DEFINE_INSTRUCTION (goto_cc, "goto/cc", 0, 1, 1)
|
|||
POP (proc);
|
||||
SYNC_ALL ();
|
||||
cont = scm_make_continuation (&first);
|
||||
ASSERT (sp == vp->sp);
|
||||
ASSERT (fp == vp->fp);
|
||||
ASSERT (ip == vp->ip);
|
||||
if (first)
|
||||
{
|
||||
PUSH (proc);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue