From f36eddb01cb89baaa5437dcf7d38b9426f5d11ed Mon Sep 17 00:00:00 2001 From: dzaima Date: Fri, 30 Apr 2021 00:55:28 +0300 Subject: [PATCH] =?UTF-8?q?fix=20=E2=9F=A8a=E2=80=BFb=E2=9F=A9=E2=86=90?= =?UTF-8?q?=E2=9F=A81=E2=80=BF2=E2=9F=A9=20and=20=E2=9F=A83=E2=80=BF0,2?= =?UTF-8?q?=E2=80=BF1=E2=80=BF2=E2=9F=A9=E2=8A=8F6=E2=80=BF5=E2=A5=8A?= =?UTF-8?q?=E2=86=9530?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/harr.c | 1 + src/mut.c | 1 + src/sfns.c | 1 + src/vm.c | 15 ++++++--------- test.bqn | 16 ++++++++++------ 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/harr.c b/src/harr.c index ffaec14b..6524c620 100644 --- a/src/harr.c +++ b/src/harr.c @@ -133,6 +133,7 @@ bool harr_canStore(B x) { return true; } NOINLINE void harr_pfree(B x, usz am) { // am - item after last written + assert(v(x)->type==t_harr); B* p = harr_ptr(x); for (usz i = 0; i < am; i++) dec(p[i]); mm_free(v(x)); diff --git a/src/mut.c b/src/mut.c index ee67e650..f1988245 100644 --- a/src/mut.c +++ b/src/mut.c @@ -54,6 +54,7 @@ u8 el_or(u8 a, u8 b) { void mut_pfree(Mut* m, usz n) { // free the first n elements if (m->type==el_B) harr_pfree(tag(m->val,ARR_TAG), n); + else mm_free((Value*) m->val); } // expects x to be an array, each position must be written to precisely once diff --git a/src/sfns.c b/src/sfns.c index d388e01b..ffbf7c2f 100644 --- a/src/sfns.c +++ b/src/sfns.c @@ -286,6 +286,7 @@ B select_c2(B t, B w, B x) { return withFill(rb,xf); } base: + dec(xf); return c2(rt_select, w, x); } diff --git a/src/vm.c b/src/vm.c index 874b6195..5f5c7e6d 100644 --- a/src/vm.c +++ b/src/vm.c @@ -205,7 +205,7 @@ Block* compile(B bcq, B objs, B blocksq) { // consumes all return ret; } -void v_set(Scope* pscs[], B s, B x, bool upd) { // frees s, doesn't consume x +void v_set(Scope* pscs[], B s, B x, bool upd) { // doesn't consume if (isVar(s)) { Scope* sc = pscs[(u16)(s.u>>32)]; B prev = sc->vars[(u32)s.u]; @@ -218,14 +218,11 @@ void v_set(Scope* pscs[], B s, B x, bool upd) { // frees s, doesn't consume x sc->vars[(u32)s.u] = inc(x); } else { VT(s, t_harr); - if (!eqShape(s, x)) thrM("Assignment: Mismatched shape for spread assignment"); + if (!isArr(x) || !eqShape(s, x)) thrM("Assignment: Mismatched shape for spread assignment"); usz ia = a(x)->ia; B* sp = harr_ptr(s); BS2B xgetU = TI(x).getU; - for (u64 i = 0; i < ia; i++) { - v_set(pscs, sp[i], xgetU(x,i), upd); - } - dec(s); + for (u64 i = 0; i < ia; i++) v_set(pscs, sp[i], xgetU(x,i), upd); } } B v_get(Scope* pscs[], B s) { // get value representing s, replacing with bi_optOut; doesn't consume @@ -372,12 +369,12 @@ B evalBC(Body* b, Scope* sc) { // doesn't consume vars[p] = bi_optOut; break; } - case SETN: { P(s) P(x) v_set(pscs, s, x, false); ADD(x); break; } - case SETU: { P(s) P(x) v_set(pscs, s, x, true ); ADD(x); break; } + case SETN: { P(s) P(x) v_set(pscs, s, x, false); dec(s); ADD(x); break; } + case SETU: { P(s) P(x) v_set(pscs, s, x, true ); dec(s); ADD(x); break; } case SETM: { P(s)P(f)P(x) B w = v_get(pscs, s); B r = c2(f,w,x); dec(f); - v_set(pscs, s, r, true); + v_set(pscs, s, r, true); dec(s); ADD(r); break; } diff --git a/test.bqn b/test.bqn index b205baab..304f12d1 100755 --- a/test.bqn +++ b/test.bqn @@ -1,5 +1,5 @@ #! /usr/bin/env dbqn -"Usage: ./test.bqn path/to/mlochbaum/BQN [-sme] name | ./BQN"!2≤≠•args +"Usage: ./test.bqn path/to/mlochbaum/BQN [-qsmev] name | ./BQN"!2≤≠•args path←⊑•args args←1↓•args opt←"" @@ -10,11 +10,15 @@ case←⊑args case∾↩".bqn" tests ← •FLines path∾"/test/cases/"∾case tests/˜↩ (('#'≢⊑)∧0<≠)¨tests -{𝕊: tests/˜↩{"! %"≢3↑𝕩}¨tests}⍟⊑ 's'∊opt -{𝕊: tests/˜↩{"! %"≡3↑𝕩}¨tests}⍟⊑ 'e'∊opt -Out ← {•Out'%'⊸∊◶⊢‿{𝕩↓˜1+⊑𝕩⊐'%'}𝕩} +{𝕊: tests/˜↩'!'≠⊑¨tests}⍟⊑ 's'∊opt +{𝕊: tests/˜↩'!'=⊑¨tests}⍟⊑ 'e'∊opt +Q ← { + i←⊑𝕩⊐'%' + (('!'≠⊑𝕩)∧⊑'v'∊opt)◶⟨(1+i)⊸↓ ⋄ {∾⟨"(" ⋄ i↑𝕩 ⋄ ") ≡ {" ⋄ (⊐⟜'#'⊑⊸↑⊢) (1+i)↓𝕩 ⋄ " }"⟩}⟩ 𝕩 +} +Out ← {•Out'%'⊸∊◶⊢‿Q𝕩} ((⊑'m'∊opt)⊑Out‿{•Show𝕩⋄Out𝕩})¨tests # ('%'⊸∊∨ '#'= ·⊑ ∾⟜"#")◶•Out‿@¨tests -•Out """finished""" -•Out "" \ No newline at end of file +•Out⍟(¬⊑'q'∊opt) """finished""" +•Out⍟(¬⊑'q'∊opt) "" \ No newline at end of file