0 parent scope loading
This commit is contained in:
parent
be5c22af37
commit
3451cc48c2
@ -447,7 +447,7 @@ Nvm_res m_nvm(Body* body) {
|
|||||||
u64 lsz = 0; // local variable used up space
|
u64 lsz = 0; // local variable used up space
|
||||||
#define ALLOCL(NAME,N) u64 NAME##Off = lsz; lsz+= (N)
|
#define ALLOCL(NAME,N) u64 NAME##Off = lsz; lsz+= (N)
|
||||||
|
|
||||||
ALLOCL(pscs, (body->maxPSC+1)*8);
|
ALLOCL(pscs, (body->maxPSC)*8);
|
||||||
while (((lsz+pushAm*8)&0xf) != 8) lsz++; // lazy way to make sure we're properly aligned
|
while (((lsz+pushAm*8)&0xf) != 8) lsz++; // lazy way to make sure we're properly aligned
|
||||||
SUBi(R_SP, lsz);
|
SUBi(R_SP, lsz);
|
||||||
|
|
||||||
@ -457,10 +457,12 @@ Nvm_res m_nvm(Body* body) {
|
|||||||
|
|
||||||
#define VAR(OFF,N) (OFF##Off + (N))
|
#define VAR(OFF,N) (OFF##Off + (N))
|
||||||
#define VAR8(OFF,N) VAR(OFF,(N)*8)
|
#define VAR8(OFF,N) VAR(OFF,(N)*8)
|
||||||
MOV8mro(R_SP, R_A1, VAR(pscs,0));
|
if (body->maxPSC) {
|
||||||
for (i32 i = 1; i < body->maxPSC+1; i++) {
|
MOV8mro(R_SP, R_A1, VAR(pscs,0));
|
||||||
MOV8rmo(R_A1, R_A1, offsetof(Scope, psc));
|
for (i32 i = 1; i < body->maxPSC; i++) {
|
||||||
MOV8mro(R_SP, R_A1, VAR8(pscs,i));
|
MOV8rmo(R_A1, R_A1, offsetof(Scope, psc));
|
||||||
|
MOV8mro(R_SP, R_A1, VAR8(pscs,i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((u64)i_RETD > I32_MAX || (u64)&gStack > I32_MAX || (u64)&envEnd > I32_MAX) thrM("JIT: Refusing to run with CBQN code outside of the 32-bit address range");
|
if ((u64)i_RETD > I32_MAX || (u64)&gStack > I32_MAX || (u64)&envEnd > I32_MAX) thrM("JIT: Refusing to run with CBQN code outside of the 32-bit address range");
|
||||||
|
|||||||
12
src/vm.c
12
src/vm.c
@ -183,7 +183,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B block
|
|||||||
i32 ins = c[0];
|
i32 ins = c[0];
|
||||||
i32 cdepth = c[1];
|
i32 cdepth = c[1];
|
||||||
i32 cpos = c[2];
|
i32 cpos = c[2];
|
||||||
if (cdepth>mpsc) mpsc = cdepth;
|
if (cdepth+1 > mpsc) mpsc = cdepth+1;
|
||||||
if (sc && cdepth>=depth) {
|
if (sc && cdepth>=depth) {
|
||||||
Scope* csc = sc;
|
Scope* csc = sc;
|
||||||
for (i32 i = depth; i < cdepth; i++) if (!(csc = csc->psc)) thrM("VM compiler: LOC_ has an out-of-bounds depth");
|
for (i32 i = depth; i < cdepth; i++) if (!(csc = csc->psc)) thrM("VM compiler: LOC_ has an out-of-bounds depth");
|
||||||
@ -213,7 +213,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B block
|
|||||||
c = n;
|
c = n;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mpsc>U16_MAX) thrM("VM compiler: LOC_ too deep");
|
if (mpsc>U16_MAX) thrM("VM compiler: Block too deep");
|
||||||
|
|
||||||
usz blC = TSSIZE(nBlT);
|
usz blC = TSSIZE(nBlT);
|
||||||
BlBlocks* nBl = NULL;
|
BlBlocks* nBl = NULL;
|
||||||
@ -375,9 +375,11 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
|
|||||||
u32* bc = b->bc;
|
u32* bc = b->bc;
|
||||||
pushEnv(sc, bc);
|
pushEnv(sc, bc);
|
||||||
gsReserve(b->maxStack);
|
gsReserve(b->maxStack);
|
||||||
Scope* pscs[b->maxPSC+1];
|
Scope* pscs[b->maxPSC];
|
||||||
pscs[0] = sc;
|
if (b->maxPSC) {
|
||||||
for (i32 i = 0; i < b->maxPSC; i++) pscs[i+1] = pscs[i]->psc;
|
pscs[0] = sc;
|
||||||
|
for (i32 i = 1; i < b->maxPSC; i++) pscs[i] = pscs[i-1]->psc;
|
||||||
|
}
|
||||||
#ifdef GS_REALLOC
|
#ifdef GS_REALLOC
|
||||||
#define POP (*--gStack)
|
#define POP (*--gStack)
|
||||||
#define P(N) B N=POP;
|
#define P(N) B N=POP;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user