Use PARK and UNPACK in evaluate1.
This commit is contained in:
@ -189,11 +189,14 @@ static cell_t parse(cell_t sep, cell_t *ret) {
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell_t *evaluate1(cell_t *sp, float **fp) {
|
static cell_t *evaluate1(cell_t *rp) {
|
||||||
cell_t call = 0;
|
cell_t call = 0;
|
||||||
|
cell_t tos, *sp, *ip;
|
||||||
|
float *fp;
|
||||||
|
UNPARK;
|
||||||
cell_t name;
|
cell_t name;
|
||||||
cell_t len = parse(' ', &name);
|
cell_t len = parse(' ', &name);
|
||||||
if (len == 0) { *++sp = 0; return sp; } // ignore empty
|
if (len == 0) { DUP; tos = 0; PARK; return rp; } // ignore empty
|
||||||
cell_t xt = find((const char *) name, len);
|
cell_t xt = find((const char *) name, len);
|
||||||
if (xt) {
|
if (xt) {
|
||||||
if (g_sys->state && !(((cell_t *) xt)[-1] & IMMEDIATE)) {
|
if (g_sys->state && !(((cell_t *) xt)[-1] & IMMEDIATE)) {
|
||||||
@ -208,7 +211,7 @@ static cell_t *evaluate1(cell_t *sp, float **fp) {
|
|||||||
*g_sys->heap++ = g_sys->DOLIT_XT;
|
*g_sys->heap++ = g_sys->DOLIT_XT;
|
||||||
*g_sys->heap++ = n;
|
*g_sys->heap++ = n;
|
||||||
} else {
|
} else {
|
||||||
*++sp = n;
|
PUSH n;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
float f;
|
float f;
|
||||||
@ -217,7 +220,7 @@ static cell_t *evaluate1(cell_t *sp, float **fp) {
|
|||||||
*g_sys->heap++ = g_sys->DOFLIT_XT;
|
*g_sys->heap++ = g_sys->DOFLIT_XT;
|
||||||
*(float *) g_sys->heap++ = f;
|
*(float *) g_sys->heap++ = f;
|
||||||
} else {
|
} else {
|
||||||
*++(*fp) = f;
|
*++fp = f;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
#if PRINT_ERRORS
|
#if PRINT_ERRORS
|
||||||
@ -225,15 +228,16 @@ static cell_t *evaluate1(cell_t *sp, float **fp) {
|
|||||||
fwrite((void *) name, 1, len, stderr);
|
fwrite((void *) name, 1, len, stderr);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
#endif
|
#endif
|
||||||
*++sp = name;
|
PUSH name;
|
||||||
*++sp = len;
|
PUSH len;
|
||||||
*++sp = -1;
|
*++sp = -1;
|
||||||
call = g_sys->notfound;
|
call = g_sys->notfound;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*++sp = call;
|
PUSH call;
|
||||||
return sp;
|
PARK;
|
||||||
|
return rp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static cell_t *forth_run(cell_t *initrp);
|
static cell_t *forth_run(cell_t *initrp);
|
||||||
|
|||||||
@ -140,16 +140,14 @@ typedef struct {
|
|||||||
XV(forth, "CONSTANT", CONSTANT, DUP; DUP; tos = parse(32, sp); \
|
XV(forth, "CONSTANT", CONSTANT, DUP; DUP; tos = parse(32, sp); \
|
||||||
create((const char *) *sp, tos, 0, ADDROF(DOCON)); \
|
create((const char *) *sp, tos, 0, ADDROF(DOCON)); \
|
||||||
DROPn(2); COMMA(tos); DROP) \
|
DROPn(2); COMMA(tos); DROP) \
|
||||||
X("DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \
|
XV(forth, "DOES>", DOES, DOES(ip); ip = (cell_t *) *rp; --rp) \
|
||||||
Y(IMMEDIATE, DOIMMEDIATE()) \
|
XV(forth, "IMMEDIATE", IMMEDIATE, DOIMMEDIATE()) \
|
||||||
XV(internals, "'SYS", SYS, DUP; tos = (cell_t) g_sys) \
|
XV(internals, "'SYS", SYS, DUP; tos = (cell_t) g_sys) \
|
||||||
YV(internals, YIELD, PARK; return rp) \
|
YV(internals, YIELD, PARK; return rp) \
|
||||||
X(":", COLON, DUP; DUP; tos = parse(32, sp); \
|
X(":", COLON, DUP; DUP; tos = parse(32, sp); \
|
||||||
create((const char *) *sp, tos, SMUDGE, ADDROF(DOCOL)); \
|
create((const char *) *sp, tos, SMUDGE, ADDROF(DOCOL)); \
|
||||||
g_sys->state = -1; --sp; DROP) \
|
g_sys->state = -1; --sp; DROP) \
|
||||||
YV(internals, EVALUATE1, DUP; float *tfp = fp; \
|
YV(internals, EVALUATE1, PARK; rp = evaluate1(rp); UNPARK; w = tos; DROP; if (w) JMPW) \
|
||||||
sp = evaluate1(sp, &tfp); \
|
|
||||||
fp = tfp; w = *sp--; DROP; if (w) JMPW) \
|
|
||||||
Y(EXIT, ip = (cell_t *) *rp--) \
|
Y(EXIT, ip = (cell_t *) *rp--) \
|
||||||
XV(internals, "'builtins", TBUILTINS, DUP; tos = (cell_t) &g_sys->builtins->code) \
|
XV(internals, "'builtins", TBUILTINS, DUP; tos = (cell_t) &g_sys->builtins->code) \
|
||||||
XV(forth_immediate, ";", SEMICOLON, COMMA(g_sys->DOEXIT_XT); UNSMUDGE(); g_sys->state = 0)
|
XV(forth_immediate, ";", SEMICOLON, COMMA(g_sys->DOEXIT_XT); UNSMUDGE(); g_sys->state = 0)
|
||||||
|
|||||||
@ -88,7 +88,7 @@ cases = ReplaceAll(cases, 'COMMA(tos)', 'COMMA(tos|0)');
|
|||||||
cases = ReplaceAll(cases, /find\(([^\n]+)\);/, 'find($1)|0;');
|
cases = ReplaceAll(cases, /find\(([^\n]+)\);/, 'find($1)|0;');
|
||||||
cases = ReplaceAll(cases, 'tos = parse(tos, sp)', 'tos = parse(tos|0, sp|0)|0');
|
cases = ReplaceAll(cases, 'tos = parse(tos, sp)', 'tos = parse(tos|0, sp|0)|0');
|
||||||
cases = ReplaceAll(cases, 'tos = parse(32, sp)', 'tos = parse(32, sp|0)|0');
|
cases = ReplaceAll(cases, 'tos = parse(32, sp)', 'tos = parse(32, sp|0)|0');
|
||||||
cases = ReplaceAll(cases, 'sp = evaluate1(sp)', 'sp = evaluate1(sp|0)|0');
|
cases = ReplaceAll(cases, 'rp = evaluate1(rp)', 'rp = evaluate1(rp|0)|0');
|
||||||
cases = ReplaceAll(cases, /convert\(([^\n]+), sp\)/, 'convert($1, sp|0)|0');
|
cases = ReplaceAll(cases, /convert\(([^\n]+), sp\)/, 'convert($1, sp|0)|0');
|
||||||
cases = ReplaceAll(cases, 'DOES(ip)', 'DOES(ip|0)');
|
cases = ReplaceAll(cases, 'DOES(ip)', 'DOES(ip|0)');
|
||||||
cases = ReplaceAll(cases, 'PARK;', ''); // TODO
|
cases = ReplaceAll(cases, 'PARK;', ''); // TODO
|
||||||
|
|||||||
Reference in New Issue
Block a user