From ceb967bbd42258bcd66c8f3adbc75b002208c49e Mon Sep 17 00:00:00 2001 From: dzaima Date: Sat, 3 Jul 2021 01:53:26 +0300 Subject: [PATCH] return Arr* from m_fillarrp --- src/builtins/fns.c | 6 +++--- src/builtins/internal.c | 15 ++++++++------- src/builtins/sfns.c | 42 ++++++++++++++++++++--------------------- src/core/c32arr.c | 7 ++++--- src/core/fillarr.h | 11 ++++------- src/core/stuff.c | 6 +++--- src/utils/each.h | 2 +- src/utils/mut.h | 2 +- 8 files changed, 45 insertions(+), 46 deletions(-) diff --git a/src/builtins/fns.c b/src/builtins/fns.c index 3b48bb20..1f5baa60 100644 --- a/src/builtins/fns.c +++ b/src/builtins/fns.c @@ -54,11 +54,11 @@ B ud_c1(B t, B x) { } dec(x); - B r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0)); + Arr* r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0)); B* rp = fillarr_ptr(r); for (usz i = 0; i < ria; i++) rp[i] = m_f64(0); // don't break if allocation errors - usz* rsh = arr_shAllocI(a(r), ria, xia); + usz* rsh = arr_shAllocI(r, ria, xia); if (rsh) memcpy(rsh, sh, sizeof(usz)*xia); usz pos[xia]; B* crp = rp; @@ -70,7 +70,7 @@ B ud_c1(B t, B x) { fillarr_setFill(r, m_i32arrv(&fp, xia)); for (usz i = 0; i < xia; i++) fp[i] = 0; } - return r; + return taga(r); } extern B rt_ud; diff --git a/src/builtins/internal.c b/src/builtins/internal.c index e77c945b..5a1f3187 100644 --- a/src/builtins/internal.c +++ b/src/builtins/internal.c @@ -182,10 +182,11 @@ B variation_c2(B t, B w, B x) { else for (usz i = 0; i < xia; i++) t.a[i] = xget(x,i); res = t.b; } else if (u32_get(&wp, wpE, U"f")) { - res = m_fillarrp(xia); - fillarr_setFill(res, getFillQ(x)); - arr_shCopy(a(res), x); - B* rp = fillarr_ptr(res); + Arr* t = m_fillarrp(xia); + res = taga(t); + fillarr_setFill(t, getFillQ(x)); + arr_shCopy(t, x); + B* rp = fillarr_ptr(t); if (xe==el_i32) { i32* xp=i32any_ptr(x); for (usz i = 0; i < xia; i++) rp[i] = m_f64(xp[i]); } else if (xe==el_f64) { f64* xp=f64any_ptr(x); for (usz i = 0; i < xia; i++) rp[i] = m_f64(xp[i]); } else for (usz i = 0; i < xia; i++) rp[i] = xget(x,i); @@ -243,11 +244,11 @@ static B unshare(B x) { return r.b; } case t_fillarr: { - B r = m_fillarrp(xia); arr_shCopy(a(r), x); + Arr* r = m_fillarrp(xia); arr_shCopy(r, x); fillarr_setFill(r, unshare(c(FillArr,x)->fill)); - B* rp = fillarr_ptr(r); B* xp = fillarr_ptr(x); + B* rp = fillarr_ptr(r); B* xp = fillarr_ptr(a(x)); for (usz i = 0; i < xia; i++) rp[i] = unshare(xp[i]); - return r; + return taga(r); } default: thrF("•internal.Unshare: Cannot unshare array with type %i=%S", v(x)->type, format_type((v(x)->type))); } diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 8725dd58..3f115ec5 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -611,15 +611,15 @@ B group_c2(B t, B w, B x) { for (usz i = 0; i < ria; i++) len[i] = pos[i] = 0; for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) len[n]++; } - B r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0)); - arr_shVec(a(r), ria); + Arr* r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0)); + arr_shVec(r, ria); B* rp = fillarr_ptr(r); for (usz i = 0; i < ria; i++) rp[i] = m_f64(0); // don't break if allocation errors B xf = getFillQ(x); - B rf = m_fillarrp(0); fillarr_setFill(rf, m_f64(0)); - arr_shVec(a(rf), 0); - fillarr_setFill(r, rf); + Arr* rf = m_fillarrp(0); fillarr_setFill(rf, m_f64(0)); + arr_shVec(rf, 0); + fillarr_setFill(r, taga(rf)); if (TI(x).elType==el_i32) { for (usz i = 0; i < ria; i++) { i32* t; rp[i] = m_i32arrv(&t, len[i]); } i32* xp = i32any_ptr(x); @@ -636,21 +636,21 @@ B group_c2(B t, B w, B x) { } } else { for (usz i = 0; i < ria; i++) { - B c = m_fillarrp(len[i]); + Arr* c = m_fillarrp(len[i]); fillarr_setFill(c, inc(xf)); - a(c)->ia = 0; - rp[i] = c; + c->ia = 0; + rp[i] = taga(c); } BS2B xget = TI(x).get; for (usz i = 0; i < xia; i++) { i32 n = wp[i]; - if (n>=0) fillarr_ptr(rp[n])[pos[n]++] = xget(x, i); + if (n>=0) fillarr_ptr(a(rp[n]))[pos[n]++] = xget(x, i); } for (usz i = 0; i < ria; i++) { arr_shVec(a(rp[i]), len[i]); } } fillarr_setFill(rf, xf); dec(w); dec(x); TFREE(len); TFREE(pos); - return r; + return taga(r); } else { BS2B wgetU = TI(w).getU; i64 ria = wia==xia? -1 : o2i64(wgetU(w, xia))-1; @@ -669,30 +669,30 @@ B group_c2(B t, B w, B x) { if (n>=0) len[n]++; } - B r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0)); - arr_shVec(a(r), ria); + Arr* r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0)); + arr_shVec(r, ria); B* rp = fillarr_ptr(r); for (usz i = 0; i < ria; i++) rp[i] = m_f64(0); // don't break if allocation errors B xf = getFillQ(x); for (usz i = 0; i < ria; i++) { - B c = m_fillarrp(len[i]); + Arr* c = m_fillarrp(len[i]); fillarr_setFill(c, inc(xf)); - a(c)->ia = 0; - rp[i] = c; + c->ia = 0; + rp[i] = taga(c); } - B rf = m_fillarrp(0); - arr_shVec(a(rf), 0); + Arr* rf = m_fillarrp(0); + arr_shVec(rf, 0); fillarr_setFill(rf, xf); - fillarr_setFill(r, rf); + fillarr_setFill(r, taga(rf)); BS2B xget = TI(x).get; for (usz i = 0; i < xia; i++) { i64 n = o2i64u(wgetU(w, i)); - if (n>=0) fillarr_ptr(rp[n])[pos[n]++] = xget(x, i); + if (n>=0) fillarr_ptr(a(rp[n]))[pos[n]++] = xget(x, i); } for (usz i = 0; i < ria; i++) { arr_shVec(a(rp[i]), len[i]); } dec(w); dec(x); TFREE(len); TFREE(pos); - return r; + return taga(r); } } base: @@ -781,7 +781,7 @@ B pick_ucw(B t, B o, B w, B x) { xp[wi] = o2f(rep); return x; } else if (v(x)->type==t_fillarr) { - B* xp = fillarr_ptr(x); + B* xp = fillarr_ptr(a(x)); dec(xp[wi]); xp[wi] = rep; return x; diff --git a/src/core/c32arr.c b/src/core/c32arr.c index e3781f43..e09977c7 100644 --- a/src/core/c32arr.c +++ b/src/core/c32arr.c @@ -45,7 +45,8 @@ void c32arr_init() { ti[t_c32arr].elType = el_c32; ti[t_c32slice].elType = el_c32; ti[t_c32arr].canStore = c32arr_canStore; u32* tmp; bi_emptyCVec = m_c32arrv(&tmp, 0); gc_add(bi_emptyCVec); - bi_emptySVec = m_fillarrp(0); gc_add(bi_emptySVec); - arr_shVec(a(bi_emptySVec), 0); - fillarr_setFill(bi_emptySVec, inc(bi_emptyCVec)); + Arr* emptySVec = m_fillarrp(0); + arr_shVec(emptySVec, 0); + fillarr_setFill(emptySVec, inc(bi_emptyCVec)); + bi_emptySVec = taga(emptySVec); gc_add(bi_emptySVec); } diff --git a/src/core/fillarr.h b/src/core/fillarr.h index a5d2d88a..e25cf267 100644 --- a/src/core/fillarr.h +++ b/src/core/fillarr.h @@ -59,14 +59,11 @@ static B getFillE(B x) { // errors if there's no fill } -static B m_fillarrp(usz ia) { // doesn't set ia - return taga(mm_alloc(fsizeof(FillArr,a,B,ia), t_fillarr)); +static Arr* m_fillarrp(usz ia) { // doesn't set ia + return mm_alloc(fsizeof(FillArr,a,B,ia), t_fillarr); } -static void fillarr_setFill(B x, B fill) { // consumes fill - c(FillArr, x)->fill = fill; -} - -static B* fillarr_ptr(B x) { VTY(x,t_fillarr); return c(FillArr,x)->a; } +static void fillarr_setFill(Arr* x, B fill) { assert(x->type==t_fillarr); ((FillArr*)x)->fill = fill; } // consumes fill +static B* fillarr_ptr(Arr* x) { assert(x->type==t_fillarr); return ((FillArr*)x)->a; } static B m_unit(B x) { diff --git a/src/core/stuff.c b/src/core/stuff.c index d267c0a2..daeb79ec 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -422,15 +422,15 @@ B bqn_merge(B x) { // consumes if (isAtm(xf)) { dec(xf); return x; } i32 xfr = rnk(xf); B xff = getFillQ(xf); - B r = m_fillarrp(0); + Arr* r = m_fillarrp(0); fillarr_setFill(r, xff); if (xr+xfr > UR_MAX) thrM(">: Result rank too large"); - usz* rsh = arr_shAllocI(a(r), 0, xr+xfr); + usz* rsh = arr_shAllocI(r, 0, xr+xfr); if (rsh) { memcpy (rsh , a(x)->sh, xr *sizeof(usz)); if(xfr)memcpy(rsh+xr, a(xf)->sh, xfr*sizeof(usz)); } - return r; + return taga(r); } BS2B xgetU = TI(x).getU; diff --git a/src/utils/each.h b/src/utils/each.h index 8c00a3d2..d1e650db 100644 --- a/src/utils/each.h +++ b/src/utils/each.h @@ -110,7 +110,7 @@ static B eachm_fn(BB2B f, B fo, B x) { // consumes x; x must be array if (!reuse) dec(x); return r; } else if (v(x)->type==t_fillarr) { - B* xp = fillarr_ptr(x); + B* xp = fillarr_ptr(a(x)); if (reuse) { dec(c(FillArr,x)->fill); c(FillArr,x)->fill = bi_noFill; diff --git a/src/utils/mut.h b/src/utils/mut.h index ffa0fb88..ccc5c2fb 100644 --- a/src/utils/mut.h +++ b/src/utils/mut.h @@ -272,7 +272,7 @@ static B vec_join(B w, B x) { // consumes both u8 xt = v(x)->type; u8 xe = TI(x).elType; if (xt==t_harr | xt==t_hslice | xt==t_fillarr) { - B* xp = xt==t_harr? harr_ptr(x) : xt==t_hslice? c(HSlice, x)->a : fillarr_ptr(x); + B* xp = xt==t_harr? harr_ptr(x) : xt==t_hslice? c(HSlice, x)->a : fillarr_ptr(a(x)); memcpy(rp, xp, xia*sizeof(B)); for (usz i = 0; i < xia; i++) inc(rp[i]); } else if (xe==el_i32) {