From 4eb632a48d070bb40d27d1b67279e3775241296c Mon Sep 17 00:00:00 2001 From: dzaima Date: Mon, 16 Sep 2024 03:43:00 +0300 Subject: [PATCH] TO_GET helper --- src/builtins/cells.c | 8 +++----- src/builtins/fold.c | 14 ++++++-------- src/builtins/search.c | 4 +--- src/builtins/sfns.c | 28 ++++++++-------------------- src/builtins/slash.c | 2 +- src/h.h | 1 + src/opt/comp.c | 3 +-- src/utils/each.c | 4 ++-- 8 files changed, 23 insertions(+), 41 deletions(-) diff --git a/src/builtins/cells.c b/src/builtins/cells.c index 460fd30c..a50e4793 100644 --- a/src/builtins/cells.c +++ b/src/builtins/cells.c @@ -658,7 +658,7 @@ B rank_c1(Md2D* d, B x) { B f = d->f; B g = d->g; kf = req_whole(o2fG(g)); } else { usz gia = check_rank_vec(g); - kf = IGetU(g, gia==2).f; + kf = o2fG(IGetU(g, gia==2)); decA(gi); } if (isAtm(x)) return c1wrap(f, x); @@ -697,9 +697,7 @@ SHOULD_INLINE bool unpack_unit(B* r) { B x = *r; if (isAtm(x)) return true; if (RNK(x)!=0) return false; - B x2 = IGet(x,0); - decG(x); - *r = x2; + *r = TO_GET(x,0); return true; } @@ -780,7 +778,7 @@ NOINLINE B for_cells_SA(B f, B w, B x, ur xcr, ur xr, u32 chr) { // w⊸F⎉xcr if (xcr==0) break; if (!(xsh[xk]==1 || shProd(xsh, xk+1, xr)==1)) break; } - if (isArr(w)) { B w0=w; w = IGet(w,0); decG(w0); } + if (isArr(w)) w = TO_GET(w, 0); return shift_cells(w, x, cam, xsh[xk], el_or(TI(x,elType), selfElType(w)), rtid); } break; case n_take: case n_drop: { diff --git a/src/builtins/fold.c b/src/builtins/fold.c index 75825060..9af93754 100644 --- a/src/builtins/fold.c +++ b/src/builtins/fold.c @@ -190,9 +190,7 @@ B fold_c1(Md1D* d, B x) { B f = d->f; decG(x); return c2(f, x0, x1); } else if (ia==1) { - B r = IGet(x,0); - decG(x); - return r; + return TO_GET(x,0); } else { decG(x); if (isFun(f)) { @@ -206,8 +204,8 @@ B fold_c1(Md1D* d, B x) { B f = d->f; u8 xe = TI(x,elType); if (v(f)->flags) { u8 rtid = v(f)->flags-1; - if (rtid==n_ltack) { B r = IGet(x, 0 ); decG(x); return r; } - if (rtid==n_rtack) { B r = IGet(x, ia-1); decG(x); return r; } + if (rtid==n_ltack) return TO_GET(x, 0); + if (rtid==n_rtack) return TO_GET(x, ia-1); if (xe>el_f64) goto base; if (xe==el_bit) { u64* xp = bitany_ptr(x); @@ -279,8 +277,8 @@ B fold_c2(Md1D* d, B w, B x) { B f = d->f; if (v(f)->flags) { u8 rtid = v(f)->flags-1; if (rtid==n_ltack) { - B r = IGet(x, 0); - dec(w); decG(x); return r; + dec(w); + return TO_GET(x, 0); } if (rtid==n_rtack) { decG(x); return w; } if (!isF64(w) || xe>el_f64) goto base; @@ -457,7 +455,7 @@ B insert_c2(Md1D* d, B w, B x) { B f = d->f; if (isArr(w)) { if (IA(w) != 1) goto skip; ur wr = RNK(w); if (wr>rr) rr = wr; - B w0=w; w = IGet(w,0); decG(w0); + w = TO_GET(w, 0); } if (xr > 1) x = C1(shape, x); B r = m_unit(fold_c2(d, w, x)); diff --git a/src/builtins/search.c b/src/builtins/search.c index bd5342e8..30052c18 100644 --- a/src/builtins/search.c +++ b/src/builtins/search.c @@ -373,9 +373,7 @@ B memberOf_c2(B t, B w, B x) { ur wr = RNK(w); if (wr>0) goto many; - B w0 = IGet(w, 0); - dec(w); - w = w0; + w = TO_GET(w, 0); goto single; B r; diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index a3df1782..281797c3 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -188,9 +188,7 @@ B shape_c1(B t, B x) { if (RNK(x)==1) return x; usz ia = IA(x); if (ia==1 && TI(x,elType)xr?wr:xr; if (c==0) { HArr_p r = m_harrUv(2); - r.a[0] = IGet(w,0); decG(w); - r.a[1] = IGet(x,0); decG(x); + r.a[0] = TO_GET(w, 0); + r.a[1] = TO_GET(x, 0); NOGC_E; return qWithFill(r.b, f); } @@ -1482,16 +1474,12 @@ B reverse_ix(B t, B w, B x) { NOINLINE B enclose_im(B t, B x) { if (isAtm(x) || RNK(x)!=0) thrM("<⁼: Argument wasn't a rank 0 array"); - B r = IGet(x, 0); - dec(x); - return r; + return TO_GET(x, 0); } NOINLINE B pair_im(B t, B x) { if (isAtm(x) || RNK(x)!=1 || IA(x)!=1) thrM("⋈⁼: Argument wasn't a length-1 list"); - B r = IGet(x, 0); - dec(x); - return r; + return TO_GET(x, 0); } B select_c1(B,B); diff --git a/src/builtins/slash.c b/src/builtins/slash.c index 6a2fdecc..2310cb47 100644 --- a/src/builtins/slash.c +++ b/src/builtins/slash.c @@ -621,7 +621,7 @@ B slash_c2(B t, B w, B x) { if (depth(w)>1) goto base; ur wr = RNK(w); if (wr>1) thrF("/: Simple 𝕨 must have rank 0 or 1 (%i≡=𝕨)", wr); - if (wr<1) { B v=IGet(w, 0); decG(w); w=v; goto atom; } + if (wr<1) { w = TO_GET(w, 0); goto atom; } wia = IA(w); if (wia==0) { decG(w); return isArr(x)? x : m_unit(x); } } else { diff --git a/src/h.h b/src/h.h index 936f628e..6147458f 100644 --- a/src/h.h +++ b/src/h.h @@ -592,6 +592,7 @@ typedef B (*D2C2)(Md2D*, B, B); #define SGet(X) Arr* X##_arr = a(X); AS2B X##_get = TIv(X##_arr,get); #define IGet(X,N) ({ Arr* x_ = a(X); TIv(x_,get)(x_,N); }) #define Get(X,N) X##_get(X##_arr,N) +#define TO_GET(X,N) ({ B x_2 = (X); B r = IGet(x_2,N); decG(x_2); r; }) enum Flags { diff --git a/src/opt/comp.c b/src/opt/comp.c index 76abf447..becc224a 100644 --- a/src/opt/comp.c +++ b/src/opt/comp.c @@ -438,8 +438,7 @@ B nc_parseBlock(B tokens, usz i0, u32 end, bool isBlock, B* objs, u32* varCount) #endif i1 = nc_skipSeparators(tokens, i1); if (i1 != IA(tokens)) thrM("Native compiler: Code present after block end"); - B r = IGet(r0, 1); - decG(r0); + B r = TO_GET(r0, 1); decG(toFree); return r; } diff --git a/src/utils/each.c b/src/utils/each.c index 29be8913..b55b0cae 100644 --- a/src/utils/each.c +++ b/src/utils/each.c @@ -7,8 +7,8 @@ static inline B hmv(HArr_p p, usz n) { B r = p.a[n]; p.a[n] = m_f64(0); return r B eachd_fn(B fo, B w, B x, FC2 f) { ur wr, xr; // if rank is 0, respective w/x will be disclosed - if (isArr(w)) { wr=RNK(w); if (wr==0) { B c=IGet(w, 0); decG(w); w=c; } } else wr=0; - if (isArr(x)) { xr=RNK(x); if (xr==0) { B c=IGet(x, 0); decG(x); x=c; } } else xr=0; + if (isArr(w)) { wr=RNK(w); if (wr==0) w = TO_GET(w,0); } else wr=0; + if (isArr(x)) { xr=RNK(x); if (xr==0) x = TO_GET(x,0); } else xr=0; bool wg = wr>xr; ur rM = wg? wr : xr; ur rm = wg? xr : wr;