special-case HArrs in withFill
This commit is contained in:
parent
74a3a87166
commit
46d4acb72b
@ -113,9 +113,9 @@ B withFill(B x, B fill) { // consumes both
|
|||||||
u8 xt = v(x)->type;
|
u8 xt = v(x)->type;
|
||||||
if (noFill(fill) && xt!=t_fillarr && xt!=t_fillslice) return x;
|
if (noFill(fill) && xt!=t_fillarr && xt!=t_fillslice) return x;
|
||||||
switch(xt) {
|
switch(xt) {
|
||||||
case t_f64arr : case t_f64slice:
|
case t_f64arr: case t_f64slice:
|
||||||
case t_i32arr : case t_i32slice: if(fill.u == m_i32(0 ).u) return x; break;
|
case t_i32arr: case t_i32slice: if(fill.u == m_i32(0 ).u) return x; break;
|
||||||
case t_c32arr : case t_c32slice: if(fill.u == m_c32(' ').u) return x; break;
|
case t_c32arr: case t_c32slice: if(fill.u == m_c32(' ').u) return x; break;
|
||||||
case t_fillslice: if (fillEqual(c(FillArr,c(Slice,x)->p)->fill, fill)) { dec(fill); return x; } break;
|
case t_fillslice: if (fillEqual(c(FillArr,c(Slice,x)->p)->fill, fill)) { dec(fill); return x; } break;
|
||||||
case t_fillarr: if (fillEqual(c(FillArr,x)->fill, fill)) { dec(fill); return x; }
|
case t_fillarr: if (fillEqual(c(FillArr,x)->fill, fill)) { dec(fill); return x; }
|
||||||
if (reusable(x)) {
|
if (reusable(x)) {
|
||||||
@ -205,9 +205,25 @@ B withFill(B x, B fill) { // consumes both
|
|||||||
FillArr* r = mm_alloc(fsizeof(FillArr,a,B,ia), t_fillarr);
|
FillArr* r = mm_alloc(fsizeof(FillArr,a,B,ia), t_fillarr);
|
||||||
arr_shCopy((Arr*)r, x);
|
arr_shCopy((Arr*)r, x);
|
||||||
r->fill = fill;
|
r->fill = fill;
|
||||||
B* a = r->a;
|
if (xt==t_harr | xt==t_hslice) {
|
||||||
BS2B xget = TI(x,get);
|
if (xt==t_harr && v(x)->refc==1) {
|
||||||
for (usz i = 0; i < ia; i++) a[i] = xget(x,i);
|
B* xp = harr_ptr(x);
|
||||||
dec(x);
|
B* rp = r->a;
|
||||||
return taga(r);
|
memcpy(rp, xp, ia*sizeof(B));
|
||||||
|
decSh(v(x)); mm_free(v(x)); // manually free x so that refcounting is skipped
|
||||||
|
} else {
|
||||||
|
B* xp = hany_ptr(x);
|
||||||
|
B* rp = r->a;
|
||||||
|
memcpy(rp, xp, ia*sizeof(B));
|
||||||
|
for (usz i = 0; i < ia; i++) inc(rp[i]);
|
||||||
|
dec(x);
|
||||||
|
}
|
||||||
|
return taga(r);
|
||||||
|
} else {
|
||||||
|
B* rp = r->a;
|
||||||
|
BS2B xget = TI(x,get);
|
||||||
|
for (usz i = 0; i < ia; i++) rp[i] = xget(x,i);
|
||||||
|
dec(x);
|
||||||
|
return taga(r);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -90,6 +90,7 @@ static B m_hunit(B x) {
|
|||||||
|
|
||||||
|
|
||||||
static B* harr_ptr(B x) { VTY(x,t_harr); return c(HArr,x)->a; }
|
static B* harr_ptr(B x) { VTY(x,t_harr); return c(HArr,x)->a; }
|
||||||
|
static B* hany_ptr(B x) { return v(x)->type==t_hslice? c(HSlice,x)->a : harr_ptr(x); }
|
||||||
HArr* toHArr(B x);
|
HArr* toHArr(B x);
|
||||||
B m_caB(usz ia, B* a);
|
B m_caB(usz ia, B* a);
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user