diff --git a/src/builtins/internal.c b/src/builtins/internal.c index 39447f5e..b073b5a4 100644 --- a/src/builtins/internal.c +++ b/src/builtins/internal.c @@ -115,7 +115,7 @@ B listVariations_c2(B t, B w, B x) { ac8=false, ac16=false, ac32=false, abit=false; usz xia = IA(x); SGetU(x) - if (isNum(xf)) { + if (numFill(xf)) { i32 min=I32_MAX, max=I32_MIN; if (xe==el_i8 ) { i8* xp = i8any_ptr (x); for (usz i = 0; i < xia; i++) { if (xp[i]>max) max=xp[i]; if (xp[i]max) max=xp[i]; if (xp[i]=0 && max<=1; onlyF64: af64 = true; - } else if (isC32(xf)) { + } else if (chrFill(xf)) { u32 max = 0; if (xe!=el_c8) for (usz i = 0; i < xia; i++) { B c = GetU(x, i); diff --git a/src/builtins/select.c b/src/builtins/select.c index 09f01f15..cd41a664 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -152,7 +152,7 @@ static NOINLINE B select_list_cell(usz wi, B x) { // guarantees returning new ar B xf = getFillR(x); B xv = IGet(x, wi); B rb; - if (isNum(xf) || isC32(xf)) { + if (numFill(xf) || chrFill(xf)) { rb = m_unit(xv); } else if (noFill(xf)) { rb = m_hunit(xv); diff --git a/src/core/fillarr.c b/src/core/fillarr.c index 1366240f..5770e5e4 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -114,8 +114,8 @@ B withFill(B x, B fill) { // consumes both if (noFill(fill) && xt!=t_fillarr && xt!=t_fillslice) return x; switch(xt) { case t_f64arr: case t_f64slice: case t_bitarr: - case t_i32arr: case t_i32slice: case t_i16arr: case t_i16slice: case t_i8arr: case t_i8slice: if(fill.u == m_i32(0 ).u) return x; break; - case t_c32arr: case t_c32slice: case t_c16arr: case t_c16slice: case t_c8arr: case t_c8slice: if(fill.u == m_c32(' ').u) return x; break; + case t_i32arr: case t_i32slice: case t_i16arr: case t_i16slice: case t_i8arr: case t_i8slice: if(numFill(fill)) return x; break; + case t_c32arr: case t_c32slice: case t_c16arr: case t_c16slice: case t_c8arr: case t_c8slice: if(chrFill(fill)) return x; break; case t_fillslice: if (fillEqual(c(FillSlice,x)->fill, fill)) { dec(fill); return x; } break; case t_fillarr: if (fillEqual(c(FillArr, x)->fill, fill)) { dec(fill); return x; } if (reusable(x)) { // keeping flags is fine probably @@ -128,10 +128,10 @@ B withFill(B x, B fill) { // consumes both usz ia = IA(x); if (!FL_HAS(x,fl_squoze)) { u8 xe; - if (isNum(fill)) { + if (numFill(fill)) { x = squeeze_numTry(x, &xe, SQ_ANY); if (elNum(xe)) return x; - } else if (isC32(fill)) { + } else if (chrFill(fill)) { x = squeeze_chrTry(x, &xe, SQ_ANY); if (elChr(xe)) return x; } @@ -213,24 +213,24 @@ NOINLINE Arr* emptyArr(B x, ur xr) { } B xf = getFillR(x); if (xr==1) { - if (isF64(xf)) numVec: return a(emptyIVec()); - if (noFill(xf)) return a(emptyHVec()); - if (isC32(xf)) chrVec: return a(emptyCVec()); + if (numFill(xf)) numVec: return a(emptyIVec()); + if ( noFill(xf)) return a(emptyHVec()); + if (chrFill(xf)) chrVec: return a(emptyCVec()); } Arr* r; - if (isF64(xf)) { u64* rp; r = m_bitarrp(&rp, 0); } - else if (noFill(xf)) { r = (Arr*) m_harrUp(0).c; } - else if (isC32(xf)) { u8* rp; r = m_c8arrp(&rp, 0); } - else { r = m_fillarrpEmpty(xf); } + if (numFill(xf)) { u64* rp; r = m_bitarrp(&rp, 0); } + else if ( noFill(xf)) { r = (Arr*) m_harrUp(0).c; } + else if (chrFill(xf)) { u8* rp; r = m_c8arrp(&rp, 0); } + else { r = m_fillarrpEmpty(xf); } if (xr<=1) arr_rnk01(r, xr); return r; } NOINLINE Arr* emptyWithFill(B fill) { u8 type; - if (r_Bf(fill) == 0) { type = t_bitarr; goto tyarr; } - if (isC32(fill)) { type = t_c8arr; goto tyarr; } - if (noFill(fill)) return (Arr*) m_harrUp(0).c; + if (numFill(fill)) { type = t_bitarr; goto tyarr; } + if (chrFill(fill)) { type = t_c8arr; goto tyarr; } + if ( noFill(fill)) return (Arr*) m_harrUp(0).c; return m_fillarrpEmpty(fill); tyarr:; diff --git a/src/core/fillarr.h b/src/core/fillarr.h index 88568c66..9d39e607 100644 --- a/src/core/fillarr.h +++ b/src/core/fillarr.h @@ -26,6 +26,8 @@ static bool fillEqual(B w, B x) { return fillEqualF(w, x); } +static bool numFill(B x) { return x.u == m_f64(0).u; } +static bool chrFill(B x) { return isC32(x); } static B getFillN(B x) { // doesn't consume, doesn't increment result; can return bi_noFill if (isArr(x)) { diff --git a/src/singeli/c/arithdDispatch.c b/src/singeli/c/arithdDispatch.c index dc4bf03a..2c5e20ab 100644 --- a/src/singeli/c/arithdDispatch.c +++ b/src/singeli/c/arithdDispatch.c @@ -16,6 +16,7 @@ char* execAA_repr(u8 ex) { #endif NOINLINE B dyArith_AA(DyTableAA* table, B w, B x) { + assert(isArr(w) && isArr(x)); u8 we = TI(w, elType); if (we==el_B) goto rec; u8 xe = TI(x, elType); if (xe==el_B) goto rec; ur wr = RNK(w); @@ -131,6 +132,7 @@ u8 const nextType[] = { }; NOINLINE B dyArith_SA(DyTableSA* table, B w, B x) { + assert(isArr(x)); usz ia = IA(x); u8 xe = TI(x,elType); @@ -146,9 +148,9 @@ NOINLINE B dyArith_SA(DyTableSA* table, B w, B x) { charX = elChr(xe); } else { B xf = getFillQ(x); - if (isNum(xf)) charX=0; - else if (isC32(xf)) charX=1; - else if (noFill(xf)) { fillVal=0; goto fillSel; } + if (numFill(xf)) charX=0; + else if (chrFill(xf)) charX=1; + else if ( noFill(xf)) { fillVal=0; goto fillSel; } else { dec(xf); goto rec; } // whatever } bool charW;