summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordzaima <dzaimagit@gmail.com>2024-04-03 02:10:26 +0300
committerdzaima <dzaimagit@gmail.com>2024-04-03 05:59:35 +0300
commitd77018f2696fe013dad6158f324b293d421f334e (patch)
tree60baa38d6f3128c1ca66e7b1e8fb33fc1ac97842
parentaf0a40c73246ecda266e47ad9bb031515f888ff3 (diff)
fix ⟨⟩⍷1‿0⥊0
-rw-r--r--src/builtins/fns.c39
-rw-r--r--test/cases/prims.bqn5
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⟩