From c17280d96df6f00779c53b875a71b3bc9fc7d34f Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 13 May 2025 06:22:02 +0300 Subject: [PATCH] cleanup --- src/builtins/inverse.c | 2 +- src/builtins/slash.c | 25 ++++++++++++++----------- src/builtins/squeeze.c | 4 +++- test/cases/prims.bqn | 10 ++++++++-- 4 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/builtins/inverse.c b/src/builtins/inverse.c index 0ffb0712..7f14169d 100644 --- a/src/builtins/inverse.c +++ b/src/builtins/inverse.c @@ -42,4 +42,4 @@ B nativeInvSwap_c1(B t, B x) { void inverse_init(void) { fn_invRegDesc = registerNFn(m_c8vec_0("(fn_invReg)"), fn_invReg_c1, fn_invReg_c2); fn_invSwapDesc = registerNFn(m_c8vec_0("(fn_invSwap)"), fn_invSwap_c1, fn_invSwap_c2); -} \ No newline at end of file +} diff --git a/src/builtins/slash.c b/src/builtins/slash.c index cebb7b33..5f9b6ef3 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -625,8 +625,14 @@ B slash_c1(B t, B x) { B slash_c2(B t, B w, B x) { i32 wv = -1; usz wia ONLY_GCC(=0); + u8 we ONLY_GCC(=0); + if (isArr(w)) { - if (depth(w)>1) goto base; + we = TI(w,elType); + if (!elInt(we)) { + w = squeeze_numTry(w, &we); + if (!elNum(we)) goto base; + } ur wr = RNK(w); if (wr>1) thrF("𝕨/𝕩: Simple 𝕨 must have rank 0 or 1 (%i≑=𝕨)", wr); if (wr<1) { w = TO_GET(w, 0); goto atom; } @@ -638,6 +644,7 @@ B slash_c2(B t, B w, B x) { wv = o2iG(w); if (wv < 0) thrM("𝕨/𝕩: 𝕨 cannot be negative"); } + if (isAtm(x) || RNK(x)==0) thrM("𝕨/𝕩: 𝕩 must have rank at least 1 for simple 𝕨"); ur xr = RNK(x); usz xlen = *SH(x); @@ -649,19 +656,15 @@ B slash_c2(B t, B w, B x) { if (RARE(wia!=xlen)) thrF("𝕨/𝕩: Lengths of components of 𝕨 must match 𝕩 (%s β‰  %s)", wia, xlen); u64 s; - u8 we = TI(w,elType); - if (!elInt(we)) { - w=squeeze_any(w); we=TI(w,elType); // TODO move squeeze to before depth(w) - if (!elInt(we)) { - s = usum(w); - goto arrW_base; - } - } if (we==el_bit) { wbool: r = compress(w, x, wia, xl, xt); goto decWX_ret; } + if (!elInt(we)) { + s = usum(w); + goto arrW_base; + } s = usum(w); if (xl>6 || (xl<3 && xl!=0)) goto arrW_base; if (s<=wia) { @@ -844,7 +847,7 @@ static B finish_small_count(B r, u16* ov) { if (*ov == e) { r = squeeze_numNew(r); } else { - r = taga(cpyI32Arr(r)); i32* rp = tyany_ptr(r); + r = taga(cpyI32Arr(r)); i32* rp = i32arr_ptr(r); usz on = 0; u16 ovi; for (usz i=0; (ovi=ov[i])!=e; i++) { i32 rv = (rp[ovi]+= 1<<15); @@ -854,7 +857,7 @@ static B finish_small_count(B r, u16* ov) { } } if (RARE(on > 0)) { // Overflowed i32! - r = taga(cpyF64Arr(r)); f64* rp = tyany_ptr(r); + r = taga(cpyF64Arr(r)); f64* rp = f64arr_ptr(r); for (usz i=0; ix1e? x0e : x1e; if (xe == re) goto squeezed; + u8 flags = FLV_GET(xa) | fl_squoze; Arr* ra; switch (re) { default: UD; case el_i16: ra = cpyI16Arr(x); break; case el_i8: ra = cpyI8Arr (x); break; case el_bit: ra = cpyBitArr(x); break; } - return taga(FLV_SET(ra, fl_squoze)); + debug_assert(!FLV_HAS(ra, fl_asc|fl_dsc)); // if cpy*Arr starts preserving flags, this should be changed to not do so itself + return taga(FLV_SET(ra, flags)); } diff --git a/test/cases/prims.bqn b/test/cases/prims.bqn index f5d7159a..a6d2ec2f 100644 --- a/test/cases/prims.bqn +++ b/test/cases/prims.bqn @@ -89,8 +89,9 @@ w←1β€Ώ1β₯Š1 β‹„ x←2β₯Š1 β‹„ wβ€Ώx <¨↩ β‹„ {! (∾⟨"𝕨",β€’Repr𝕩, 2β€Ώ3β€Ώ0β€Ώ1/↕4 %% 6β₯Š0β€Ώ0β€Ώ1β€Ώ1β€Ώ1β€Ώ3 2β€Ώ3β€Ώ0β€Ώ1/β†•β‹ˆ4 %% β‹ˆΒ¨6β₯Š0β€Ώ0β€Ώ1β€Ώ1β€Ώ1β€Ώ3 ""/↕3 %% ↕3 -!"Expected non-negative integer, got character" % "abc"/↕3 -!"Expected non-negative integer, got character" % "ab"/2β€Ώ2β₯Š9 +!"𝕨/𝕩: Length of compound 𝕨 must be at most rank of 𝕩" % "abc"/↕3 +!"𝕨/𝕩: Length of compound 𝕨 must be at most rank of 𝕩" % 1β€Ώ'a'/↕2 +!"𝕨/𝕩: 𝕨 must consist of natural numbers" % "ab"/2β€Ώ2β₯Š9 !"Expected non-negative integer, got Β―3" % 2β€ΏΒ―3/↕2 !"Expected non-negative integer, got Β―3e20" % 2β€ΏΒ―3e20/↕2 !"𝕨/𝕩: Lengths of components of 𝕨 must match 𝕩 (3 β‰  4)" % 1β€Ώ2β€Ώ3/4β€Ώ5β€Ώ6β€Ώ7 @@ -110,6 +111,11 @@ w←1β€Ώ1β₯Š1 β‹„ x←2β₯Š1 β‹„ wβ€Ώx <¨↩ β‹„ {! (∾⟨"𝕨",β€’Repr𝕩, !"𝕨/𝕩: Compound 𝕨 must have rank at most 1" % (1β€Ώ2β₯Š<↕4) / ↕4 !"𝕨/𝕩: 𝕨 must consist of natural numbers" % βŸ¨β†•4, 1β€Ώ2β€Ώ3.5β€Ώ4⟩ / 4β€Ώ4β₯Šβ†•16 !"𝕨/𝕩: 𝕨 must consist of natural numbers" % βŸ¨β†•4, 3.5⟩ / 4β€Ώ4β₯Šβ†•16 +!"𝕨/𝕩: 𝕨 must consist of natural numbers" % (<@)/↕3 +!"𝕨/𝕩: 𝕨 must consist of natural numbers" % (<{+})/↕3 +!"𝕨/𝕩: 𝕨 cannot be negative" % (<Β―2)/↕3 +!"𝕨/𝕩: Lengths of components of 𝕨 must match 𝕩 (1 β‰  3)" % ⟨¯2⟩/↕3 +!"Expected non-negative integer, got Β―2" % ⟨¯2⟩/↕1 !"Integer out of range: 4.611686018427388e18" % ⟨1,2⋆62⟩ / 2β€Ώ2β₯Š<β‹ˆ0 %USZ32 !"Integer out of range: 4.611686018427388e18" % ⟨1,2⋆62⟩ / 2β₯Š<β‹ˆ0 %USZ32 !"Out of memory" % ⟨1,2⋆62⟩ / 2β€Ώ2β₯Š<β‹ˆ0 %USZ64