From 46d4acb72b7ca211994da6b8de16db0c0e577c76 Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 31 Jul 2021 23:56:57 +0300 Subject: [PATCH] special-case HArrs in withFill --- src/core/fillarr.c | 32 ++++++++++++++++++++++++-------- src/core/harr.h | 1 + 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/core/fillarr.c b/src/core/fillarr.c index d8e898d7..88603177 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -113,9 +113,9 @@ B withFill(B x, B fill) { // consumes both u8 xt = v(x)->type; if (noFill(fill) && xt!=t_fillarr && xt!=t_fillslice) return x; switch(xt) { - case t_f64arr : case t_f64slice: - 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_f64arr: case t_f64slice: + 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_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; } 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); arr_shCopy((Arr*)r, x); r->fill = fill; - B* a = r->a; - BS2B xget = TI(x,get); - for (usz i = 0; i < ia; i++) a[i] = xget(x,i); - dec(x); - return taga(r); + if (xt==t_harr | xt==t_hslice) { + if (xt==t_harr && v(x)->refc==1) { + B* xp = harr_ptr(x); + B* rp = r->a; + 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); + } } diff --git a/src/core/harr.h b/src/core/harr.h index 0120e7a2..caebf23e 100644 --- a/src/core/harr.h +++ b/src/core/harr.h @@ -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* hany_ptr(B x) { return v(x)->type==t_hslice? c(HSlice,x)->a : harr_ptr(x); } HArr* toHArr(B x); B m_caB(usz ia, B* a);