diff --git a/src/vm.c b/src/vm.c index 5fd0d83f..f1282942 100644 --- a/src/vm.c +++ b/src/vm.c @@ -237,7 +237,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, i32* bc, usz bcIA, B block Body* body = mm_allocN(fsizeof(Body,varIDs,i32,vam), t_body); body->comp = comp; ptr_inc(comp); - body->bc = nbc; + body->bc = (u32*)nbc; body->map = map; body->blocks = nBl; body->maxStack = hM; @@ -396,7 +396,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume #endif B* objs = b->comp->objs->a; Block** blocks = b->blocks->a; // b->comp->blocks; - i32* bc = b->bc; + u32* bc = b->bc; pushEnv(sc, bc); gsReserve(b->maxStack); Scope* pscs[b->maxPSC+1]; @@ -414,7 +414,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume #define ADD(X) { *(lgStack++) = X; } // fine, as, if an error occurs, lgStack is ignored anyways #define GS_UPD { gStack = lgStack; } #endif - #define L64 ({ u64 r = (u32)bc[0] | ((u64)(u32)bc[1])<<32; bc+= 2; r; }) + #define L64 ({ u64 r = bc[0] | ((u64)bc[1])<<32; bc+= 2; r; }) #if VM_POS #define POS_UPD (envCurr-1)->bcL = bc-1; #else @@ -423,7 +423,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume while(true) { #ifdef DEBUG_VM - i32* sbc = bc; + u32* sbc = bc; i32 bcPos = BCPOS(b,sbc); vmStack[stackNum] = bcPos; for(i32 i = 0; i < bcDepth; i++) printf(" "); @@ -471,13 +471,13 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume break; } case ARRO: case ARRM: { - i32 sz = *bc++; + u32 sz = *bc++; if (sz==0) { ADD(inc(bi_emptyHVec)); } else { HArr_p r = m_harrUv(sz); bool allNum = true; - for (i32 i = 0; i < sz; i++) if (!isNum(r.a[sz-i-1] = POP)) allNum = false; + for (i64 i = 0; i < sz; i++) if (!isNum(r.a[sz-i-1] = POP)) allNum = false; if (allNum) { GS_UPD; ADD(withFill(r.b, m_f64(0))); @@ -505,33 +505,33 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume else ADD(m_fork(f,g,h)); break; } - case LOCM: { i32 d = *bc++; i32 p = *bc++; + case LOCM: { u32 d = *bc++; u32 p = *bc++; ADD(tag((u64)d<<32 | (u32)p, VAR_TAG)); break; } - case LOCO: { i32 d = *bc++; i32 p = *bc++; + case LOCO: { u32 d = *bc++; u32 p = *bc++; B l = pscs[d]->vars[p]; if(l.u==bi_noVar.u) { POS_UPD; thrM("Reading variable before its defined"); } ADD(inc(l)); break; } - case LOCU: { i32 d = *bc++; i32 p = *bc++; + case LOCU: { u32 d = *bc++; u32 p = *bc++; B* vars = pscs[d]->vars; ADD(vars[p]); vars[p] = bi_optOut; break; } - case EXTM: { i32 d = *bc++; i32 p = *bc++; + case EXTM: { u32 d = *bc++; u32 p = *bc++; ADD(tag((u64)d<<32 | (u32)p, EXT_TAG)); break; } - case EXTO: { i32 d = *bc++; i32 p = *bc++; + case EXTO: { u32 d = *bc++; u32 p = *bc++; B l = pscs[d]->ext->vars[p]; if(l.u==bi_noVar.u) { POS_UPD; thrM("Reading variable before its defined"); } ADD(inc(l)); break; } - case EXTU: { i32 d = *bc++; i32 p = *bc++; + case EXTU: { u32 d = *bc++; u32 p = *bc++; B* vars = pscs[d]->ext->vars; ADD(vars[p]); vars[p] = bi_optOut; @@ -546,7 +546,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume ADD(r); break; } - case FLDO: { P(ns) GS_UPD; i32 p = *bc++; POS_UPD; + case FLDO: { P(ns) GS_UPD; u32 p = *bc++; POS_UPD; if (!isNsp(ns)) thrM("Trying to read a field from non-namespace"); ADD(inc(ns_getU(ns, sc->body->nsDesc->nameList, p))); dec(ns); @@ -558,7 +558,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume ADD(m_ns(sc, b->nsDesc)); goto end; } - case NSPM: { P(o) i32 l = *bc++; + case NSPM: { P(o) u32 l = *bc++; B a = mm_alloc(sizeof(FldAlias), t_fldAlias, ftag(OBJ_TAG)); c(FldAlias,a)->obj = o; c(FldAlias,a)->p = l; diff --git a/src/vm.h b/src/vm.h index 3a15263e..7f7f3a6e 100644 --- a/src/vm.h +++ b/src/vm.h @@ -34,7 +34,7 @@ struct Body { Comp* comp; BlBlocks* blocks; // B* objs; - i32* bc; // pointer in an owned I32Arr + u32* bc; // pointer in an owned I32Arr i32* map; // pointer in an owned I32Arr u32 maxStack; u16 maxPSC; @@ -65,7 +65,7 @@ B evalBC(Body* b, Scope* sc); // doesn't consume; executes bytecode of the body typedef struct Env { Scope* sc; - union { i32* bcL; i32 bcV; }; + union { u32* bcL; i32 bcV; }; } Env; void vm_pst(Env* s, Env* e); @@ -88,7 +88,7 @@ extern Env* envCurr; extern Env* envStart; extern Env* envEnd; -static inline void pushEnv(Scope* sc, i32* bc) { +static inline void pushEnv(Scope* sc, u32* bc) { if (envCurr==envEnd) thrM("Stack overflow"); envCurr->sc = sc; envCurr->bcL = bc;