diff --git a/src/builtins/cells.c b/src/builtins/cells.c index 3ca54511..df52779e 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -503,7 +503,7 @@ B for_cells_c1(B f, u32 xr, u32 cr, u32 k, B x, u32 chr) { // F⎉cr x; array x, case n_reverse: { if (cr == 0) break; ux csz = xsh[k]; - if (csz <= 1) return x; + if (csz <= 1 || IA(x)==0) return x; u8 xe = TI(x,elType); if (cr==1 && csz<=64 && xe!=el_bit && xe!=el_B && csz < (128*8 >> arrTypeBitsLog(TY(x)))) { incG(x); // TODO proper shape moving diff --git a/src/builtins/select.c b/src/builtins/select.c index 7e236192..847ea4c8 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -580,7 +580,7 @@ B select_cells_base(B inds, B x0, ux csz, ux cam); #define INDS_BUF_MAX 64 // only need 32 bytes for AVX2 & 16 for NEON, but have more for past-the-end pointers and writes B select_rows_direct(B x, ux csz, ux cam, void* inds, ux indn, u8 ie) { // ⥊ (indn↑inds As ie)⊸⊏˘ cam‿csz⥊x - assert(csz!=0 && cam!=0); + assert(csz!=0 && cam!=0 && indn!=0); assert(csz*cam == IA(x)); assert(ie<=el_i32); @@ -767,6 +767,7 @@ B select_rows_B(B x, ux csz, ux cam, B inds) { // consumes inds,x; ⥊ inds⊸ } ux in = IA(inds); + if (in == 0) return taga(emptyArr(x, 1)); u8 ie = TI(inds,elType); if (csz<=2? ie!=el_bit : csz<128? ie>el_i8 : !elInt(ie)) { inds = num_squeeze(inds); diff --git a/test/cases/cells.bqn b/test/cases/cells.bqn index 5daf0472..668bbe1d 100644 --- a/test/cases/cells.bqn +++ b/test/cases/cells.bqn @@ -4,6 +4,7 @@ %DEF evar %USE tvar ⋄ _evar ← {ok←{⇐} ⋄ r←⥊𝕨 ok∘𝔽⎊{𝕊: •CurrentError@} _tvar 𝕩 ⋄ {⊑ok∊r? !"TEST FAIL: variation didn't error"; ("TEST FAIL: varying error messages"⊸⋈ ! 1=≠)⍷r ⋄ !⊑r}} %DEF eqerr %USE eqvar ⋄ _eqerr ← {ok←{⇐} ⋄ r←⥊𝕨 ok∘𝔽⎊{𝕊: •CurrentError@}⌜ 𝕩 ⋄ {⊑ok∊r? !"TEST FAIL: case didn't error"; ("TEST FAIL: varying error messages"⊸⋈ ! 1=≠)⍷r ⋄ !⊑r}} %DEF k _k ← {𝔽○•internal.Keep} +%DEF pk _pk ← {𝔽○•internal.PureKeep} 1‿2 1⎉0 1 %% 1‿1 1 1⎉0 1‿2 %% 1‿1 @@ -75,9 +76,9 @@ {∾˝˘ (2+↕𝕩)⥊<"hi"}¨ 2‿3‿4‿5 %% ⥊⟜(<"hi")¨ ⟨2‿3,2‿12,2‿12‿5,2‿12‿5‿6⟩ {∾˝⎉¯2 ⥊⟜(↕×´) 2+↕𝕩}¨ 3‿4‿5 %% ⥊⟜(↕×´)¨ ⟨2‿3‿4,2‿3‿20,2‿3‿20‿6⟩ -%DEF tcc %USE k ⋄ %USE var ⋄ _tcc_ ← { ! ∧´ (<𝕨 𝔽_k⎉𝕘⎊'e' 𝕩) ≡¨ (𝕨 𝔽⎉𝕘⎊'e'V⟜𝕩)¨ "i"LV𝕩} +%DEF tcc %USE pk ⋄ %USE var ⋄ _tcc_ ← { ! ∧´ (<𝕨 𝔽_pk⎉𝕘⎊'e' 𝕩) ≡¨ (𝕨 𝔽⎉𝕘⎊'e'V⟜𝕩)¨ "i"LV𝕩} %USE tcc ⋄ ⟨2, 20, ¯2, ¯20, 0⟩ {𝕨 ↑_tcc_ ¯1 𝕩 ⋄ 𝕨 ↓_tcc_ ¯1 𝕩}⌜ ⟨<4, ↕5, 4‿5⥊↕20, 4‿5‿6⥊↕120⟩ -%USE tcc ⋄ ⟨⌽, ⍉, ⊏, <, ≍, ⥊⟩ {𝕎 _tcc_ ¯1 𝕩 ⋄ 𝕎 _tcc_ 1 𝕩 ⋄ 𝕎 _tcc_ 2 𝕩}⌜ ⟨<4, ↕5, 4‿5⥊↕20, 4‿5‿6⥊↕120, 2‿3‿4‿5⥊↕120⟩ +%USE tcc ⋄ ⟨⌽, ⍉, ⊏, <, ≍, ⥊, (↕0)⊸⊏, (↕1)⊸⊏, (↕2)⊸⊏⟩ {𝕎 _tcc_ ¯1 𝕩 ⋄ 𝕎 _tcc_ 1 𝕩 ⋄ 𝕎 _tcc_ 2 𝕩}⌜ ⟨<4, ↕5, 4‿5⥊↕20, 4‿5‿6⥊↕120, 2‿3‿4‿5⥊↕120, 10‿0⥊0, 0‿10⥊0, 0‿2‿3⥊0, 2‿3‿4‿0⥊0⟩ %USE tcc ⋄ ⊏_tcc_ ¯1 4‿2⥊↕8 ⋄ 1⊏_tcc_ ¯1 4‿2⥊↕8 ⋄ ⊏_tcc_ ¯1 ↕4‿2 ⋄ 1⊏_tcc_ ¯1 ↕4‿2 %USE tcc ⋄ ⊑_tcc_ ¯1 4‿2⥊↕8 ⋄ 1⊑_tcc_ ¯1 4‿2⥊↕8 ⋄ ⊑_tcc_ ¯1 ↕4‿2 ⋄ 1⊑_tcc_ ¯1 ↕4‿2