diff options
author | Keisuke Nishida <kxn30@po.cwru.edu> | 2001-04-07 09:39:38 +0000 |
---|---|---|
committer | Keisuke Nishida <kxn30@po.cwru.edu> | 2001-04-07 09:39:38 +0000 |
commit | 3616e9e96305df6aedef5cf508ca0ee9ad71a973 (patch) | |
tree | f19087580444eafc3995ea04f74d4d2768a5bd22 /src/vm_engine.h | |
parent | 4bfb26f58fff7b0febef86cbbeb0cc537ccb5c20 (diff) | |
download | guile-3616e9e96305df6aedef5cf508ca0ee9ad71a973.tar.gz |
*** empty log message ***
Diffstat (limited to 'src/vm_engine.h')
-rw-r--r-- | src/vm_engine.h | 59 |
1 files changed, 30 insertions, 29 deletions
diff --git a/src/vm_engine.h b/src/vm_engine.h index feff9ba22..6bcf68655 100644 --- a/src/vm_engine.h +++ b/src/vm_engine.h @@ -179,15 +179,15 @@ */ #define CHECK_OVERFLOW() \ - if (sp < stack_base) \ + if (sp > stack_limit) \ goto vm_error_stack_overflow #define CHECK_UNDERFLOW() \ - if (sp >= stack_limit) \ + if (sp < stack_base) \ goto vm_error_stack_underflow -#define PUSH(x) do { CHECK_OVERFLOW (); *--sp = x; } while (0) -#define DROP() do { CHECK_UNDERFLOW (); sp++; } while (0) +#define PUSH(x) do { sp++; CHECK_OVERFLOW (); *sp = x; } while (0) +#define DROP() do { CHECK_UNDERFLOW (); sp--; } while (0) #define POP(x) do { x = *sp; DROP (); } while (0) #define CONS(x,y,z) \ @@ -204,10 +204,10 @@ do { \ int i; \ SCM l = SCM_EOL; \ - for (i = 0; i < n; i++) \ + sp -= n; \ + for (i = n; i; i--) \ CONS (l, sp[i], l); \ - sp += n - 1; \ - *sp = l; \ + PUSH (l); \ } while (0) @@ -245,8 +245,8 @@ do { \ */ #define ARGS1(a1) SCM a1 = sp[0]; -#define ARGS2(a1,a2) SCM a1 = sp[1], a2 = sp[0]; sp++; -#define ARGS3(a1,a2,a3) SCM a1 = sp[2], a2 = sp[1], a3 = sp[0]; sp += 2; +#define ARGS2(a1,a2) SCM a1 = sp[-1], a2 = sp[0]; sp--; +#define ARGS3(a1,a2,a3) SCM a1 = sp[-2], a2 = sp[-1], a3 = sp[0]; sp -= 2; #define ARGSN(an) int an = FETCH (); #define RETURN(x) do { *sp = x; NEXT; } while (0) @@ -256,26 +256,6 @@ do { \ * Frame allocation */ -#define NEW_FRAME() \ -{ \ - SCM ra = SCM_VM_MAKE_FRAME_ADDRESS (ip); \ - SCM dl = SCM_VM_MAKE_BYTE_ADDRESS (fp); \ - ip = bp->base; \ - fp = sp - bp->nlocs; \ - sp = SCM_VM_FRAME_LOWER_ADDRESS (fp); \ - CHECK_OVERFLOW (); \ - SCM_VM_FRAME_PROGRAM (fp) = program; \ - SCM_VM_FRAME_DYNAMIC_LINK (fp) = dl; \ - SCM_VM_FRAME_RETURN_ADDRESS (fp) = ra; \ -} - -#define FREE_FRAME() \ -{ \ - sp = fp + bp->nargs + bp->nlocs; \ - ip = SCM_VM_BYTE_ADDRESS (SCM_VM_FRAME_RETURN_ADDRESS (fp)); \ - fp = SCM_VM_FRAME_ADDRESS (SCM_VM_FRAME_DYNAMIC_LINK (fp)); \ -} - #define INIT_ARGS() \ { \ if (bp->nrest) \ @@ -292,6 +272,27 @@ do { \ } \ } +/* See vm.h for the layout of stack frames */ + +#define NEW_FRAME() \ +{ \ + sp[1] = SCM_VM_MAKE_BYTE_ADDRESS (ip); \ + sp[2] = SCM_VM_MAKE_STACK_ADDRESS (fp); \ + ip = bp->base; \ + fp = sp - bp->nargs + 1; \ + sp = sp + 2; \ + CHECK_OVERFLOW (); \ +} + +#define FREE_FRAME() \ +{ \ + SCM *new_sp = fp - 2; \ + sp = fp + bp->nargs + bp->nlocs; \ + ip = SCM_VM_BYTE_ADDRESS (sp[0]); \ + fp = SCM_VM_STACK_ADDRESS (sp[1]); \ + sp = new_sp; \ +} + /* Local Variables: c-file-style: "gnu" |