From e6d41cdd75fae2b5538770ece42056252bcc540b Mon Sep 17 00:00:00 2001 From: Keisuke Nishida Date: Mon, 4 Sep 2000 01:47:10 +0000 Subject: [PATCH] * src/vm_system.c (tail_call): Use SCM_TICK at the beginning. --- src/vm_system.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/vm_system.c b/src/vm_system.c index d3b2c02a9..f75b7e783 100644 --- a/src/vm_system.c +++ b/src/vm_system.c @@ -464,6 +464,7 @@ SCM_DEFINE_INSTRUCTION (call, "%call", INST_INUM) */ SCM_DEFINE_INSTRUCTION (tail_call, "%tail-call", INST_INUM) { + SCM_TICK; /* allow interrupt here */ nargs = SCM_INUM (FETCH ()); /* the number of arguments */ /* @@ -488,17 +489,19 @@ SCM_DEFINE_INSTRUCTION (tail_call, "%tail-call", INST_INUM) POP (obj); SCM_VM_FRAME_VARIABLE (fp, nvars++) = obj; } + VM_FRAME_INIT_EXTERNAL_VARIABLES (fp, ac); } else - /* Dynamic return call */ + /* Proper tail call */ { - /* Create a new frame */ - SCM *p = fp; + /* FIXME: Must remove the last frame. + FIXME: We need to move arguments before that. */ + SCM *last_fp = fp; VM_NEW_FRAME (fp, ac, - SCM_VM_FRAME_DYNAMIC_LINK (p), - SCM_VM_FRAME_STACK_POINTER (p), - SCM_VM_FRAME_RETURN_ADDRESS (p)); + SCM_VM_FRAME_DYNAMIC_LINK (last_fp), + SCM_VM_FRAME_STACK_POINTER (last_fp), + SCM_VM_FRAME_RETURN_ADDRESS (last_fp)); VM_CALL_HOOK (); }