offset envCurr by 1
This commit is contained in:
parent
c2d0ce5568
commit
8b561a065a
@ -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
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
29
src/vm.c
29
src/vm.c
@ -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
|
||||||
|
|||||||
5
src/vm.h
5
src/vm.h
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user