argument remapping for PRED

This commit is contained in:
dzaima 2021-10-01 18:52:03 +03:00
parent dac6f29a41
commit 89c19662d8
3 changed files with 22 additions and 5 deletions

View File

@ -9,7 +9,7 @@ void m_nsDesc(Body* body, bool imm, u8 ty, B nameList, B varIDs, B exported) { /
if (ia!=a(exported)->ia) thrM("Bad namespace description information");
i32 off = (ty==0?0:ty==1?2:3) + (imm?0:3);
i32 vam = ia+off;
if (vam != body->varAm) thrM("Bad namespace description information");
// if (vam != body->varAm) thrM("Bad namespace description information"); // arg remapping makes body->varAm unrelated to named variable count
NSDesc* r = mm_alloc(fsizeof(NSDesc, expIDs, i32, vam), t_nsDesc);
r->nameList = nameList;

View File

@ -167,6 +167,8 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
usz ty = o2s(GetU(block,0)); if (ty>2) thrM("VM compiler: Bad type");
bool imm = o2b(GetU(block,1));
B bodyObj = GetU(block,2);
i32 argAm = argCount(ty, imm);
i32* bodyI;
i32 bodyAm1, bodyAm2, bodyILen;
if (isArr(bodyObj)) {
@ -266,6 +268,21 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
}
i32 bcStart = TSSIZE(newBC);
u32* c = bc+idx;
bool remapArgs = false;
bool argUsed[6] = {0,0,0,0,0,0};
while (true) {
if (*c==PRED) remapArgs = true;
if (*c==VARO | *c==VARM | *c==VARU) if (c[1]==0 && c[2]<argAm) argUsed[c[2]]++;
if (*c==RETN | *c==RETD) break;
c = nextBC(c);
}
if (remapArgs) for (i32 i = 0; i < 6; i++) if (argUsed[i]) {
TSADDA(newBC, ((u32[]){ VARO,0,i, VARM,0,vam+i, SETN, POPS }), 8);
TSADDA(mapBC, ((u32[]){ 0,0,0, 0,0,0, 0 , 0 }), 8);
}
c = bc+idx;
while (true) {
u32* n = nextBC(c);
if (n-bc-1 >= bcIA) thrM("VM compiler: No RETN/RETD found before end of bytecode");
@ -310,6 +327,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
ins = ins==VARO? EXTO : ins==VARM? EXTM : EXTO;
}
}
if (remapArgs && cpos<argAm) cpos+= vam;
TSADD(newBC, ins);
TSADD(newBC, cdepth);
TSADD(newBC, cpos);
@ -339,7 +357,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B allBl
if (mpsc>U16_MAX) thrM("VM compiler: Block too deep");
Body* body = m_body(vam, bcStart, hM, mpsc);
Body* body = m_body(vam+(remapArgs? argAm : 0), bcStart, hM, mpsc);
if (boIA>2) {
m_nsDesc(body, imm, ty, inc(nameList), GetU(bodyRepr,2), GetU(bodyRepr,3));
} else {

View File

@ -222,9 +222,8 @@ FORCE_INLINE void scope_dec(Scope* sc) { // version of ptr_dec for scopes, that
}
ptr_dec(sc);
}
FORCE_INLINE i32 blockGivenVars(Block* bl) {
return (bl->imm?0:3) + bl->ty + (bl->ty>0);
}
FORCE_INLINE i32 argCount(u8 ty, bool imm) { return (imm?0:3) + ty + (ty>0); }
FORCE_INLINE i32 blockGivenVars(Block* bl) { return argCount(bl->ty, bl->imm); }
void vm_pst(Env* s, Env* e);
void vm_pstLive(void);
void vm_printPos(Comp* comp, i32 bcPos, i64 pos);