unsigned bytecode

This commit is contained in:
dzaima 2021-05-28 01:12:36 +03:00
parent 1b89661308
commit 345a0bfc8b
2 changed files with 17 additions and 17 deletions

View File

@ -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;

View File

@ -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;