unsigned bytecode
This commit is contained in:
parent
1b89661308
commit
345a0bfc8b
28
src/vm.c
28
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* body = mm_allocN(fsizeof(Body,varIDs,i32,vam), t_body);
|
||||||
body->comp = comp; ptr_inc(comp);
|
body->comp = comp; ptr_inc(comp);
|
||||||
body->bc = nbc;
|
body->bc = (u32*)nbc;
|
||||||
body->map = map;
|
body->map = map;
|
||||||
body->blocks = nBl;
|
body->blocks = nBl;
|
||||||
body->maxStack = hM;
|
body->maxStack = hM;
|
||||||
@ -396,7 +396,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
|
|||||||
#endif
|
#endif
|
||||||
B* objs = b->comp->objs->a;
|
B* objs = b->comp->objs->a;
|
||||||
Block** blocks = b->blocks->a; // b->comp->blocks;
|
Block** blocks = b->blocks->a; // b->comp->blocks;
|
||||||
i32* bc = b->bc;
|
u32* bc = b->bc;
|
||||||
pushEnv(sc, bc);
|
pushEnv(sc, bc);
|
||||||
gsReserve(b->maxStack);
|
gsReserve(b->maxStack);
|
||||||
Scope* pscs[b->maxPSC+1];
|
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 ADD(X) { *(lgStack++) = X; } // fine, as, if an error occurs, lgStack is ignored anyways
|
||||||
#define GS_UPD { gStack = lgStack; }
|
#define GS_UPD { gStack = lgStack; }
|
||||||
#endif
|
#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
|
#if VM_POS
|
||||||
#define POS_UPD (envCurr-1)->bcL = bc-1;
|
#define POS_UPD (envCurr-1)->bcL = bc-1;
|
||||||
#else
|
#else
|
||||||
@ -423,7 +423,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
|
|||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
#ifdef DEBUG_VM
|
#ifdef DEBUG_VM
|
||||||
i32* sbc = bc;
|
u32* sbc = bc;
|
||||||
i32 bcPos = BCPOS(b,sbc);
|
i32 bcPos = BCPOS(b,sbc);
|
||||||
vmStack[stackNum] = bcPos;
|
vmStack[stackNum] = bcPos;
|
||||||
for(i32 i = 0; i < bcDepth; i++) printf(" ");
|
for(i32 i = 0; i < bcDepth; i++) printf(" ");
|
||||||
@ -471,13 +471,13 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ARRO: case ARRM: {
|
case ARRO: case ARRM: {
|
||||||
i32 sz = *bc++;
|
u32 sz = *bc++;
|
||||||
if (sz==0) {
|
if (sz==0) {
|
||||||
ADD(inc(bi_emptyHVec));
|
ADD(inc(bi_emptyHVec));
|
||||||
} else {
|
} else {
|
||||||
HArr_p r = m_harrUv(sz);
|
HArr_p r = m_harrUv(sz);
|
||||||
bool allNum = true;
|
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) {
|
if (allNum) {
|
||||||
GS_UPD;
|
GS_UPD;
|
||||||
ADD(withFill(r.b, m_f64(0)));
|
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));
|
else ADD(m_fork(f,g,h));
|
||||||
break;
|
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));
|
ADD(tag((u64)d<<32 | (u32)p, VAR_TAG));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LOCO: { i32 d = *bc++; i32 p = *bc++;
|
case LOCO: { u32 d = *bc++; u32 p = *bc++;
|
||||||
B l = pscs[d]->vars[p];
|
B l = pscs[d]->vars[p];
|
||||||
if(l.u==bi_noVar.u) { POS_UPD; thrM("Reading variable before its defined"); }
|
if(l.u==bi_noVar.u) { POS_UPD; thrM("Reading variable before its defined"); }
|
||||||
ADD(inc(l));
|
ADD(inc(l));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case LOCU: { i32 d = *bc++; i32 p = *bc++;
|
case LOCU: { u32 d = *bc++; u32 p = *bc++;
|
||||||
B* vars = pscs[d]->vars;
|
B* vars = pscs[d]->vars;
|
||||||
ADD(vars[p]);
|
ADD(vars[p]);
|
||||||
vars[p] = bi_optOut;
|
vars[p] = bi_optOut;
|
||||||
break;
|
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));
|
ADD(tag((u64)d<<32 | (u32)p, EXT_TAG));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EXTO: { i32 d = *bc++; i32 p = *bc++;
|
case EXTO: { u32 d = *bc++; u32 p = *bc++;
|
||||||
B l = pscs[d]->ext->vars[p];
|
B l = pscs[d]->ext->vars[p];
|
||||||
if(l.u==bi_noVar.u) { POS_UPD; thrM("Reading variable before its defined"); }
|
if(l.u==bi_noVar.u) { POS_UPD; thrM("Reading variable before its defined"); }
|
||||||
ADD(inc(l));
|
ADD(inc(l));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case EXTU: { i32 d = *bc++; i32 p = *bc++;
|
case EXTU: { u32 d = *bc++; u32 p = *bc++;
|
||||||
B* vars = pscs[d]->ext->vars;
|
B* vars = pscs[d]->ext->vars;
|
||||||
ADD(vars[p]);
|
ADD(vars[p]);
|
||||||
vars[p] = bi_optOut;
|
vars[p] = bi_optOut;
|
||||||
@ -546,7 +546,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
|
|||||||
ADD(r);
|
ADD(r);
|
||||||
break;
|
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");
|
if (!isNsp(ns)) thrM("Trying to read a field from non-namespace");
|
||||||
ADD(inc(ns_getU(ns, sc->body->nsDesc->nameList, p)));
|
ADD(inc(ns_getU(ns, sc->body->nsDesc->nameList, p)));
|
||||||
dec(ns);
|
dec(ns);
|
||||||
@ -558,7 +558,7 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume
|
|||||||
ADD(m_ns(sc, b->nsDesc));
|
ADD(m_ns(sc, b->nsDesc));
|
||||||
goto end;
|
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));
|
B a = mm_alloc(sizeof(FldAlias), t_fldAlias, ftag(OBJ_TAG));
|
||||||
c(FldAlias,a)->obj = o;
|
c(FldAlias,a)->obj = o;
|
||||||
c(FldAlias,a)->p = l;
|
c(FldAlias,a)->p = l;
|
||||||
|
|||||||
6
src/vm.h
6
src/vm.h
@ -34,7 +34,7 @@ struct Body {
|
|||||||
Comp* comp;
|
Comp* comp;
|
||||||
BlBlocks* blocks;
|
BlBlocks* blocks;
|
||||||
// B* objs;
|
// B* objs;
|
||||||
i32* bc; // pointer in an owned I32Arr
|
u32* bc; // pointer in an owned I32Arr
|
||||||
i32* map; // pointer in an owned I32Arr
|
i32* map; // pointer in an owned I32Arr
|
||||||
u32 maxStack;
|
u32 maxStack;
|
||||||
u16 maxPSC;
|
u16 maxPSC;
|
||||||
@ -65,7 +65,7 @@ B evalBC(Body* b, Scope* sc); // doesn't consume; executes bytecode of the body
|
|||||||
|
|
||||||
typedef struct Env {
|
typedef struct Env {
|
||||||
Scope* sc;
|
Scope* sc;
|
||||||
union { i32* bcL; i32 bcV; };
|
union { u32* bcL; i32 bcV; };
|
||||||
} Env;
|
} Env;
|
||||||
|
|
||||||
void vm_pst(Env* s, Env* e);
|
void vm_pst(Env* s, Env* e);
|
||||||
@ -88,7 +88,7 @@ extern Env* envCurr;
|
|||||||
extern Env* envStart;
|
extern Env* envStart;
|
||||||
extern Env* envEnd;
|
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");
|
if (envCurr==envEnd) thrM("Stack overflow");
|
||||||
envCurr->sc = sc;
|
envCurr->sc = sc;
|
||||||
envCurr->bcL = bc;
|
envCurr->bcL = bc;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user