diff --git a/src/builtins/cells.c b/src/builtins/cells.c index df52779e..a9c22b3f 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -503,9 +503,9 @@ 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 || IA(x)==0) 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)))) { + if (cr==1 && csz<=64 && xe!=el_bit && csz < (128*8 >> arrTypeBitsLog(TY(x)))) { incG(x); // TODO proper shape moving Arr* r = customizeShape(select_rows_direct(x, csz, cam, reverse_inds_64+64-csz, csz, el_i8)); arr_shCopy(r, x); diff --git a/src/builtins/select.c b/src/builtins/select.c index 847ea4c8..7de512a7 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -559,9 +559,15 @@ B select_replace(u32 chr, B w, B x, B rep, usz wia, usz cam, usz csz) { // consu #undef FREE_CHECK } -static void* m_tyarrv_same(B* r, usz ia, B src) { // makes a new typed array with same element type as src, but new ia - u8 se = TI(src,elType); assert(se!=el_bit && se!=el_B); - return m_tyarrlv(r, arrTypeWidthLog(TY(src)), ia, arrNewType(TY(src))); +static void* m_arrv_same(B* r, usz ia, B src) { // makes a new array with same element type as src, but new ia + u8 se = TI(src,elType); assert(se!=el_bit); + if (se==el_B) { + HArr_p p = m_harr0v(ia); + *r = p.b; + return p.a; + } else { + return m_tyarrlv(r, arrTypeWidthLog(TY(src)), ia, arrNewType(TY(src))); + } } B slash_c2(B, B, B); @@ -596,8 +602,15 @@ B select_rows_direct(B x, ux csz, ux cam, void* inds, ux indn, u8 ie) { // ⥊ ( u8 xe = TI(x,elType); u8 lb = arrTypeWidthLog(TY(x)); - u8* xp = tyany_ptr(x); - if (xe==el_bit || xe==el_B) goto generic_any; + u8* xp; + if (xe==el_B) { + if (sizeof(B) != 8) goto generic_any; + xp = (u8*) arr_bptr(x); + if (xp == NULL) goto generic_any; + } else { + if (xe == el_bit) goto generic_any; + xp = tyany_ptr(x); + } B r; ux ria = indn * cam; @@ -608,7 +621,7 @@ B select_rows_direct(B x, ux csz, ux cam, void* inds, ux indn, u8 ie) { // ⥊ ( if (ie==el_bit) { if (csz>32 || indn>32 || indn>INDS_BUF_MAX) { // TODO properly tune - u8* rp = m_tyarrv_same(&r, ria, x); + u8* rp = m_arrv_same(&r, ria, x); for (ux i = 0; i < cam; i++) { bitselFns[lb](rp, inds, loadu_u64(xp), loadu_u64(xp + (1<