diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 4d58405a..fb885300 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -62,8 +62,7 @@ B tbl_c2(Md1D* d, B w, B x) { B f = d->f; if (!EACH_FILLS && isFun(f) && isPervasiveDy(f) && TI(w,arrD1)) { BBB2B fc2 = c(Fun,f)->c2; if (TI(x,arrD1) && xia<80 && wia>130) { - Arr* wd = TI(w,slice)(inc(w), 0, wia); - arr_shVec(wd); + Arr* wd = arr_shVec(TI(w,slice)(inc(w), 0, wia)); r = fc2(f, slash_c2(f, m_i32(xia), taga(wd)), shape_c2(f, m_f64(ria), inc(x))); } else { SGet(w) diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 6366ff6e..546a5040 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -35,7 +35,7 @@ B m_vec1(B a) { else if (LIKELY(cia; assert(s+ia <= xia); - Arr* r = TI(x,slice)(x, s, ia); arr_shVec(r); - return taga(r); + return taga(arr_shVec(TI(x,slice)(x, s, ia))); } + extern B rt_take, rt_drop; B take_c1(B t, B x) { return c1(rt_take, x); } B drop_c1(B t, B x) { return c1(rt_drop, x); } @@ -970,12 +966,12 @@ B group_c2(B t, B w, B x) { len[n]++; // overallocation makes this safe after n<-1 check } - Arr* r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0)); arr_shVec(r); + Arr* r = arr_shVec(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 B xf = getFillQ(x); - Arr* rf = m_fillarrp(0); fillarr_setFill(rf, m_f64(0)); arr_shVec(rf); + Arr* rf = arr_shVec(m_fillarrp(0)); fillarr_setFill(rf, m_f64(0)); fillarr_setFill(r, taga(rf)); u8 xe = TI(x,elType); switch (xe) { default: UD; @@ -1035,7 +1031,7 @@ 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++) len[o2i64u(GetU(w, i))]++; - Arr* r = m_fillarrp(ria); fillarr_setFill(r, m_f64(0)); arr_shVec(r); + Arr* r = arr_shVec(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 B xf = getFillQ(x); diff --git a/src/core/fillarr.h b/src/core/fillarr.h index 29394da6..2bbadee6 100644 --- a/src/core/fillarr.h +++ b/src/core/fillarr.h @@ -67,9 +67,8 @@ static void fillarr_setFill(Arr* x, B fill) { assert(x->type==t_fillarr); ((Fill static B* fillarr_ptr(Arr* x) { assert(x->type==t_fillarr); return ((FillArr*)x)->a; } static B m_emptyFVec(B f) { // consumes f - Arr* r = m_fillarrp(0); + Arr* r = arr_shVec(m_fillarrp(0)); fillarr_setFill(r, f); - arr_shVec(r); return taga(r); } diff --git a/src/core/harr.c b/src/core/harr.c index 3a7c6f45..4743b68b 100644 --- a/src/core/harr.c +++ b/src/core/harr.c @@ -12,8 +12,7 @@ B toCells(B x) { usz p = 0; if (rnk(x)==2) { for (usz i = 0; i < cam; i++) { - Arr* s = slice(inc(x), p, csz); arr_shVec(s); - HARR_ADD(r, i, taga(s)); + HARR_ADD(r, i, taga(arr_shVec(slice(inc(x), p, csz)))); p+= csz; } } else { diff --git a/src/core/stuff.h b/src/core/stuff.h index f019f224..c40a6347 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -46,9 +46,10 @@ static ShArr* m_shArr(ur r) { return ((ShArr*)mm_alloc(fsizeof(ShArr, a, usz, r), t_shape)); } -static void arr_shVec(Arr* x) { +static Arr* arr_shVec(Arr* x) { sprnk(x, 1); x->sh = &x->ia; + return x; } static usz* arr_shAlloc(Arr* x, ur r) { // sets rank, allocates & returns shape (or null if r<2) if (r>1) { diff --git a/src/core/tyarr.c b/src/core/tyarr.c index 43a83955..1c0511e7 100644 --- a/src/core/tyarr.c +++ b/src/core/tyarr.c @@ -80,7 +80,7 @@ void tyarr_init() { { u64* tmp; bi_emptyIVec = m_bitarrv(&tmp, 0); gc_add(bi_emptyIVec); } { u8* tmp; bi_emptyCVec = m_c8arrv (&tmp, 0); gc_add(bi_emptyCVec); } - Arr* emptySVec = m_fillarrp(0); arr_shVec(emptySVec); + Arr* emptySVec = arr_shVec(m_fillarrp(0)); fillarr_setFill(emptySVec, emptyCVec()); bi_emptySVec = taga(emptySVec); gc_add(bi_emptySVec); } \ No newline at end of file diff --git a/src/h.h b/src/h.h index 61d9b416..20d4688d 100644 --- a/src/h.h +++ b/src/h.h @@ -577,6 +577,7 @@ static inline B incBy(B x, i64 am) { // you most likely don't want am to be nega if (isVal(VALIDATE(x))) v(x)->refc+= am; return x; } +static inline B incByG(B x, i64 am) { v(x)->refc+= am; return x; } #define ptr_inc(X) ({ AUTO x_ = (X); VALIDATEP((Value*)x_)->refc++; x_; }) diff --git a/src/utils/file.c b/src/utils/file.c index f2eea274..d0bf7846 100644 --- a/src/utils/file.c +++ b/src/utils/file.c @@ -123,10 +123,7 @@ B path_dir(B path) { if (pia==0) thrM("Empty file path"); guaranteeStr(path); for (i64 i = (i64)pia-1; i >= 0; i--) { - if (o2cu(GetU(path, i))=='/') { - Arr* r = TI(path,slice)(path, 0, i+1); arr_shVec(r); - return taga(r); - } + if (o2cu(GetU(path, i))=='/') return taga(arr_shVec(TI(path,slice)(path, 0, i+1))); } dec(path); u32* rp; B r = m_c32arrv(&rp, 2); rp[0] = '.'; rp[1] = '/'; @@ -141,8 +138,7 @@ B path_name(B path) { for (i64 i = (i64)pia-1; i >= 0; i--) { if (o2cu(GetU(path, i))=='/') { if (i == pia-1) thrF("File path ended with a slash: '%R'", path); - Arr* r = TI(path,slice)(path, i+1, pia - (i+1)); arr_shVec(r); - return taga(r); + return taga(arr_shVec(TI(path,slice)(path, i+1, pia - (i+1)))); } } return path; @@ -275,10 +271,7 @@ B mmap_file(B path) { holder->a = data; holder->size = len; arr_shVec((Arr*)holder); - - Arr* r = mmapH_slice(taga(holder), 0, len); - arr_shVec(r); - return taga(r); + return taga(arr_shVec(mmapH_slice(taga(holder), 0, len))); } B mmapH_get(Arr* a, usz pos) { thrM("Reading mmapH directly"); } diff --git a/src/vm.c b/src/vm.c index 251adcce..f106f8c1 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1211,8 +1211,7 @@ NOINLINE B vm_fmtPoint(B src, B prepend, B path, usz cs, usz ce) { // consumes p SGetU(s) while (padStart>0 && o2cu(GetU(s,padStart-1))!='\n') padStart--; - Arr* slice = TI(src,slice)(inc(src),srcS, srcE-srcS); arr_shVec(slice); - AJOIN(taga(slice)); + AJOIN(taga(arr_shVec(TI(src,slice)(inc(src),srcS, srcE-srcS)))); cs-= srcS; ce-= srcS; ACHR('\n'); @@ -1442,7 +1441,7 @@ void profiler_displayResults() { u32 c = o2cu(GetU(src, i)); curr+= m[i]; if (c=='\n' || i==sia-1) { - Arr* sl = TI(src,slice)(inc(src), pi, i-pi+(c=='\n'?0:1)); arr_shVec(sl); + Arr* sl = arr_shVec(TI(src,slice)(inc(src), pi, i-pi+(c=='\n'?0:1))); if (curr==0) printf(" │"); else printf("%6d│", curr); printRaw(taga(sl));