diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/vm.c | 2 | ||||
-rw-r--r-- | src/vm_engine.h | 22 | ||||
-rw-r--r-- | src/vm_system.c | 30 |
3 files changed, 21 insertions, 33 deletions
@@ -328,7 +328,7 @@ vm_mark (SCM obj) if (SCM_NIMP (*sp)) scm_gc_mark (*sp); fp = SCM_VM_STACK_ADDRESS (sp[-1]); /* dynamic link */ - /* Mark frame variables + program */ + /* Mark external link, frame variables, and program */ for (sp -= 2; sp >= lower; sp--) if (SCM_NIMP (*sp)) scm_gc_mark (*sp); diff --git a/src/vm_engine.h b/src/vm_engine.h index 37320d901..f15e6d71c 100644 --- a/src/vm_engine.h +++ b/src/vm_engine.h @@ -135,16 +135,6 @@ objects = SCM_VELTS (bp->objs); \ } -#define CACHE_EXTERNAL() \ -{ \ - external = fp[bp->nargs + bp->nlocs]; \ -} - -#define SYNC_EXTERNAL() \ -{ \ - fp[bp->nargs + bp->nlocs] = external; \ -} - #define SYNC_BEFORE_GC() \ { \ SYNC_REGISTER (); \ @@ -305,16 +295,16 @@ do { \ CHECK_OVERFLOW (); \ sp[0] = ra; \ sp[-1] = dl; \ - sp[-2] = bp->external; \ + sp[-2] = external; \ } #define FREE_FRAME() \ { \ - SCM *new_sp = fp - 2; \ - sp = fp + bp->nargs + bp->nlocs; \ - ip = SCM_VM_BYTE_ADDRESS (sp[2]); \ - fp = SCM_VM_STACK_ADDRESS (sp[1]); \ - sp = new_sp; \ + SCM *p = fp + bp->nargs + bp->nlocs; \ + sp = fp - 2; \ + ip = SCM_VM_BYTE_ADDRESS (p[2]); \ + fp = SCM_VM_STACK_ADDRESS (p[1]); \ + external = p[0]; \ } /* diff --git a/src/vm_system.c b/src/vm_system.c index c0f14e444..1d7064a6e 100644 --- a/src/vm_system.c +++ b/src/vm_system.c @@ -351,10 +351,9 @@ VM_DEFINE_INSTRUCTION (call, "call", 1, -1, 1) LOCAL_SET (i, SCM_UNDEFINED); /* Create external variables */ - CACHE_EXTERNAL (); + external = bp->external; for (i = 0; i < bp->nexts; i++) CONS (external, SCM_UNDEFINED, external); - SYNC_EXTERNAL (); ENTER_HOOK (); APPLY_HOOK (); @@ -365,9 +364,10 @@ VM_DEFINE_INSTRUCTION (call, "call", 1, -1, 1) */ if (!SCM_FALSEP (scm_procedure_p (x))) { + SCM args; POP_LIST (nargs); - sp[-1] = scm_apply (x, *sp, SCM_EOL); - sp--; + POP (args); + *sp = scm_apply (x, args, SCM_EOL); NEXT; } /* @@ -406,18 +406,16 @@ VM_DEFINE_INSTRUCTION (tail_call, "tail-call", 1, -1, 1) */ if (SCM_EQ_P (x, program)) { - INIT_ARGS (); + int i; /* Move arguments */ - if (bp->nargs) - { - int i; - sp -= bp->nargs - 1; - for (i = 0; i < bp->nargs; i++) - LOCAL_SET (i, sp[i]); - sp -= 2; - } + INIT_ARGS (); + sp -= bp->nargs - 1; + for (i = 0; i < bp->nargs; i++) + LOCAL_SET (i, sp[i]); + sp--; + /* Call itself */ ip = bp->base; APPLY_HOOK (); NEXT; @@ -447,9 +445,10 @@ VM_DEFINE_INSTRUCTION (tail_call, "tail-call", 1, -1, 1) */ if (!SCM_FALSEP (scm_procedure_p (x))) { + SCM args; POP_LIST (nargs); - sp[-1] = scm_apply (x, *sp, SCM_EOL); - sp--; + POP (args); + *sp = scm_apply (x, args, SCM_EOL); goto vm_return; } /* @@ -504,7 +503,6 @@ VM_DEFINE_INSTRUCTION (return, "return", 0, 0, 1) /* Restore the last program */ program = SCM_VM_FRAME_PROGRAM (fp); CACHE_PROGRAM (); - CACHE_EXTERNAL (); PUSH (ret); NEXT; } |