From 89c19662d8faae13f21e60ff45c22fe7e10a32e5 Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 1 Oct 2021 18:52:03 +0300 Subject: [PATCH] argument remapping for PRED --- src/ns.c | 2 +- src/vm.c | 20 +++++++++++++++++++- src/vm.h | 5 ++--- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/ns.c b/src/ns.c index 71f3110e..cb922c05 100644 --- a/src/ns.c +++ b/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"); 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; diff --git a/src/vm.c b/src/vm.c index 5ce6bd3e..0d96951e 100644 --- a/src/vm.c +++ b/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"); 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]= 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 && cposU16_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 { diff --git a/src/vm.h b/src/vm.h index fff6f999..04067774 100644 --- a/src/vm.h +++ b/src/vm.h @@ -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);