diff options
author | Keisuke Nishida <kxn30@po.cwru.edu> | 2001-04-11 20:57:44 +0000 |
---|---|---|
committer | Keisuke Nishida <kxn30@po.cwru.edu> | 2001-04-11 20:57:44 +0000 |
commit | 41f248a84ad6c6aa6331733a4d4cbd71c21db1be (patch) | |
tree | 33424f63966ec308ef7f6cb8e25a5eb2adbf38bd /src/vm_system.c | |
parent | 8710eba09b61ae3ea6db34c4a9f863afb8fd678c (diff) | |
download | guile-41f248a84ad6c6aa6331733a4d4cbd71c21db1be.tar.gz |
*** empty log message ***
Diffstat (limited to 'src/vm_system.c')
-rw-r--r-- | src/vm_system.c | 33 |
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; } |