From d27dc57bed4e2a2ceab6eb9ca5f9bdd386ce6099 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 19 Jun 2021 21:16:23 +0300 Subject: [PATCH] CHKV --- src/core/gstack.h | 3 +++ src/jit/nvm.c | 15 ++++++++++----- src/vm.c | 6 +++++- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/core/gstack.h b/src/core/gstack.h index a9676ccb..b5e84d88 100644 --- a/src/core/gstack.h +++ b/src/core/gstack.h @@ -40,3 +40,6 @@ static inline void gsAdd(B x) { static inline B gsPop() { return *--gStack; } +static inline B gsGet(i32 p) { // p>0; 1 is the top item, etc + return gStack[-p]; +} diff --git a/src/jit/nvm.c b/src/jit/nvm.c index e7d78730..e4a9a73b 100644 --- a/src/jit/nvm.c +++ b/src/jit/nvm.c @@ -128,7 +128,7 @@ INS B i_TR3O(B f GA1) { P(g)P(h) B r; } INS B i_LOCO(u32 d, u32 p, Scope** pscs, u32* bc GA1) { B l = pscs[d]->vars[p]; - if(l.u==bi_noVar.u) { POS_UPD; thrM("Reading variable before its defined"); } // TODO probably should GS_UPD (also EXTO) + if(l.u==bi_noVar.u) { POS_UPD; GS_UPD; thrM("Reading variable before its defined"); } return inc(l); } INS B i_LOCU(u32 d, u32 p, Scope** pscs) { @@ -139,7 +139,7 @@ INS B i_LOCU(u32 d, u32 p, Scope** pscs) { } INS B i_EXTO(u32 d, u32 p, Scope** pscs, u32* bc GA1) { 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; GS_UPD; thrM("Reading variable before its defined"); } return inc(l); } INS B i_EXTU(u32 d, u32 p, Scope** pscs) { @@ -176,6 +176,10 @@ INS B i_NSPM(B o, u32 l) { c(FldAlias,a)->p = l; return a; } +INS B i_CHKV(B x, u32* bc GA1) { + if(isNothing(x)) { POS_UPD; GS_UPD; thrM("Reading variable before its defined"); } + return x; +} INS B i_RETD(Scope** pscs GA1) { GS_UPD; Scope* sc = pscs[0]; Body* b = sc->body; @@ -491,11 +495,12 @@ Nvm_res m_nvm(Body* body) { case SETN: TOPp; ASM(MOV,REG_ARG1,r_PSCS); IMM(REG_ARG2,off); INV(3,0,i_SETN); break; // (B, Scope** pscs, u32* bc, S) case SETU: TOPp; ASM(MOV,REG_ARG1,r_PSCS); IMM(REG_ARG2,off); INV(3,0,i_SETU); break; // (B, Scope** pscs, u32* bc, S) case SETM: TOPp; ASM(MOV,REG_ARG1,r_PSCS); IMM(REG_ARG2,off); INV(3,0,i_SETM); break; // (B, Scope** pscs, u32* bc, S) - case SETNi:TOPp; { u64 d=*bc++; u64 p=*bc++; ASM(MOV,REG_ARG1,r_PSCS); IMM(REG_ARG2,d); IMM(REG_ARG3,p); IMM(REG_ARG4,off); INV(5,0,i_SETNi); break; } // (B, Scope** pscs. u32 d. u32 p, u32* bc, S) - case SETUi:TOPp; { u64 d=*bc++; u64 p=*bc++; ASM(MOV,REG_ARG1,r_PSCS); IMM(REG_ARG2,d); IMM(REG_ARG3,p); IMM(REG_ARG4,off); INV(5,0,i_SETUi); break; } // (B, Scope** pscs. u32 d. u32 p, u32* bc, S) - case SETMi:TOPp; { u64 d=*bc++; u64 p=*bc++; ASM(MOV,REG_ARG1,r_PSCS); IMM(REG_ARG2,d); IMM(REG_ARG3,p); IMM(REG_ARG4,off); INV(5,0,i_SETMi); break; } // (B, Scope** pscs. u32 d. u32 p, u32* bc, S) + case SETNi:TOPp; { u64 d=*bc++; u64 p=*bc++; ASM(MOV,REG_ARG1,r_PSCS); IMM(REG_ARG2,d); IMM(REG_ARG3,p); IMM(REG_ARG4,off); INV(5,0,i_SETNi); break; } // (B, Scope** pscs, u32 d, u32 p, u32* bc, S) + case SETUi:TOPp; { u64 d=*bc++; u64 p=*bc++; ASM(MOV,REG_ARG1,r_PSCS); IMM(REG_ARG2,d); IMM(REG_ARG3,p); IMM(REG_ARG4,off); INV(5,0,i_SETUi); break; } // (B, Scope** pscs, u32 d, u32 p, u32* bc, S) + case SETMi:TOPp; { u64 d=*bc++; u64 p=*bc++; ASM(MOV,REG_ARG1,r_PSCS); IMM(REG_ARG2,d); IMM(REG_ARG3,p); IMM(REG_ARG4,off); INV(5,0,i_SETMi); break; } // (B, Scope** pscs, u32 d, u32 p, u32* bc, S) case FLDO: TOPp; IMM(REG_ARG1,*bc++); ASM(MOV,REG_ARG2,r_PSCS); INV(3,0,i_FLDO); break; // (B, u32 p, Scope** pscs, S) case NSPM: TOPp; IMM(REG_ARG1,*bc++); CCALL(i_NSPM); break; // (B, u32 l, S) + case CHKV: TOPp; IMM(REG_ARG1,off); INV(2,0,i_CHKV); break; // (B, u32* bc, S) case RETD: ASM(MOV,REG_ARG0,r_PSCS); INV(1,1,i_RETD); ret=true; break; // (Scope** pscs, S); stack diff 0 is wrong, but updating it is useless case RETN: IMM(r_TMP, &gStack); ASM(MOV_MR0, r_TMP, r_CS); ret=true; break; default: thrF("JIT: Unsupported bytecode %i", *s); diff --git a/src/vm.c b/src/vm.c index 0f23cbc3..d0462084 100644 --- a/src/vm.c +++ b/src/vm.c @@ -534,7 +534,11 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume break; } case RETN: goto end; - // not implemented: VARO VARM CHKV VFYM SETH FLDO FLDM NSPM SYSV + case CHKV: { + if (isNothing(gsGet(1))) { GS_UPD; POS_UPD; thrM("Unexpected Nothing (ยท)"); } + break; + } + // not implemented: VARO VARM VFYM SETH FLDM SYSV default: #ifdef DEBUG printf("todo %d\n", bc[-1]); bc++; break;