Align PARK/UNPARK with THROW/CATCH.
This commit is contained in:
@ -285,9 +285,9 @@ static void forth_init(int argc, char *argv[],
|
||||
g_sys->tib = src;
|
||||
g_sys->ntib = src_len;
|
||||
|
||||
*++rp = (cell_t) start;
|
||||
*++rp = (cell_t) fp;
|
||||
*++rp = (cell_t) sp;
|
||||
*++rp = (cell_t) start;
|
||||
g_sys->rp = rp;
|
||||
g_sys->runner = forth_run;
|
||||
}
|
||||
|
||||
@ -32,11 +32,11 @@ typedef uintptr_t ucell_t;
|
||||
#define DUP (*++sp = tos)
|
||||
#define PUSH DUP; tos = (cell_t)
|
||||
|
||||
#define PARK DUP; *++rp = (cell_t) fp; *++rp = (cell_t) sp; *++rp = (cell_t) ip
|
||||
#define UNPARK ip = (cell_t *) *rp--; sp = (cell_t *) *rp--; fp = (float *) *rp--; DROP
|
||||
#define THROWIT(n) rp = *g_sys->throw_handler; *g_sys->throw_handler = (cell_t *) *rp--; \
|
||||
sp = (cell_t *) *rp--; fp = (float *) *rp--; ip = (cell_t *) *rp--; \
|
||||
NIP; tos = (n);
|
||||
#define PARK *++rp = (cell_t) ip; *++rp = (cell_t) fp; DUP; *++rp = (cell_t) sp;
|
||||
#define UNPARK sp = (cell_t *) *rp--; DROP; fp = (float *) *rp--; ip = (cell_t *) *rp--;
|
||||
|
||||
#define THROWIT(n) \
|
||||
rp = *g_sys->throw_handler; *g_sys->throw_handler = (cell_t *) *rp--; UNPARK; tos = (n);
|
||||
|
||||
#define TOFLAGS(xt) ((uint8_t *) (((cell_t *) (xt)) - 1))
|
||||
#define TONAMELEN(xt) (TOFLAGS(xt) + 1)
|
||||
|
||||
@ -68,9 +68,9 @@ static void IRAM_ATTR HandleInterrupt(void *arg) {
|
||||
cell_t stack[INTERRUPT_STACK_CELLS];
|
||||
stack[0] = args->arg;
|
||||
cell_t *rp = rstack;
|
||||
*++rp = (cell_t) code;
|
||||
*++rp = (cell_t) (fstack + 1);
|
||||
*++rp = (cell_t) (stack + 1);
|
||||
*++rp = (cell_t) code;
|
||||
forth_run(rp);
|
||||
}
|
||||
|
||||
|
||||
@ -340,15 +340,22 @@ function FConvert(pos, n, ret) {
|
||||
function Evaluate1(rp) {
|
||||
var call = 0;
|
||||
var tos, sp, ip, fp;
|
||||
|
||||
// UNPARK
|
||||
ip = i32[rp>>2]; rp -= 4; sp = i32[rp>>2]; rp -= 4; fp = i32[rp>>2]; rp -= 4; tos = i32[sp>>2]; sp -= 4;
|
||||
sp = i32[rp>>2]; rp -= 4;
|
||||
tos = i32[sp>>2]; sp -= 4;
|
||||
fp = i32[rp>>2]; rp -= 4;
|
||||
ip = i32[rp>>2]; rp -= 4;
|
||||
|
||||
var name = sp + 8;
|
||||
var len = Parse(32, name);
|
||||
if (len == 0) { // ignore empty
|
||||
sp += 4; i32[sp>>2] = tos; tos = 0;
|
||||
// PARK
|
||||
sp += 4; i32[sp>>2] = tos; rp += 4; i32[rp>>2] = fp; rp += 4; i32[rp>>2] = sp; rp += 4; i32[rp>>2] = ip;
|
||||
rp += 4; i32[rp>>2] = ip;
|
||||
rp += 4; i32[rp>>2] = fp;
|
||||
sp += 4; i32[sp>>2] = tos;
|
||||
rp += 4; i32[rp>>2] = sp;
|
||||
return rp;
|
||||
}
|
||||
name = i32[name>>2];
|
||||
@ -388,7 +395,10 @@ function Evaluate1(rp) {
|
||||
}
|
||||
sp += 4; i32[sp>>2] = tos; tos = call;
|
||||
// PARK
|
||||
sp += 4; i32[sp>>2] = tos; rp += 4; i32[rp>>2] = fp; rp += 4; i32[rp>>2] = sp; rp += 4; i32[rp>>2] = ip;
|
||||
rp += 4; i32[rp>>2] = ip;
|
||||
rp += 4; i32[rp>>2] = fp;
|
||||
sp += 4; i32[sp>>2] = tos;
|
||||
rp += 4; i32[rp>>2] = sp;
|
||||
|
||||
return rp;
|
||||
}
|
||||
@ -452,9 +462,9 @@ function Init() {
|
||||
i32[g_sys_ntib>>2] = source_len;
|
||||
i32[g_sys_ntib>>2] = source_len;
|
||||
|
||||
rp += 4; i32[rp>>2] = start;
|
||||
rp += 4; i32[rp>>2] = fp;
|
||||
rp += 4; i32[rp>>2] = sp;
|
||||
rp += 4; i32[rp>>2] = start;
|
||||
i32[g_sys_rp>>2] = rp;
|
||||
}
|
||||
|
||||
@ -546,10 +556,10 @@ function VM(stdlib, foreign, heap) {
|
||||
|
||||
// UNPARK
|
||||
rp = i32[g_sys_rp>>2]|0;
|
||||
ip = i32[rp>>2]|0; rp = (rp - 4)|0;
|
||||
sp = i32[rp>>2]|0; rp = (rp - 4)|0;
|
||||
fp = i32[rp>>2]|0; rp = (rp - 4)|0;
|
||||
tos = i32[sp>>2]|0; sp = (sp - 4)|0;
|
||||
fp = i32[rp>>2]|0; rp = (rp - 4)|0;
|
||||
ip = i32[rp>>2]|0; rp = (rp - 4)|0;
|
||||
for (;;) {
|
||||
//trace(ip|0, sp|0, tos|0);
|
||||
w = i32[ip>>2]|0;
|
||||
|
||||
Reference in New Issue
Block a user