summaryrefslogtreecommitdiff
path: root/src/vm_system.c
diff options
context:
space:
mode:
authorKeisuke Nishida <kxn30@po.cwru.edu>2001-04-11 20:57:44 +0000
committerKeisuke Nishida <kxn30@po.cwru.edu>2001-04-11 20:57:44 +0000
commit41f248a84ad6c6aa6331733a4d4cbd71c21db1be (patch)
tree33424f63966ec308ef7f6cb8e25a5eb2adbf38bd /src/vm_system.c
parent8710eba09b61ae3ea6db34c4a9f863afb8fd678c (diff)
downloadguile-41f248a84ad6c6aa6331733a4d4cbd71c21db1be.tar.gz
*** empty log message ***
Diffstat (limited to 'src/vm_system.c')
-rw-r--r--src/vm_system.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/src/vm_system.c b/src/vm_system.c
index ba31f74ae..4e15485e4 100644
--- a/src/vm_system.c
+++ b/src/vm_system.c
@@ -223,49 +223,53 @@ VM_DEFINE_INSTRUCTION (variable_set, "variable-set", 0, 1, 0)
#define BR(p) \
{ \
- signed char offset = FETCH (); \
+ int h = FETCH (); \
+ int l = FETCH (); \
+ signed short offset = (h << 8) + l; \
if (p) \
ip += offset; \
DROP (); \
NEXT; \
}
-VM_DEFINE_INSTRUCTION (br_if, "br-if", 1, 0, 0)
+VM_DEFINE_INSTRUCTION (br, "br", 2, 0, 0)
+{
+ int h = FETCH ();
+ int l = FETCH ();
+ ip += (signed short) (h << 8) + l;
+ NEXT;
+}
+
+VM_DEFINE_INSTRUCTION (br_if, "br-if", 2, 0, 0)
{
BR (!SCM_FALSEP (*sp));
}
-VM_DEFINE_INSTRUCTION (br_if_not, "br-if-not", 1, 0, 0)
+VM_DEFINE_INSTRUCTION (br_if_not, "br-if-not", 2, 0, 0)
{
BR (SCM_FALSEP (*sp));
}
-VM_DEFINE_INSTRUCTION (br_if_eq, "br-if-eq", 1, 0, 0)
+VM_DEFINE_INSTRUCTION (br_if_eq, "br-if-eq", 2, 0, 0)
{
BR (SCM_EQ_P (sp[0], sp--[1]));
}
-VM_DEFINE_INSTRUCTION (br_if_not_eq, "br-if-not-eq", 1, 0, 0)
+VM_DEFINE_INSTRUCTION (br_if_not_eq, "br-if-not-eq", 2, 0, 0)
{
BR (!SCM_EQ_P (sp[0], sp--[1]));
}
-VM_DEFINE_INSTRUCTION (br_if_null, "br-if-null", 1, 0, 0)
+VM_DEFINE_INSTRUCTION (br_if_null, "br-if-null", 2, 0, 0)
{
BR (SCM_NULLP (*sp));
}
-VM_DEFINE_INSTRUCTION (br_if_not_null, "br-if-not-null", 1, 0, 0)
+VM_DEFINE_INSTRUCTION (br_if_not_null, "br-if-not-null", 2, 0, 0)
{
BR (!SCM_NULLP (*sp));
}
-VM_DEFINE_INSTRUCTION (jump, "jump", 1, 0, 0)
-{
- ip += (signed char) FETCH ();
- NEXT;
-}
-
/*
* Subprogram call
@@ -305,8 +309,10 @@ VM_DEFINE_INSTRUCTION (call, "call", 1, -1, 1)
LOCAL_SET (i, SCM_UNDEFINED);
/* Create external variables */
+ CACHE_EXTERNAL ();
for (i = 0; i < bp->nexts; i++)
CONS (external, SCM_UNDEFINED, external);
+ SYNC_EXTERNAL ();
ENTER_HOOK ();
APPLY_HOOK ();
@@ -454,6 +460,7 @@ 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;
}