argument remapping for PRED
This commit is contained in:
parent
dac6f29a41
commit
89c19662d8
2
src/ns.c
2
src/ns.c
@ -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");
|
if (ia!=a(exported)->ia) thrM("Bad namespace description information");
|
||||||
i32 off = (ty==0?0:ty==1?2:3) + (imm?0:3);
|
i32 off = (ty==0?0:ty==1?2:3) + (imm?0:3);
|
||||||
i32 vam = ia+off;
|
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);
|
NSDesc* r = mm_alloc(fsizeof(NSDesc, expIDs, i32, vam), t_nsDesc);
|
||||||
r->nameList = nameList;
|
r->nameList = nameList;
|
||||||
|
|||||||
20
src/vm.c
20
src/vm.c
@ -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");
|
usz ty = o2s(GetU(block,0)); if (ty>2) thrM("VM compiler: Bad type");
|
||||||
bool imm = o2b(GetU(block,1));
|
bool imm = o2b(GetU(block,1));
|
||||||
B bodyObj = GetU(block,2);
|
B bodyObj = GetU(block,2);
|
||||||
|
i32 argAm = argCount(ty, imm);
|
||||||
|
|
||||||
i32* bodyI;
|
i32* bodyI;
|
||||||
i32 bodyAm1, bodyAm2, bodyILen;
|
i32 bodyAm1, bodyAm2, bodyILen;
|
||||||
if (isArr(bodyObj)) {
|
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);
|
i32 bcStart = TSSIZE(newBC);
|
||||||
u32* c = bc+idx;
|
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) {
|
while (true) {
|
||||||
u32* n = nextBC(c);
|
u32* n = nextBC(c);
|
||||||
if (n-bc-1 >= bcIA) thrM("VM compiler: No RETN/RETD found before end of bytecode");
|
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;
|
ins = ins==VARO? EXTO : ins==VARM? EXTM : EXTO;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (remapArgs && cpos<argAm) cpos+= vam;
|
||||||
TSADD(newBC, ins);
|
TSADD(newBC, ins);
|
||||||
TSADD(newBC, cdepth);
|
TSADD(newBC, cdepth);
|
||||||
TSADD(newBC, cpos);
|
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");
|
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) {
|
if (boIA>2) {
|
||||||
m_nsDesc(body, imm, ty, inc(nameList), GetU(bodyRepr,2), GetU(bodyRepr,3));
|
m_nsDesc(body, imm, ty, inc(nameList), GetU(bodyRepr,2), GetU(bodyRepr,3));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
5
src/vm.h
5
src/vm.h
@ -222,9 +222,8 @@ FORCE_INLINE void scope_dec(Scope* sc) { // version of ptr_dec for scopes, that
|
|||||||
}
|
}
|
||||||
ptr_dec(sc);
|
ptr_dec(sc);
|
||||||
}
|
}
|
||||||
FORCE_INLINE i32 blockGivenVars(Block* bl) {
|
FORCE_INLINE i32 argCount(u8 ty, bool imm) { return (imm?0:3) + ty + (ty>0); }
|
||||||
return (bl->imm?0:3) + bl->ty + (bl->ty>0);
|
FORCE_INLINE i32 blockGivenVars(Block* bl) { return argCount(bl->ty, bl->imm); }
|
||||||
}
|
|
||||||
void vm_pst(Env* s, Env* e);
|
void vm_pst(Env* s, Env* e);
|
||||||
void vm_pstLive(void);
|
void vm_pstLive(void);
|
||||||
void vm_printPos(Comp* comp, i32 bcPos, i64 pos);
|
void vm_printPos(Comp* comp, i32 bcPos, i64 pos);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user