Added Yield and rentrancy.
This commit is contained in:
@ -16,6 +16,7 @@ static struct {
|
||||
int argc;
|
||||
char **argv;
|
||||
cell_t DOLIT_XT, DOEXIT_XT;
|
||||
cell_t *ip, *sp, *rp; // Parked alternates
|
||||
} g_sys;
|
||||
|
||||
static cell_t convert(const char *pos, cell_t n, cell_t *ret) {
|
||||
@ -117,33 +118,16 @@ static cell_t *evaluate1(cell_t *sp) {
|
||||
return sp;
|
||||
}
|
||||
|
||||
static void ueforth(int argc, char *argv[], void *heap,
|
||||
const char *src, cell_t src_len) {
|
||||
memset(&g_sys, 0, sizeof(g_sys));
|
||||
g_sys.heap = (cell_t *) heap;
|
||||
register cell_t *sp = g_sys.heap; g_sys.heap += STACK_SIZE;
|
||||
register cell_t *rp = g_sys.heap; g_sys.heap += STACK_SIZE;
|
||||
register cell_t tos = 0, *ip, w;
|
||||
dcell_t d;
|
||||
udcell_t ud;
|
||||
static void ueforth_run() {
|
||||
if (!g_sys.ip) {
|
||||
#define X(name, op, code) create(name, sizeof(name) - 1, name[0] == ';', && OP_ ## op);
|
||||
PLATFORM_OPCODE_LIST
|
||||
OPCODE_LIST
|
||||
#undef X
|
||||
g_sys.last[-1] = 1; // Make ; IMMEDIATE
|
||||
g_sys.DOLIT_XT = FIND("DOLIT");
|
||||
g_sys.DOEXIT_XT = FIND("EXIT");
|
||||
g_sys.notfound = FIND("DROP");
|
||||
ip = g_sys.heap;
|
||||
*g_sys.heap++ = FIND("EVALUATE1");
|
||||
*g_sys.heap++ = FIND("BRANCH");
|
||||
*g_sys.heap++ = (cell_t) ip;
|
||||
g_sys.argc = argc;
|
||||
g_sys.argv = argv;
|
||||
g_sys.base = 10;
|
||||
g_sys.tib = src;
|
||||
g_sys.ntib = src_len;
|
||||
NEXT;
|
||||
return;
|
||||
}
|
||||
register cell_t *ip = g_sys.ip, *rp = g_sys.rp, *sp = g_sys.sp, tos, w;
|
||||
DROP; NEXT;
|
||||
#define X(name, op, code) OP_ ## op: { code; } NEXT;
|
||||
PLATFORM_OPCODE_LIST
|
||||
OPCODE_LIST
|
||||
@ -153,3 +137,28 @@ static void ueforth(int argc, char *argv[], void *heap,
|
||||
OP_DODOES: DUP; tos = w + sizeof(cell_t) * 2;
|
||||
++rp; *rp = (cell_t) ip; ip = (cell_t *) *(cell_t *) (w + sizeof(cell_t)); NEXT;
|
||||
}
|
||||
|
||||
static void ueforth(int argc, char *argv[], void *heap,
|
||||
const char *src, cell_t src_len) {
|
||||
memset(&g_sys, 0, sizeof(g_sys));
|
||||
g_sys.heap = (cell_t *) heap;
|
||||
ueforth_run();
|
||||
g_sys.sp = g_sys.heap + sizeof(cell_t); g_sys.heap += STACK_SIZE;
|
||||
g_sys.rp = g_sys.heap; g_sys.heap += STACK_SIZE;
|
||||
g_sys.last[-1] = 1; // Make ; IMMEDIATE
|
||||
g_sys.DOLIT_XT = FIND("DOLIT");
|
||||
g_sys.DOEXIT_XT = FIND("EXIT");
|
||||
g_sys.notfound = FIND("DROP");
|
||||
g_sys.ip = g_sys.heap;
|
||||
*g_sys.heap++ = FIND("EVALUATE1");
|
||||
*g_sys.heap++ = FIND("BRANCH");
|
||||
*g_sys.heap++ = (cell_t) g_sys.ip;
|
||||
g_sys.argc = argc;
|
||||
g_sys.argv = argv;
|
||||
g_sys.base = 10;
|
||||
g_sys.tib = src;
|
||||
g_sys.ntib = src_len;
|
||||
for (;;) {
|
||||
ueforth_run();
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,12 +19,13 @@ typedef uint64_t udcell_t;
|
||||
#define COMMA(n) *g_sys.heap++ = (n)
|
||||
#define IMMEDIATE() g_sys.last[-1] |= 1
|
||||
#define DOES(ip) *g_sys.last = (cell_t) && OP_DODOES; g_sys.last[1] = (cell_t) ip
|
||||
#define UMSMOD ud = *(udcell_t *) &sp[-1]; \
|
||||
#define UMSMOD udcell_t ud = *(udcell_t *) &sp[-1]; \
|
||||
--sp; *sp = (cell_t) (ud % tos); \
|
||||
tos = (cell_t) (ud / tos)
|
||||
#define SSMOD d = (dcell_t) *sp * (dcell_t) sp[-1]; \
|
||||
#define SSMOD dcell_t d = (dcell_t) *sp * (dcell_t) sp[-1]; \
|
||||
--sp; *sp = (cell_t) (((udcell_t) d) % tos); \
|
||||
tos = (cell_t) (d < 0 ? ~(~d / tos) : d / tos)
|
||||
#define PARK DUP; g_sys.ip = ip; g_sys.rp = rp; g_sys.sp = sp
|
||||
|
||||
#define OPCODE_LIST \
|
||||
X("0=", ZEQUAL, tos = !tos ? -1 : 0) \
|
||||
@ -73,6 +74,7 @@ typedef uint64_t udcell_t;
|
||||
X("DOES>", DOES, DOES((cell_t *) ((cell_t) ip|0)); ip = (cell_t *) (*rp | 0); --rp) \
|
||||
X("IMMEDIATE", IMMEDIATE, IMMEDIATE()) \
|
||||
X("'SYS", SYS, DUP; tos = (cell_t) &g_sys) \
|
||||
X("YIELD", YIELD, PARK; return) \
|
||||
X(":", COLON, DUP; DUP; tos = parse(32, (cell_t *) ((cell_t) sp | 0))|0; \
|
||||
create((const char *) (*sp | 0), tos|0, 0, && OP_DOCOLON); \
|
||||
g_sys.state = -1; --sp; DROP) \
|
||||
|
||||
Reference in New Issue
Block a user