factor/native/run.h

99 lines
1.7 KiB
C
Raw Normal View History

2004-07-16 02:26:21 -04:00
#define USER_ENV 16
#define CARD_OFF_ENV 1 /* for compiling set-slot */
2005-08-24 00:30:07 -04:00
/* 2 is unused */
2004-08-20 21:26:25 -04:00
#define NAMESTACK_ENV 3 /* used by library only */
2004-07-29 17:18:41 -04:00
#define GLOBAL_ENV 4
#define BREAK_ENV 5
2004-08-20 21:26:25 -04:00
#define CATCHSTACK_ENV 6 /* used by library only */
2004-10-12 23:52:03 -04:00
#define CPU_ENV 7
2004-08-20 18:48:08 -04:00
#define BOOT_ENV 8
2005-08-24 00:30:07 -04:00
/* 9 is unused */
#define ARGS_ENV 10
#define OS_ENV 11
#define ERROR_ENV 12 /* a marker consed onto kernel errors */
#define IN_ENV 13
#define OUT_ENV 14
2005-07-13 15:14:57 -04:00
#define GEN_ENV 15 /* set to gen_count */
2004-07-16 02:26:21 -04:00
2005-05-13 00:09:49 -04:00
/* TAGGED user environment data; see getenv/setenv prims */
DLLEXPORT CELL userenv[USER_ENV];
2005-05-13 00:09:49 -04:00
2004-07-16 02:26:21 -04:00
/* Error handlers restore this */
2004-12-11 15:02:34 -05:00
#ifdef WIN32
jmp_buf toplevel;
#else
sigjmp_buf toplevel;
2004-12-11 15:02:34 -05:00
#endif
2004-07-16 02:26:21 -04:00
2004-08-23 01:13:09 -04:00
/* Call stack depth to start profile counter from */
/* This ensures that words in the user's interpreter do not count */
CELL profile_depth;
2004-08-16 21:05:38 -04:00
2004-07-16 02:26:21 -04:00
INLINE CELL dpop(void)
{
CELL value = get(ds);
2004-08-20 18:48:08 -04:00
ds -= CELLS;
return value;
2004-07-16 02:26:21 -04:00
}
INLINE void drepl(CELL top)
{
put(ds,top);
}
2004-07-16 02:26:21 -04:00
INLINE void dpush(CELL top)
{
2004-08-20 18:48:08 -04:00
ds += CELLS;
put(ds,top);
2004-07-16 02:26:21 -04:00
}
INLINE CELL dpeek(void)
{
return get(ds);
2004-07-16 02:26:21 -04:00
}
INLINE CELL dpeek2(void)
{
return get(ds - CELLS);
}
2004-07-16 02:26:21 -04:00
INLINE CELL cpop(void)
{
CELL value = get(cs);
2004-08-20 18:48:08 -04:00
cs -= CELLS;
return value;
2004-07-16 02:26:21 -04:00
}
INLINE void cpush(CELL top)
{
2004-08-20 18:48:08 -04:00
cs += CELLS;
put(cs,top);
2004-07-16 02:26:21 -04:00
}
2004-08-23 01:13:09 -04:00
INLINE void call(CELL quot)
{
/* tail call optimization */
2005-01-01 19:30:57 -05:00
if(callframe == F)
/* put(cs - CELLS,executing) */;
else
2004-08-23 01:13:09 -04:00
{
2004-12-31 02:38:58 -05:00
cpush(executing);
2004-08-23 01:13:09 -04:00
cpush(callframe);
}
2005-01-01 19:30:57 -05:00
2004-08-23 01:13:09 -04:00
callframe = quot;
}
2004-07-16 02:26:21 -04:00
void run(void);
void platform_run(void);
2005-01-01 19:30:57 -05:00
void undefined(F_WORD* word);
void docol(F_WORD* word);
void dosym(F_WORD* word);
2004-07-16 02:26:21 -04:00
void primitive_execute(void);
void primitive_call(void);
void primitive_ifte(void);
void primitive_dispatch(void);
2004-07-16 02:26:21 -04:00
void primitive_getenv(void);
void primitive_setenv(void);