diff --git a/src/jit/nvm_x86_64.c b/src/jit/nvm_x86_64.c index 5a2651b8..00996d62 100644 --- a/src/jit/nvm_x86_64.c +++ b/src/jit/nvm_x86_64.c @@ -447,7 +447,7 @@ Nvm_res m_nvm(Body* body) { u64 lsz = 0; // local variable used up space #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 SUBi(R_SP, lsz); @@ -457,10 +457,12 @@ Nvm_res m_nvm(Body* body) { #define VAR(OFF,N) (OFF##Off + (N)) #define VAR8(OFF,N) VAR(OFF,(N)*8) - MOV8mro(R_SP, R_A1, VAR(pscs,0)); - for (i32 i = 1; i < body->maxPSC+1; i++) { - MOV8rmo(R_A1, R_A1, offsetof(Scope, psc)); - MOV8mro(R_SP, R_A1, VAR8(pscs,i)); + if (body->maxPSC) { + MOV8mro(R_SP, R_A1, VAR(pscs,0)); + for (i32 i = 1; i < body->maxPSC; 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"); diff --git a/src/vm.c b/src/vm.c index 938dd4b5..84aa3a27 100644 --- a/src/vm.c +++ b/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 cdepth = c[1]; i32 cpos = c[2]; - if (cdepth>mpsc) mpsc = cdepth; + if (cdepth+1 > mpsc) mpsc = cdepth+1; if (sc && cdepth>=depth) { Scope* csc = sc; 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; } - if (mpsc>U16_MAX) thrM("VM compiler: LOC_ too deep"); + if (mpsc>U16_MAX) thrM("VM compiler: Block too deep"); usz blC = TSSIZE(nBlT); BlBlocks* nBl = NULL; @@ -375,9 +375,11 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume u32* bc = b->bc; pushEnv(sc, bc); gsReserve(b->maxStack); - Scope* pscs[b->maxPSC+1]; - pscs[0] = sc; - for (i32 i = 0; i < b->maxPSC; i++) pscs[i+1] = pscs[i]->psc; + Scope* pscs[b->maxPSC]; + if (b->maxPSC) { + pscs[0] = sc; + for (i32 i = 1; i < b->maxPSC; i++) pscs[i] = pscs[i-1]->psc; + } #ifdef GS_REALLOC #define POP (*--gStack) #define P(N) B N=POP;