summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/vm.c2
-rw-r--r--src/vm_engine.h22
-rw-r--r--src/vm_system.c30
3 files changed, 21 insertions, 33 deletions
diff --git a/src/vm.c b/src/vm.c
index d09602075..ae2b7f120 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -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;
}