summaryrefslogtreecommitdiff
path: root/libguile/vm-engine.h
diff options
context:
space:
mode:
authorDaniel Kraft <d@domob.eu>2009-08-27 19:26:04 +0200
committerDaniel Kraft <d@domob.eu>2009-08-27 19:26:04 +0200
commitff810079188b8d04224959d5b54254d3e142d6c3 (patch)
treea58a203dd1a4f151ee8730c5a8290b0c36c2a04e /libguile/vm-engine.h
parent9a9f123144c179ef659252d3442117d6b774be7f (diff)
parentfa316af70ff11767d9a8eb971d9e0b888152a15c (diff)
downloadguile-ff810079188b8d04224959d5b54254d3e142d6c3.tar.gz
Merge branch 'master' of git://git.savannah.gnu.org/guile into elisp
Diffstat (limited to 'libguile/vm-engine.h')
-rw-r--r--libguile/vm-engine.h30
1 files changed, 13 insertions, 17 deletions
diff --git a/libguile/vm-engine.h b/libguile/vm-engine.h
index c0f772fb8..36d4d2867 100644
--- a/libguile/vm-engine.h
+++ b/libguile/vm-engine.h
@@ -336,6 +336,7 @@ do { \
#define FETCH() (*ip++)
#define FETCH_LENGTH(len) do { len=*ip++; len<<=8; len+=*ip++; len<<=8; len+=*ip++; } while (0)
+#define FETCH_WIDTH(width) do { width=*ip++; } while (0)
#undef CLOCK
#if VM_USE_CLOCK
@@ -385,34 +386,29 @@ do { \
/* See frames.h for the layout of stack frames */
/* When this is called, bp points to the new program data,
and the arguments are already on the stack */
-#define NEW_FRAME() \
+#define INIT_FRAME() \
{ \
int i; \
- SCM *dl, *data; \
- scm_byte_t *ra = ip; \
- \
- /* Save old registers */ \
- ra = ip; \
- dl = fp; \
\
/* New registers */ \
- fp = sp - bp->nargs + 1; \
- data = SCM_FRAME_DATA_ADDRESS (fp); \
- sp = data + 2; \
+ sp += bp->nlocs; \
CHECK_OVERFLOW (); \
stack_base = sp; \
ip = bp->base; \
\
/* Init local variables */ \
- for (i=bp->nlocs; i; i--) \
- data[-i] = SCM_UNDEFINED; \
- \
- /* Set frame data */ \
- data[2] = (SCM)ra; \
- data[1] = 0x0; \
- data[0] = (SCM)dl; \
+ for (i=bp->nlocs; i;) \
+ sp[-(--i)] = SCM_UNDEFINED; \
}
+#define DROP_FRAME() \
+ { \
+ sp -= 3; \
+ NULLSTACK (3); \
+ CHECK_UNDERFLOW (); \
+ }
+
+
/*
Local Variables:
c-file-style: "gnu"