offset envCurr by 1

This commit is contained in:
dzaima 2021-06-22 18:14:12 +03:00
parent c2d0ce5568
commit 8b561a065a
4 changed files with 20 additions and 18 deletions

View File

@ -52,7 +52,7 @@ static void* mmX_allocN(usz sz, u8 type) { assert(sz>=16); return mmX_allocL(BSZ
#endif #endif
#define P(N) B N=GSP; #define P(N) B N=GSP;
#if VM_POS #if VM_POS
#define POS_UPD (envCurr-1)->bcL = bc; #define POS_UPD envCurr->bcL = bc;
#else #else
#define POS_UPD #define POS_UPD
#endif #endif

View File

@ -142,7 +142,7 @@ int main(int argc, char* argv[]) {
repl_init(); repl_init();
while (CATCH) { while (CATCH) {
printf("Error: "); print(catchMessage); putchar('\n'); printf("Error: "); print(catchMessage); putchar('\n');
vm_pst(envCurr, envStart+envPrevHeight); vm_pst(envCurr+1, envStart+envPrevHeight);
dec(catchMessage); dec(catchMessage);
#ifdef HEAP_VERIFY #ifdef HEAP_VERIFY
heapVerify(); heapVerify();

View File

@ -85,7 +85,7 @@ void printBC(u32* p) {
B catchMessage; B catchMessage;
u64 envPrevHeight; u64 envPrevHeight;
Env* envCurr; Env* envCurr; // pointer to current environment; included to make for simpler current position updating
Env* envStart; Env* envStart;
Env* envEnd; Env* envEnd;
@ -386,7 +386,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
#endif #endif
#define L64 ({ u64 r = bc[0] | ((u64)bc[1])<<32; bc+= 2; r; }) #define L64 ({ u64 r = bc[0] | ((u64)bc[1])<<32; bc+= 2; r; })
#if VM_POS #if VM_POS
#define POS_UPD (envCurr-1)->bcL = bc-1; #define POS_UPD envCurr->bcL = bc-1;
#else #else
#define POS_UPD #define POS_UPD
#endif #endif
@ -776,6 +776,7 @@ void comp_init() {
allocStack((void**)&gStack, (void**)&gStackStart, (void**)&gStackEnd, sizeof(B), GS_SIZE); allocStack((void**)&gStack, (void**)&gStackStart, (void**)&gStackEnd, sizeof(B), GS_SIZE);
#endif #endif
allocStack((void**)&envCurr, (void**)&envStart, (void**)&envEnd, sizeof(Env), ENV_SIZE); allocStack((void**)&envCurr, (void**)&envStart, (void**)&envEnd, sizeof(Env), ENV_SIZE);
envCurr--;
} }
@ -802,7 +803,7 @@ jmp_buf* prepareCatch() { // in the case of returning false, must call popCatch(
} }
cf->cfDepth = cf-cfStart; cf->cfDepth = cf-cfStart;
cf->gsDepth = gStack-gStackStart; cf->gsDepth = gStack-gStackStart;
cf->envDepth = envCurr-envStart; cf->envDepth = (envCurr+1)-envStart;
return &(cf++)->jmp; return &(cf++)->jmp;
} }
void popCatch() { void popCatch() {
@ -838,7 +839,7 @@ NOINLINE void vm_printPos(Comp* comp, i32 bcPos, i64 pos) {
} }
} }
NOINLINE void vm_pst(Env* s, Env* e) { NOINLINE void vm_pst(Env* s, Env* e) { // e not included
assert(s<=e); assert(s<=e);
i64 l = e-s; i64 l = e-s;
i64 i = l-1; i64 i = l-1;
@ -849,20 +850,20 @@ NOINLINE void vm_pst(Env* s, Env* e) {
i = 10; i = 10;
} }
Comp* comp = c->sc->body->comp; Comp* comp = c->sc->body->comp;
i32 bcPos = c>=envStart && c<envCurr? BCPOS(c->sc->body, c->bcL) : c->bcV; i32 bcPos = c>=envStart && c<=envCurr? BCPOS(c->sc->body, c->bcL) : c->bcV;
vm_printPos(comp, bcPos, i); vm_printPos(comp, bcPos, i);
i--; i--;
} }
} }
NOINLINE void vm_pstLive() { NOINLINE void vm_pstLive() {
vm_pst(envStart, envCurr); vm_pst(envStart, envCurr+1);
} }
static void unwindEnv(Env* envNew) { static void unwindEnv(Env* envNew) { // envNew==envStart-1 for emptying the env stack
assert(envNew<=envCurr); assert(envNew<=envCurr);
while (envCurr!=envNew) { while (envCurr!=envNew) {
envCurr--;
envCurr->bcV = BCPOS(envCurr->sc->body, envCurr->bcL); envCurr->bcV = BCPOS(envCurr->sc->body, envCurr->bcL);
envCurr--;
} }
} }
@ -876,8 +877,8 @@ NOINLINE NORETURN void thr(B msg) {
B* gStackNew = gStackStart + cf->gsDepth; B* gStackNew = gStackStart + cf->gsDepth;
assert(gStackNew<=gStack); assert(gStackNew<=gStack);
while (gStack!=gStackNew) dec(*--gStack); while (gStack!=gStackNew) dec(*--gStack);
envPrevHeight = envCurr-envStart; envPrevHeight = envCurr-envStart + 1;
unwindEnv(envStart + cf->envDepth); unwindEnv(envStart + cf->envDepth - 1);
if (cfStart+cf->cfDepth > cf) err("bad catch cfDepth"); if (cfStart+cf->cfDepth > cf) err("bad catch cfDepth");
@ -885,10 +886,10 @@ NOINLINE NORETURN void thr(B msg) {
longjmp(cf->jmp, 1); longjmp(cf->jmp, 1);
} }
assert(cf==cfStart); assert(cf==cfStart);
printf("Error: "); print(msg); putchar('\n'); printf("Error: "); print(msg); putchar('\n'); fflush(stdout);
Env* envPrev = envCurr; Env* envEnd = envCurr+1;
unwindEnv(envStart); unwindEnv(envStart-1);
vm_pst(envCurr, envPrev); vm_pst(envCurr+1, envEnd);
#ifdef DEBUG #ifdef DEBUG
__builtin_trap(); __builtin_trap();
#else #else

View File

@ -147,14 +147,15 @@ typedef struct Env {
extern Env* envCurr; extern Env* envCurr;
extern Env* envStart; extern Env* envStart;
extern Env* envEnd; extern Env* envEnd;
extern u64 envPrevHeight; // envStart+prevEnvHeight gives envCurr+1 from before the error
static inline void pushEnv(Scope* sc, u32* bc) { static inline void pushEnv(Scope* sc, u32* bc) {
envCurr++;
if (envCurr==envEnd) thrM("Stack overflow"); if (envCurr==envEnd) thrM("Stack overflow");
envCurr->sc = sc; envCurr->sc = sc;
envCurr->bcL = bc; envCurr->bcL = bc;
envCurr++;
} }
static inline void popEnv() { static inline void popEnv() {
assert(envCurr>envStart); assert(envCurr>=envStart);
envCurr--; envCurr--;
} }
void vm_pst(Env* s, Env* e); void vm_pst(Env* s, Env* e);