diff options
author | dzaima <dzaimagit@gmail.com> | 2024-04-03 02:10:26 +0300 |
---|---|---|
committer | dzaima <dzaimagit@gmail.com> | 2024-04-03 05:59:35 +0300 |
commit | d77018f2696fe013dad6158f324b293d421f334e (patch) | |
tree | 60baa38d6f3128c1ca66e7b1e8fb33fc1ac97842 | |
parent | af0a40c73246ecda266e47ad9bb031515f888ff3 (diff) |
fix ⟨⟩⍷1‿0⥊0
-rw-r--r-- | src/builtins/fns.c | 39 | ||||
-rw-r--r-- | test/cases/prims.bqn | 5 |
2 files changed, 37 insertions, 7 deletions
diff --git a/src/builtins/fns.c b/src/builtins/fns.c index 839b9a2a..ca484b63 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -281,15 +281,40 @@ B find_c2(B t, B w, B x) { if (IA(x)==0) { emptyres:; - Arr* ra = allZeroes(0); - usz* rsh = arr_shAlloc(ra, xr); - if (rsh) { + usz ia = 0; + ShArr* sh = NULL; + if (xr > 1) { + sh = m_shArr(xr); + usz* rsh = sh->a; usz* wsh=SH(w); usz* xsh=SH(x); - shcpy(rsh, xsh, xr-wr); - xsh+=xr-wr; rsh+=xr-wr; - PLAINLOOP for (ux i = 0; i < wr; i++) rsh[i] = wsh[i]>xsh[i]? 0 : xsh[i]-wsh[i]+1; + + ia = 1; + PLAINLOOP for (ux i = 0; i < xr-wr; i++) { + usz c = xsh[i]; + rsh[i] = c; + if (mulOn(ia, c)) { + shapeBig:; + mm_free((Value*)sh); + thrOOM(); + } + shcpy(rsh, xsh, xr-wr); + } + + xsh+= xr-wr; + rsh+= xr-wr; + PLAINLOOP for (ux i = 0; i < wr; i++) { + usz c; + if (wsh[i] > xsh[i]) { + c = 0; + ia = 0; + } else { + c = xsh[i]+1u-wsh[i]; + if (c==0 || mulOn(ia, c)) goto shapeBig; + } + rsh[i] = c; + } } - r = taga(ra); + r = taga(arr_shSetUO(allOnes(ia), xr, sh)); goto dec_ret; } diff --git a/test/cases/prims.bqn b/test/cases/prims.bqn index fd28f8e8..abfde1b7 100644 --- a/test/cases/prims.bqn +++ b/test/cases/prims.bqn @@ -289,6 +289,11 @@ w←1‿1⥊1 ⋄ x←2⥊1 ⋄ w‿x <¨↩ ⋄ {! (∾⟨•Repr𝕩,": Expe %USE eqvar ⋄ 0‿1 ⍷_eqvar ↕0 %% ⟨⟩ %USE eqvar ⋄ (↕0) ⍷_eqvar 1‿0 %% 1‿1‿1 %USE eqvar ⋄ "ab" ⍷_eqvar 0‿5⥊"ab" %% 0‿4⥊0 +(0⥊0)⍷1‿0⥊0 %% 1‿1⥊1 +⟨⟩⍷1‿0⥊"" %% 1‿1⥊1 +(0‿0‿0‿0‿0‿0⥊0)⍷1‿0‿0‿0‿0‿0‿0⥊0 %% 1‿1‿1‿1‿1‿1‿1⥊1 +(0‿0‿0‿0‿0‿0⥊0)⍷3‿0‿0‿0‿3‿4‿0⥊0 %% 3‿1‿1‿1‿4‿5‿1⥊1 +!"Out of memory" % (0‿0‿0‿0‿0‿0⥊0)⍷1e9‿0‿0‿1e9‿1e9‿0‿0⥊0 'a'‿1 ⍷ 0‿5⥊⟨⟩ %% 0‿4⥊0 "abc" ⍷ 5‿1⥊'a' %% 5‿0⥊0 ⟨(<"ab")⍷<"aa", (<"ab")⍷<"ab"⟩ %% ⟨<0,<1⟩ |