From e8caed529cb676f9041df4c07e8fad091550f27c Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 22 May 2023 00:08:20 +0300 Subject: [PATCH] fix JIT SETUi/SETMi/SETCi missing unset variable checks --- src/jit/nvm_x86_64.c | 6 +++--- test/cases/syntax.bqn | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/jit/nvm_x86_64.c b/src/jit/nvm_x86_64.c index 09ae4d08..1c9b321c 100644 --- a/src/jit/nvm_x86_64.c +++ b/src/jit/nvm_x86_64.c @@ -216,9 +216,9 @@ INS B i_PRED2(B x, Scope* sc, u32* bc, Body* v1, Body* v2) { POS_UPD; return gotoNextBodyJIT(sc, q_N(sc->vars[2])? v1 : v2); } INS B i_SETNi( B x, Scope* sc, u32 p ) { v_setI(sc, p, inc(x), false, false); return x; } -INS B i_SETUi( B x, Scope* sc, u32 p, u32* bc) { POS_UPD; v_setI(sc, p, inc(x), true, false); return x; } -INS B i_SETMi(B f, B x, Scope* sc, u32 p, u32* bc) { POS_UPD; B r = c2(f,v_getI(sc, p, false),x); dec(f); v_setI(sc, p, inc(r), true, false); return r; } -INS B i_SETCi(B f, Scope* sc, u32 p, u32* bc) { POS_UPD; B r = c1(f,v_getI(sc, p, false) ); dec(f); v_setI(sc, p, inc(r), true, false); return r; } +INS B i_SETUi( B x, Scope* sc, u32 p, u32* bc) { POS_UPD; v_setI(sc, p, inc(x), true, true); return x; } +INS B i_SETMi(B f, B x, Scope* sc, u32 p, u32* bc) { POS_UPD; B r = c2(f,v_getI(sc, p, true),x); dec(f); v_setI(sc, p, inc(r), true, false); return r; } +INS B i_SETCi(B f, Scope* sc, u32 p, u32* bc) { POS_UPD; B r = c1(f,v_getI(sc, p, true) ); dec(f); v_setI(sc, p, inc(r), true, false); return r; } INS void i_SETNv(B x, Scope* sc, u32 p ) { v_setI(sc, p, x, false, false); } INS void i_SETUv(B x, Scope* sc, u32 p, u32* bc) { POS_UPD; v_setI(sc, p, x, true, false); } INS void i_SETMv(B f, B x, Scope* sc, u32 p, u32* bc) { POS_UPD; B r = c2(f,v_getI(sc, p, false),x); dec(f); v_setI(sc, p, r, true, false); } diff --git a/test/cases/syntax.bqn b/test/cases/syntax.bqn index 0bbac538..d76cadbd 100644 --- a/test/cases/syntax.bqn +++ b/test/cases/syntax.bqn @@ -40,6 +40,10 @@ a←"zero"‿"one" ⋄ !a≡a⊸{𝕩?1⊑𝕨;0⊑𝕨}¨0‿1 !"Assignment: Mismatched shape for spread assignment" % ⟨⟩←⟨1⟩ ⟨⟩←⟨⟩ %% ⟨⟩ +# mid-update assignment; precise behavior here isn't particularly important, but it should at least be consistent +a←↕2 ⋄ a {𝕊: a←"foo" ⋄ {𝕊:a!↩0}⎊•CurrentError @}↩ ⋄ %% "foo" +!"Reading variable that was optimized out by F↩ after error" % a←"foo" ⋄ ! "foo"≡{𝕊:a!↩@}⎊•CurrentError @ ⋄ •Type a + # namespaces ⟨a,b⟩←•BQN"{x⇐1‿2⋄a⇐3‿4⋄y←5‿6⋄b⇐7‿8}" ⋄ a‿b %% ⟨3‿4 ⋄ 7‿8⟩