diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index 1a4d0361..c57f01e9 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -29,8 +29,8 @@ if (isArr(w)&isArr(x) && rnk(w)==rnk(x)) { \ if (memcmp(a(w)->sh, a(x)->sh, rnk(w)*sizeof(usz))) thrF(#NAME ": Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); \ usz ia = a(x)->ia; \ - u8 we = TI(w).elType; \ - u8 xe = TI(x).elType; \ + u8 we = TI(w,elType); \ + u8 xe = TI(x,elType); \ if (isNumEl(we)&isNumEl(xe)) { \ f64* rp; B r = m_f64arrc(&rp, x); \ if (we==el_i32) { B w,x/*shadow*/; i32* wp = i32any_ptr(ow); \ @@ -43,7 +43,7 @@ dec(w); dec(x); return f64_maybe_i32(r); \ } \ } else if (isF64(w)&isArr(x)) { usz ia = a(x)->ia; \ - u8 xe = TI(x).elType; f64*rp; \ + u8 xe = TI(x,elType); f64*rp; \ if (xe==el_i32) { B r=m_f64arrc(&rp, x); i32*xp=i32any_ptr(x); \ for (usz i = 0; i < ia; i++) {B x/*shadow*/;x.f=xp[i];rp[i]=EXPR;} \ dec(x); return f64_maybe_i32(r); \ @@ -53,7 +53,7 @@ dec(x); return f64_maybe_i32(r); \ } \ } else if (isF64(x)&isArr(w)) { usz ia = a(w)->ia; \ - u8 we = TI(w).elType; f64*rp; \ + u8 we = TI(w,elType); f64*rp; \ if (we==el_i32) { B r=m_f64arrc(&rp, w); i32*wp=i32any_ptr(w); \ for (usz i = 0; i < ia; i++) {B w/*shadow*/;w.f=wp[i];rp[i]=EXPR;} \ dec(w); return f64_maybe_i32(r); \ @@ -100,8 +100,8 @@ if (isArr(w)&isArr(x) && rnk(w)==rnk(x)) { \ if (memcmp(a(w)->sh, a(x)->sh, rnk(w)*sizeof(usz))) thrF(#NAME ": Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); \ usz ia = a(x)->ia; \ - u8 we = TI(w).elType; \ - u8 xe = TI(x).elType; \ + u8 we = TI(w,elType); \ + u8 xe = TI(x,elType); \ if (isNumEl(we)&isNumEl(xe)) { \ bool wei = we==el_i32; bool xei = xe==el_i32; \ if (wei&xei) { PI(w) PI(x) DOI(EXPR,w,wp[i],xp[i],aaB); } \ @@ -115,11 +115,11 @@ } \ dec(w); dec(x); return f64_maybe_i32(r); \ } \ - } else if (isF64(w)&isArr(x)) { usz ia = a(x)->ia; u8 xe = TI(x).elType; \ + } else if (isF64(w)&isArr(x)) { usz ia = a(x)->ia; u8 xe = TI(x,elType); \ if (xe==el_i32 && q_i32(w)) { PI(x) i32 wc=o2iu(w); DOI(EXPR,x,wc,xp[i],naB) } naB:; \ if (xe==el_i32) { RF(x) PI(x) DOF(EXPR,w,w.f,xp[i]) dec(x); return f64_maybe_i32(r); } \ if (xe==el_f64) { RF(x) PF(x) DOF(EXPR,w,w.f,xp[i]) dec(x); return f64_maybe_i32(r); } \ - } else if (isF64(x)&isArr(w)) { usz ia = a(w)->ia; u8 we = TI(w).elType; \ + } else if (isF64(x)&isArr(w)) { usz ia = a(w)->ia; u8 we = TI(w,elType); \ if (we==el_i32 && q_i32(x)) { PI(w) i32 xc=o2iu(x); DOI(EXPR,w,wp[i],xc,anB) } anB:; \ if (we==el_i32) { RF(w) PI(w) DOF(EXPR,x,wp[i],x.f) dec(w); return f64_maybe_i32(r); } \ if (we==el_f64) { RF(w) PF(w) DOF(EXPR,x,wp[i],x.f) dec(w); return f64_maybe_i32(r); } \ @@ -153,7 +153,7 @@ GC2i(add, wv+xv, { if (isC32(w) & isF64(x)) { u64 r = (u64)(o2cu(w)+o2i64(x)); if(r>CHR_MAX)thrM("+: Invalid character"); return m_c32((u32)r); } if (isF64(w) & isC32(x)) { u64 r = (u64)(o2cu(x)+o2i64(w)); if(r>CHR_MAX)thrM("+: Invalid character"); return m_c32((u32)r); } if (isArr(w)&isC32(x) || isC32(w)&isArr(x)) { if (isArr(w)) { B t=w;w=x;x=t; } - if (TI(x).elType == el_i32) { + if (TI(x,elType) == el_i32) { u32 wv = o2cu(w); i32* xp = i32any_ptr(x); usz xia = a(x)->ia; u32* rp; B r = m_c32arrc(&rp, x); @@ -169,7 +169,7 @@ GC2i(add, wv+xv, { GC2i(sub, wv-xv, { if (isC32(w) & isF64(x)) { u64 r = (u64)((i32)o2cu(w)-o2i64(x)); if(r>CHR_MAX)thrM("-: Invalid character"); return m_c32((u32)r); } if (isC32(w) & isC32(x)) return m_f64((i32)(u32)w.u - (i32)(u32)x.u); - if (isArr(w) && TI(w).elType==el_c32) { + if (isArr(w) && TI(w,elType)==el_c32) { if (isC32(x)) { i32 xv = (i32)o2cu(x); u32* wp = c32any_ptr(w); usz wia = a(w)->ia; @@ -180,7 +180,7 @@ GC2i(sub, wv-xv, { } if (isArr(x) && eqShape(w, x)) { u32* wp = c32any_ptr(w); usz wia = a(w)->ia; - if (TI(x).elType==el_i32) { + if (TI(x,elType)==el_i32) { u32* rp; B r = m_c32arrc(&rp, w); i32* xp = i32any_ptr(x); for (usz i = 0; i < wia; i++) { diff --git a/src/builtins/cmp.c b/src/builtins/cmp.c index 06e7bb7d..71352fa4 100644 --- a/src/builtins/cmp.c +++ b/src/builtins/cmp.c @@ -13,8 +13,8 @@ bool xa = isArr(x); \ if (wa|xa && (!wa|!xa || rnk(w)==rnk(x))) { \ if (wa&xa && !eqShape(w, x)) thrF(CHR": Expected equal shape prefix (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); \ - u8 we = wa? TI(w).elType : selfElType(w); \ - u8 xe = xa? TI(x).elType : selfElType(x); \ + u8 we = wa? TI(w,elType) : selfElType(w); \ + u8 xe = xa? TI(x,elType) : selfElType(x); \ if (we==el_i32 && xe==el_i32) { \ i32* rp; B r = m_i32arrc(&rp, isArr(x)? x : w); usz ria=a(r)->ia; \ if (!wa) { i32 wv=o2iu(w); i32* xp=i32any_ptr(x); for(usz i=0;iia; if (rnk(x)!=1) thrF("↕: Argument must be either an integer or integer list (had rank %i)", rnk(x)); if (xia>UR_MAX) thrF("↕: Result rank too large (%s≡≠𝕩)", xia); @@ -151,7 +151,7 @@ B indexOf_c1(B t, B x) { if (isAtm(x)) thrM("⊐: 𝕩 cannot have rank 0"); usz xia = a(x)->ia; if (xia==0) { dec(x); return emptyIVec(); } - if (rnk(x)==1 && TI(x).elType==el_i32) { + if (rnk(x)==1 && TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); i32 min=I32_MAX, max=I32_MIN; for (usz i = 0; i < xia; i++) { @@ -182,7 +182,7 @@ B indexOf_c1(B t, B x) { // wyhashmap_t idx[size]; // i32 val[size]; // for (i64 i = 0; i < size; i++) { idx[i] = 0; val[i] = -1; } - // BS2B xget = TI(x).get; + // BS2B xget = TI(x,get); // i32 ctr = 0; // for (usz i = 0; i < xia; i++) { // u64 hash = bqn_hash(xget(x,i), wy_secret); @@ -198,7 +198,7 @@ B indexOf_c1(B t, B x) { // u64 s = nsTime(); i32* rp; B r = m_i32arrv(&rp, xia); H_b2i* map = m_b2i(64); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); i32 ctr = 0; for (usz i = 0; i < xia; i++) { bool had; u64 p = mk_b2i(&map, xgetU(x,i), &had); @@ -216,9 +216,9 @@ B indexOf_c2(B t, B w, B x) { if (rnk(w)==1) { if (!isArr(x) || rnk(x)==0) { usz wia = a(w)->ia; - B el = isArr(x)? TI(x).getU(x,0) : x; + B el = isArr(x)? TI(x,getU)(x,0) : x; i32 res = wia; - if (TI(w).elType==el_i32) { + if (TI(w,elType)==el_i32) { if (q_i32(el)) { i32* wp = i32any_ptr(w); i32 v = o2iu(el); @@ -227,7 +227,7 @@ B indexOf_c2(B t, B w, B x) { } } } else { - BS2B wgetU = TI(w).getU; + BS2B wgetU = TI(w,getU); for (usz i = 0; i < wia; i++) { if (equal(wgetU(w,i), el)) { res = i; break; } } @@ -243,8 +243,8 @@ B indexOf_c2(B t, B w, B x) { // TODO O(wia×xia) for small wia i32* rp; B r = m_i32arrv(&rp, xia); H_b2i* map = m_b2i(64); - BS2B xgetU = TI(x).getU; - BS2B wgetU = TI(w).getU; + BS2B xgetU = TI(x,getU); + BS2B wgetU = TI(w,getU); for (usz i = 0; i < wia; i++) { bool had; u64 p = mk_b2i(&map, wgetU(w,i), &had); if (!had) map->a[p].val = i; @@ -265,7 +265,7 @@ B memberOf_c1(B t, B x) { i32* rp; B r = m_i32arrv(&rp, xia); H_Sb* set = m_Sb(64); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < xia; i++) rp[i] = !ins_Sb(&set, xgetU(x,i)); free_Sb(set); dec(x); return r; @@ -277,8 +277,8 @@ B memberOf_c2(B t, B w, B x) { // TODO O(wia×xia) for small wia H_Sb* set = m_Sb(64); bool had; - BS2B xgetU = TI(x).getU; - BS2B wgetU = TI(w).getU; + BS2B xgetU = TI(x,getU); + BS2B wgetU = TI(w,getU); for (usz i = 0; i < xia; i++) mk_Sb(&set, xgetU(x,i), &had); i32* rp; B r = m_i32arrv(&rp, wia); for (usz i = 0; i < wia; i++) rp[i] = has_Sb(set, wgetU(w,i)); @@ -295,7 +295,7 @@ B find_c1(B t, B x) { B r = emptyHVec(); H_Sb* set = m_Sb(64); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < xia; i++) { B c = xgetU(x,i); if (!ins_Sb(&set, c)) r = vec_add(r, inc(c)); @@ -314,7 +314,7 @@ B count_c1(B t, B x) { usz xia = a(x)->ia; i32* rp; B r = m_i32arrv(&rp, xia); H_b2i* map = m_b2i(64); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < xia; i++) { bool had; u64 p = mk_b2i(&map, xgetU(x,i), &had); rp[i] = had? ++map->a[p].val : (map->a[p].val = 0); @@ -329,8 +329,8 @@ B count_c2(B t, B w, B x) { void fns_init() { - ti[t_funBI].print = print_funBI; - ti[t_funBI].identity = funBI_identity; - ti[t_funBI].fn_uc1 = funBI_uc1; - ti[t_funBI].fn_ucw = funBI_ucw; + TIi(t_funBI,print) = print_funBI; + TIi(t_funBI,identity) = funBI_identity; + TIi(t_funBI,fn_uc1) = funBI_uc1; + TIi(t_funBI,fn_ucw) = funBI_ucw; } diff --git a/src/builtins/grade.h b/src/builtins/grade.h index 4cd7d572..f2985a3b 100644 --- a/src/builtins/grade.h +++ b/src/builtins/grade.h @@ -18,7 +18,7 @@ B GRADE_CAT(c1)(B t, B x) { if (ia==0) { dec(x); return emptyIVec(); } i32* rp; B r = m_i32arrv(&rp, ia); - if (TI(x).elType==el_i32) { + if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); i32 min=I32_MAX, max=I32_MIN; for (usz i = 0; i < ia; i++) { @@ -55,7 +55,7 @@ B GRADE_CAT(c1)(B t, B x) { } TALLOC(BI32p, tmp, ia); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < ia; i++) { tmp[i].v = i; tmp[i].k = xgetU(x,i); @@ -78,8 +78,8 @@ B GRADE_CAT(c2)(B t, B w, B x) { w = toCells(w); xr = 1; } - u8 we = TI(w).elType; usz wia = a(w)->ia; - u8 xe = TI(x).elType; usz xia = a(x)->ia; + u8 we = TI(w,elType); usz wia = a(w)->ia; + u8 xe = TI(x,elType); usz xia = a(x)->ia; if (wia>I32_MAX-10) thrM(GRADE_CHR": 𝕨 too big"); i32* rp; B r = m_i32arrc(&rp, x); @@ -100,8 +100,8 @@ B GRADE_CAT(c2)(B t, B w, B x) { rp[i] = s; } } else { - BS2B wgetU = TI(w).getU; - BS2B xgetU = TI(x).getU; + BS2B wgetU = TI(w,getU); + BS2B xgetU = TI(x,getU); if (CHECK_VALID) for (i64 i = 0; i < (i64)wia-1; i++) if (compare(wgetU(w,i), wgetU(w,i+1)) GRADE_UD(>,<) 0) thrM(GRADE_CHR": 𝕨 must be sorted"GRADE_UD(," in descending order")); for (usz i = 0; i < xia; i++) { diff --git a/src/builtins/internal.c b/src/builtins/internal.c index d4a79f19..01d0ff71 100644 --- a/src/builtins/internal.c +++ b/src/builtins/internal.c @@ -75,7 +75,7 @@ B listVariations_c2(B t, B w, B x) { if (!isArr(w) || rnk(w)!=1) thrM("•internal.ListVariations: 𝕨 must be a list"); usz wia = a(w)->ia; - BS2B wgetU = TI(w).getU; + BS2B wgetU = TI(w,getU); bool c_incr=false, c_rmFill=false; for (usz i = 0; i < wia; i++) { u32 c = o2c(wgetU(w, i)); @@ -85,12 +85,12 @@ B listVariations_c2(B t, B w, B x) { } dec(w); - u8 xe = TI(x).elType; + u8 xe = TI(x,elType); B xf = getFillQ(x); bool ah = c_rmFill || noFill(xf); bool ai32=false, af64=false, ac32=false; usz xia = a(x)->ia; - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); if (isNum(xf)) { ai32=af64=true; if (xe!=el_i32) { @@ -151,9 +151,9 @@ static void variation_root() { B variation_c2(B t, B w, B x) { if (!isArr(x)) thrM("•internal.Variation: Non-array 𝕩"); usz xia = a(x)->ia; - u8 xe = TI(x).elType; - BS2B xget = TI(x).get; - BS2B xgetU = TI(x).getU; + u8 xe = TI(x,elType); + BS2B xget = TI(x,get); + BS2B xgetU = TI(x,getU); C32Arr* wc = toC32Arr(w); u32* wp = wc->a; u32* wpE = wp+wc->ia; @@ -192,7 +192,7 @@ B variation_c2(B t, B w, B x) { else for (usz i = 0; i < xia; i++) rp[i] = xget(x,i); } else thrF("•internal.Variation: Bad type \"%R\"", taga(wc)); if (slice) { - Arr* slice = TI(res).slice(res, 0); + Arr* slice = TI(res,slice)(res, 0); arr_shCopy(slice, res); res = taga(slice); } diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 6a33847d..6e8f69c4 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -51,8 +51,8 @@ B tbl_c2(B d, B w, B x) { B f = c(Md1D,d)->f; usz ria = wia*xia; ur rr = wr+xr; if (rrf; usz ia = a(x)->ia; if (ia==0) return x; B xf = getFillQ(x); - if (xr==1 && TI(x).elType==el_i32 && isFun(f) && v(f)->flags) { + if (xr==1 && TI(x,elType)==el_i32 && isFun(f) && v(f)->flags) { u8 rtid = v(f)->flags-1; i32* xp = i32any_ptr(x); if (rtid==0) { // + @@ -128,7 +128,7 @@ B scan_c1(B d, B x) { B f = c(Md1D,d)->f; bool reuse = v(x)->type==t_harr && reusable(x); usz i = 0; HArr_p r = reuse? harr_parts(x) : m_harrs(a(x)->ia, &i); - BS2B xget = reuse? TI(x).getU : TI(x).get; + BS2B xget = reuse? TI(x,getU) : TI(x,get); BBB2B fc2 = c2fn(f); if (xr==1) { @@ -147,7 +147,7 @@ B scan_c2(B d, B w, B x) { B f = c(Md1D,d)->f; B wf = getFillQ(w); bool reuse = (v(x)->type==t_harr && reusable(x)) | !ia; usz i = 0; - if (xr==1 && q_i32(w) && TI(x).elType==el_i32 && isFun(f) && v(f)->flags) { + if (xr==1 && q_i32(w) && TI(x,elType)==el_i32 && isFun(f) && v(f)->flags) { u8 rtid = v(f)->flags-1; i32* xp = i32any_ptr(x); i32 wv = o2iu(w); @@ -182,11 +182,11 @@ B scan_c2(B d, B w, B x) { B f = c(Md1D,d)->f; base:; HArr_p r = reuse? harr_parts(x) : m_harrs(a(x)->ia, &i); - BS2B xget = reuse? TI(x).getU : TI(x).get; + BS2B xget = reuse? TI(x,getU) : TI(x,get); BBB2B fc2 = c2fn(f); if (isArr(w)) { - ur wr = rnk(w); usz* wsh = a(w)->sh; BS2B wget = TI(w).get; + ur wr = rnk(w); usz* wsh = a(w)->sh; BS2B wget = TI(w,get); if (wr+1!=xr || !eqShPrefix(wsh, xsh+1, wr)) thrF("`: Shape of 𝕨 must match the cell of 𝕩 (%H ≡ ≢𝕨, %H ≡ ≢𝕩)", w, x); if (ia==0) return x; usz csz = arr_csz(x); @@ -205,7 +205,7 @@ B scan_c2(B d, B w, B x) { B f = c(Md1D,d)->f; B fold_c1(B d, B x) { B f = c(Md1D,d)->f; if (isAtm(x) || rnk(x)!=1) thrF("´: Argument must be a list (%H ≡ ≢𝕩)", x); usz ia = a(x)->ia; - if (TI(x).elType==el_i32 && isFun(f) && v(f)->flags) { + if (TI(x,elType)==el_i32 && isFun(f) && v(f)->flags) { u8 rtid = v(f)->flags-1; i32* xp = i32any_ptr(x); if (rtid==0) { // + @@ -247,17 +247,17 @@ B fold_c1(B d, B x) { B f = c(Md1D,d)->f; if (ia==0) { dec(x); if (isFun(f)) { - B r = TI(f).identity(f); + B r = TI(f,identity)(f); if (!isNothing(r)) return inc(r); } thrM("´: No identity found"); } base:; - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); BBB2B fc2 = c2fn(f); B c; - if (TI(x).elType==el_i32) { + if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); c = m_i32(xp[ia-1]); for (usz i = ia-1; i>0; i--) c = fc2(f, m_i32(xp[i-1]), c); @@ -271,7 +271,7 @@ B fold_c1(B d, B x) { B f = c(Md1D,d)->f; B fold_c2(B d, B w, B x) { B f = c(Md1D,d)->f; if (isAtm(x) || rnk(x)!=1) thrF("´: 𝕩 must be a list (%H ≡ ≢𝕩)", x); usz ia = a(x)->ia; - if (q_i32(w) && TI(x).elType==el_i32 && isFun(f) && v(f)->flags) { + if (q_i32(w) && TI(x,elType)==el_i32 && isFun(f) && v(f)->flags) { u8 rtid = v(f)->flags-1; i32* xp = i32any_ptr(x); i32 wv = o2iu(w); @@ -296,7 +296,7 @@ B fold_c2(B d, B w, B x) { B f = c(Md1D,d)->f; base:; B c = w; - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); BBB2B fc2 = c2fn(f); for (usz i = ia; i>0; i--) c = fc2(f, xget(x, i-1), c); dec(x); @@ -343,7 +343,7 @@ B cell_c1(B d, B x) { B f = c(Md1D,d)->f; memcpy(csh->a, a(x)->sh+1, sizeof(usz)*cr); } usz i = 0; - BS2A slice = TI(x).slice; + BS2A slice = TI(x,slice); HArr_p r = m_harrs(cam, &i); usz p = 0; for (; i < cam; i++) { @@ -371,5 +371,5 @@ B cell_c2(B d, B w, B x) { B f = c(Md1D,d)->f; static void print_md1BI(B x) { printf("%s", format_pm1(c(Md1,x)->extra)); } void md1_init() { - ti[t_md1BI].print = print_md1BI; + TIi(t_md1BI,print) = print_md1BI; } diff --git a/src/builtins/md2.c b/src/builtins/md2.c index e47e2b07..6dc3a36b 100644 --- a/src/builtins/md2.c +++ b/src/builtins/md2.c @@ -42,7 +42,7 @@ B catch_c2 (B d, B w, B x) { return c2(c(Md2D,d)->f, w,x); } extern B rt_undo; void repeat_bounds(i64* bound, B g) { // doesn't consume if (isArr(g)) { - BS2B xgetU = TI(g).getU; + BS2B xgetU = TI(g,getU); usz ia = a(g)->ia; for (usz i = 0; i < ia; i++) repeat_bounds(bound, xgetU(g, i)); } else if (isNum(g)) { @@ -53,7 +53,7 @@ void repeat_bounds(i64* bound, B g) { // doesn't consume } B repeat_replace(B g, B* q) { // doesn't consume if (isArr(g)) { - BS2B ggetU = TI(g).getU; + BS2B ggetU = TI(g,getU); usz ia = a(g)->ia; HArr_p r = m_harrUc(g); for (usz i = 0; i < ia; i++) r.a[i] = repeat_replace(ggetU(g,i), q); @@ -110,12 +110,12 @@ B over_c2(B d, B w, B x) { B xr=c1(c(Md2D,d)->g, x); return c2(c(Md2D,d)->f, c1( B cond_c1(B d, B x) { B g=c(Md2D,d)->g; if (isAtm(g)||rnk(g)!=1) thrM("◶: 𝕘 must have rank 1"); usz fr = WRAP(o2i64(c1(c(Md2D,d)->f, inc(x))), a(g)->ia, thrM("◶: 𝔽 out of bounds of 𝕘")); - return c1(TI(g).getU(g, fr), x); + return c1(TI(g,getU)(g, fr), x); } B cond_c2(B d, B w, B x) { B g=c(Md2D,d)->g; if (isAtm(g)||rnk(g)!=1) thrM("◶: 𝕘 must have rank 1"); usz fr = WRAP(o2i64(c2(c(Md2D,d)->f, inc(w), inc(x))), a(g)->ia, thrM("◶: 𝔽 out of bounds of 𝕘")); - return c2(TI(g).getU(g, fr), w, x); + return c2(TI(g,getU)(g, fr), w, x); } extern B rt_under, bi_before; @@ -126,7 +126,7 @@ B under_c1(B d, B x) { B f=c(Md2D,d)->f; B g=c(Md2D,d)->g; dec(fn); return r; } - return TI(g).fn_uc1(g, f, x); + return TI(g,fn_uc1)(g, f, x); } B under_c2(B d, B w, B x) { B f=c(Md2D,d)->f; B g=c(Md2D,d)->g; if (!isVal(g)) { @@ -136,22 +136,22 @@ B under_c2(B d, B w, B x) { B f=c(Md2D,d)->f; B g=c(Md2D,d)->g; return r; } B f2 = m2_d(inc(bi_before), c1(g, w), inc(f)); - B r = TI(g).fn_uc1(g, f2, x); + B r = TI(g,fn_uc1)(g, f2, x); dec(f2); return r; } B before_uc1(B t, B o, B f, B g, B x) { if (!isFun(g)) return def_m2_uc1(t, o, f, g, x); - return TI(g).fn_ucw(g, o, inc(f), x); + return TI(g,fn_ucw)(g, o, inc(f), x); } static void print_md2BI(B x) { printf("%s", format_pm2(c(Md1,x)->extra)); } void md2_init() { - ti[t_md2BI].print = print_md2BI; - ti[t_md2BI].m2_uc1 = md2BI_uc1; - ti[t_md2BI].m2_ucw = md2BI_ucw; + TIi(t_md2BI,print) = print_md2BI; + TIi(t_md2BI,m2_uc1) = md2BI_uc1; + TIi(t_md2BI,m2_ucw) = md2BI_ucw; c(BMd2,bi_before)->uc1 = before_uc1; } diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index f2940cd1..bc91526c 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -13,21 +13,21 @@ B shape_c1(B t, B x) { arr_shVec(a(x), ia); return x; } - Arr* r = TI(x).slice(x, 0); + Arr* r = TI(x,slice)(x, 0); arr_shVec(r, ia); return taga(r); } B shape_c2(B t, B w, B x) { if (isAtm(x)) { dec(x); dec(w); thrM("⥊: Reshaping non-array"); } if (isAtm(w)) return shape_c1(t, x); - BS2B wget = TI(w).get; + BS2B wget = TI(w,get); usz wia = a(w)->ia; if (wia>UR_MAX) thrM("⥊: Result rank too large"); ur nr = (ur)wia; usz nia = a(x)->ia; B r; Arr* ra; if (reusable(x)) { r = x; decSh(v(x)); ra = (Arr*)v(r); } - else { ra = TI(x).slice(x, 0); r = taga(ra); } + else { ra = TI(x,slice)(x, 0); r = taga(ra); } usz* sh = arr_shAllocI(ra, nia, nr); if (sh) for (u32 i = 0; i < nr; i++) sh[i] = o2s(wget(w,i)); dec(w); @@ -42,14 +42,14 @@ B pick_c1(B t, B x) { dec(x); return r; } - B r = TI(x).get(x, 0); + B r = TI(x,get)(x, 0); dec(x); return r; } B pick_c2(B t, B w, B x) { if (isNum(w) && isArr(x) && rnk(x)==1) { usz p = WRAP(o2i64(w), a(x)->ia, thrF("⊑: indexing out-of-bounds (𝕨≡%R, %s≡≠𝕩)", w, iaW)); - B r = TI(x).get(x, p); + B r = TI(x,get)(x, p); dec(x); return r; } @@ -62,7 +62,7 @@ B select_c1(B t, B x) { ur xr = rnk(x); if (xr==0) thrM("⊏: Argument cannot be rank 0"); if (a(x)->sh[0]==0) thrF("⊏: Argument shape cannot start with 0 (%H ≡ ≢𝕩)", x); - Arr* r = TI(x).slice(inc(x),0); + Arr* r = TI(x,slice)(inc(x),0); usz* sh = arr_shAllocR(r, xr-1); usz ia = 1; for (i32 i = 1; i < xr; i++) { @@ -81,21 +81,21 @@ B select_c2(B t, B w, B x) { usz csz = arr_csz(x); usz cam = a(x)->sh[0]; usz wi = WRAP(o2i64(w), cam, thrF("⊏: Indexing out-of-bounds (𝕨≡%R, %s≡≠𝕩)", w, cam)); - Arr* r = TI(x).slice(inc(x), wi*csz); + Arr* r = TI(x,slice)(inc(x), wi*csz); usz* sh = arr_shAllocI(r, csz, xr-1); if (sh) memcpy(sh, a(x)->sh+1, (xr-1)*sizeof(usz)); dec(x); return taga(r); } B xf = getFillQ(x); - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); usz wia = a(w)->ia; if (xr==1) { usz xia = a(x)->ia; - if (TI(w).elType==el_i32) { + if (TI(w,elType)==el_i32) { i32* wp = i32any_ptr(w); - if (TI(x).elType==el_i32) { + if (TI(x,elType)==el_i32) { i32* rp; B r = m_i32arrc(&rp, w); i32* xp = i32any_ptr(x); for (usz i = 0; i < wia; i++) { @@ -104,7 +104,7 @@ B select_c2(B t, B w, B x) { } dec(w); dec(x); return r; - } else if (TI(x).elType==el_f64) { + } else if (TI(x,elType)==el_f64) { f64* rp; B r = m_f64arrc(&rp, w); f64* xp = f64any_ptr(x); for (usz i = 0; i < wia; i++) { @@ -113,7 +113,7 @@ B select_c2(B t, B w, B x) { } dec(w); dec(x); return r; - } else if (TI(x).elType==el_c32) { + } else if (TI(x,elType)==el_c32) { u32* rp; B r = m_c32arrc(&rp, w); u32* xp = c32any_ptr(x); for (usz i = 0; i < wia; i++) { @@ -145,7 +145,7 @@ B select_c2(B t, B w, B x) { } else { usz i = 0; HArr_p r = m_harrs(wia, &i); - BS2B wgetU = TI(w).getU; + BS2B wgetU = TI(w,getU); for (; i < wia; i++) { B cw = wgetU(w, i); if (!isNum(cw)) { harr_abandon(r); goto base; } @@ -156,7 +156,7 @@ B select_c2(B t, B w, B x) { return withFill(harr_fcd(r,w),xf); } } else { - BS2B wgetU = TI(w).getU; + BS2B wgetU = TI(w,getU); ur wr = rnk(w); i32 rr = wr+xr-1; if (xr==0) thrM("⊏: 𝕩 cannot be a unit"); @@ -189,7 +189,7 @@ B select_c2(B t, B w, B x) { static NOINLINE B slash_c1R(B x, u64 s) { usz xia = a(x)->ia; - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); f64* rp; B r = m_f64arrv(&rp, s); usz ri = 0; for (usz i = 0; i < xia; i++) { usz c = o2s(xgetU(x, i)); @@ -206,14 +206,14 @@ B slash_c1(B t, B x) { usz xia = a(x)->ia; if (RARE(xia>=I32_MAX)) return slash_c1R(x, s); i32* rp; B r = m_i32arrv(&rp, s); usz ri = 0; - if (TI(x).elType==el_i32) { + if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); for (i32 i = 0; i < xia; i++) { if (RARE(xp[i])<0) thrF("/: Argument must consist of natural numbers (contained %i)", xp[i]); for (usz j = 0; j < xp[i]; j++) rp[ri++] = i; } } else { - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (i32 i = 0; i < xia; i++) { usz c = o2s(xgetU(x, i)); for (usz j = 0; j < c; j++) rp[ri++] = i; @@ -233,7 +233,7 @@ B slash_c2(B t, B w, B x) { B xf = getFillQ(x); usz ri = 0; - if (TI(w).elType==el_i32) { + if (TI(w,elType)==el_i32) { i32* wp = i32any_ptr(w); while (wia>0 && !wp[wia-1]) wia--; @@ -245,7 +245,7 @@ B slash_c2(B t, B w, B x) { } if (or>>31) thrM("/: 𝕨 must consist of natural numbers"); - if (TI(x).elType==el_i32) { + if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); i32* rp; B r = m_i32arrv(&rp, wsum); if (or<2) { @@ -262,7 +262,7 @@ B slash_c2(B t, B w, B x) { } dec(w); dec(x); return r; - } else if (TI(x).elType==el_f64) { + } else if (TI(x,elType)==el_f64) { f64* xp = f64any_ptr(x); f64* rp; B r = m_f64arrv(&rp, wsum); for (usz i = 0; i < wia; i++) { @@ -274,7 +274,7 @@ B slash_c2(B t, B w, B x) { return r; } else { HArr_p r = m_harrs(wsum, &ri); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < wia; i++) { i32 cw = wp[i]; if (cw==0) continue; @@ -288,8 +288,8 @@ B slash_c2(B t, B w, B x) { i64 ria = isum(w); if (ria>USZ_MAX) thrOOM(); HArr_p r = m_harrs(ria, &ri); - BS2B wgetU = TI(w).getU; - BS2B xgetU = TI(x).getU; + BS2B wgetU = TI(w,getU); + BS2B xgetU = TI(x,getU); for (usz i = 0; i < wia; i++) { usz c = o2s(wgetU(w, i)); if (c) { @@ -306,12 +306,12 @@ B slash_c2(B t, B w, B x) { i32 wv = o2i(w); if (wv<=0) { if (wv<0) thrM("/: 𝕨 cannot be negative"); - Arr* r = TI(x).slice(x, 0); + Arr* r = TI(x,slice)(x, 0); arr_shVec(r,0); return taga(r); } usz ri = 0; - if (TI(x).elType==el_i32) { + if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); i32* rp; B r = m_i32arrv(&rp, xia*wv); for (usz i = 0; i < xia; i++) { @@ -322,7 +322,7 @@ B slash_c2(B t, B w, B x) { } else { B xf = getFillQ(x); HArr_p r = m_harrUv(xia*wv); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < xia; i++) { B cx = xgetU(x, i); for (usz j = 0; j < wv; j++) r.a[ri++] = inc(cx); @@ -336,7 +336,7 @@ B slash_c2(B t, B w, B x) { B slicev(B x, usz s, usz ia) { usz xia = a(x)->ia; assert(s+ia <= xia); - Arr* r = TI(x).slice(x, s); + Arr* r = TI(x,slice)(x, s); arr_shVec(r, ia); return taga(r); } @@ -403,7 +403,7 @@ B join_c1(B t, B x) { dec(xf); return withFill(r.b, xff); } - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); B x0 = xgetU(x,0); B rf; if(SFNS_FILLS) rf = getFillQ(x0); @@ -456,8 +456,8 @@ B join_c2(B t, B w, B x) { ur c = wr>xr?wr:xr; if (c==0) { HArr_p r = m_harrUv(2); - r.a[0] = TI(w).get(w,0); dec(w); - r.a[1] = TI(x).get(x,0); dec(x); + r.a[0] = TI(w,get)(w,0); dec(w); + r.a[1] = TI(x,get)(x,0); dec(x); return qWithFill(r.b, f); } if (c-wr > 1 || c-xr > 1) thrF("∾: Argument ranks must differ by 1 or less (%i≡=𝕨, %i≡=𝕩)", wr, xr); @@ -467,7 +467,7 @@ B join_c2(B t, B w, B x) { return qWithFill(r, f); } MAKE_MUT(r, wia+xia); - mut_to(r, el_or(TI(w).elType, TI(x).elType)); + mut_to(r, el_or(TI(w,elType), TI(x,elType))); mut_copy(r, 0, w, 0, wia); mut_copy(r, wia, x, 0, xia); Arr* ra = mut_fp(r); @@ -489,7 +489,7 @@ B couple_c1(B t, B x) { if (isArr(x)) { usz rr = rnk(x); usz ia = a(x)->ia; - Arr* r = TI(x).slice(inc(x),0); + Arr* r = TI(x,slice)(inc(x),0); usz* sh = arr_shAllocI(r, ia, rr+1); if (sh) { sh[0] = 1; memcpy(sh+1, a(x)->sh, rr*sizeof(usz)); } dec(x); @@ -540,7 +540,7 @@ B shiftb_c1(B t, B x) { B xf = getFillE(x); usz csz = arr_csz(x); - MAKE_MUT(r, ia); mut_to(r, TI(x).elType); + MAKE_MUT(r, ia); mut_to(r, TI(x,elType)); mut_copy(r, csz, x, 0, ia-csz); mut_fill(r, 0, xf, csz); return qWithFill(mut_fcd(r, x), xf); @@ -552,7 +552,7 @@ B shiftb_c2(B t, B w, B x) { B f = fill_both(w, x); usz wia = a(w)->ia; usz xia = a(x)->ia; - MAKE_MUT(r, xia); mut_to(r, el_or(TI(w).elType, TI(x).elType)); + MAKE_MUT(r, xia); mut_to(r, el_or(TI(w,elType), TI(x,elType))); int mid = wiaia; usz xia = a(x)->ia; - MAKE_MUT(r, xia); mut_to(r, el_or(TI(w).elType, TI(x).elType)); + MAKE_MUT(r, xia); mut_to(r, el_or(TI(w,elType), TI(x,elType))); if (wia < xia) { usz m = xia-wia; mut_copy(r, 0, x, wia, m); @@ -600,7 +600,7 @@ B group_c2(B t, B w, B x) { usz xia = a(x)->ia; if (wia-xia > 1) thrF("⊔: ≠𝕨 must be either ≠𝕩 or one bigger (%s≡≠𝕨, %s≡≠𝕩)", wia, xia); - if (TI(w).elType==el_i32) { + if (TI(w,elType)==el_i32) { i32* wp = i32any_ptr(w); i64 ria = wia==xia? 0 : wp[xia]; if (ria<-1) thrM("⊔: 𝕨 can't contain elements less than ¯1"); @@ -626,14 +626,14 @@ B group_c2(B t, B w, B x) { 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) { + 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); for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) i32arr_ptr(rp[n])[pos[n]++] = xp[i]; } - } else if (TI(x).elType==el_c32) { + } else if (TI(x,elType)==el_c32) { for (usz i = 0; i < ria; i++) { u32* t; rp[i] = m_c32arrv(&t, len[i]); } u32* xp = c32any_ptr(x); for (usz i = 0; i < xia; i++) { @@ -647,7 +647,7 @@ B group_c2(B t, B w, B x) { c->ia = 0; rp[i] = taga(c); } - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); for (usz i = 0; i < xia; i++) { i32 n = wp[i]; if (n>=0) fillarr_ptr(a(rp[n]))[pos[n]++] = xget(x, i); @@ -658,7 +658,7 @@ B group_c2(B t, B w, B x) { dec(w); dec(x); TFREE(lenO); TFREE(pos); return taga(r); } else { - BS2B wgetU = TI(w).getU; + BS2B wgetU = TI(w,getU); i64 ria = wia==xia? 0 : o2i64(wgetU(w, xia)); if (ria<-1) thrM("⊔: 𝕨 can't contain elements less than ¯1"); ria--; @@ -692,7 +692,7 @@ B group_c2(B t, B w, B x) { arr_shVec(rf, 0); fillarr_setFill(rf, xf); fillarr_setFill(r, taga(rf)); - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); for (usz i = 0; i < xia; i++) { i64 n = o2i64u(wgetU(w, i)); if (n>=0) fillarr_ptr(a(rp[n]))[pos[n]++] = xget(x, i); @@ -710,7 +710,7 @@ extern B rt_reverse; B reverse_c1(B t, B x) { if (isAtm(x) || rnk(x)==0) thrM("⌽: Argument cannot be a unit"); B xf = getFillQ(x); - u8 xe = TI(x).elType; + u8 xe = TI(x,elType); usz xia = a(x)->ia; if (rnk(x)==1) { if (xe==el_i32) { @@ -744,7 +744,7 @@ B reverse_c2(B t, B w, B x) { i64 am = o2i64(w); if ((usz)am >= cam) { am%= cam; if(am<0) am+= cam; } am*= csz; - MAKE_MUT(r, xia); mut_to(r, TI(x).elType); + MAKE_MUT(r, xia); mut_to(r, TI(x,elType)); mut_copy(r, 0, x, am, xia-am); mut_copy(r, xia-am, x, 0, am); return withFill(mut_fcd(r, x), xf); @@ -758,9 +758,9 @@ B pick_uc1(B t, B o, B x) { if (isAtm(x) || a(x)->ia==0) return def_fn_uc1(t, o, x); B xf = getFillQ(x); usz ia = a(x)->ia; - B arg = TI(x).get(x, 0); + B arg = TI(x,get)(x, 0); B rep = c1(o, arg); - MAKE_MUT(r, ia); mut_to(r, el_or(TI(x).elType, selfElType(rep))); + MAKE_MUT(r, ia); mut_to(r, el_or(TI(x,elType), selfElType(rep))); mut_set(r, 0, rep); mut_copy(r, 1, x, 1, ia-1); return qWithFill(mut_fcd(r, x), xf); @@ -771,10 +771,10 @@ B pick_ucw(B t, B o, B w, B x) { usz xia = a(x)->ia; usz wi = WRAP(o2i64(w), xia, thrF("𝔽⌾(n⊸⊑)𝕩: reading out-of-bounds (n≡%R, %s≡≠𝕩)", w, xia)); B xf = getFillQ(x); - B arg = TI(x).get(x, wi); + B arg = TI(x,get)(x, wi); B rep = c1(o, arg); - if (reusable(x) && TI(x).canStore(rep)) { - if (TI(x).elType==el_i32) { + if (reusable(x) && TI(x,canStore)(rep)) { + if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); xp[wi] = o2i(rep); return x; @@ -783,7 +783,7 @@ B pick_ucw(B t, B o, B w, B x) { dec(xp[wi]); xp[wi] = rep; return x; - } else if (TI(x).elType==el_f64) { + } else if (TI(x,elType)==el_f64) { f64* xp = f64any_ptr(x); xp[wi] = o2f(rep); return x; @@ -794,7 +794,7 @@ B pick_ucw(B t, B o, B w, B x) { return x; } } - MAKE_MUT(r, xia); mut_to(r, el_or(TI(x).elType, selfElType(rep))); + MAKE_MUT(r, xia); mut_to(r, el_or(TI(x,elType), selfElType(rep))); mut_set(r, wi, rep); mut_copy(r, 0, x, 0, wi); mut_copy(r, wi+1, x, wi+1, xia-wi-1); @@ -804,16 +804,16 @@ B pick_ucw(B t, B o, B w, B x) { B slash_ucw(B t, B o, B w, B x) { if (isAtm(w) || isAtm(x) || rnk(w)!=1 || rnk(x)!=1 || a(w)->ia!=a(x)->ia) return def_fn_ucw(t, o, w, x); usz ia = a(x)->ia; - BS2B wgetU = TI(w).getU; - if (TI(w).elType!=el_i32) for (usz i = 0; i < ia; i++) if (!q_i32(wgetU(w,i))) return def_fn_ucw(t, o, w, x); + BS2B wgetU = TI(w,getU); + if (TI(w,elType)!=el_i32) for (usz i = 0; i < ia; i++) if (!q_i32(wgetU(w,i))) return def_fn_ucw(t, o, w, x); B arg = slash_c2(t, inc(w), inc(x)); usz argIA = a(arg)->ia; B rep = c1(o, arg); if (isAtm(rep) || rnk(rep)!=1 || a(rep)->ia != argIA) thrF("𝔽⌾(a⊸/)𝕩: Result of 𝔽 must have the same shape as a/𝕩 (expected ⟨%s⟩, got %H)", argIA, rep); - MAKE_MUT(r, ia); mut_to(r, el_or(TI(x).elType, TI(rep).elType)); - BS2B xget = TI(x).get; - BS2B rgetU = TI(rep).getU; - BS2B rget = TI(rep).get; + MAKE_MUT(r, ia); mut_to(r, el_or(TI(x,elType), TI(rep,elType))); + BS2B xget = TI(x,get); + BS2B rgetU = TI(rep,getU); + BS2B rget = TI(rep,get); usz repI = 0; for (usz i = 0; i < ia; i++) { i32 cw = o2iu(wgetU(w, i)); @@ -832,8 +832,8 @@ B select_ucw(B t, B o, B w, B x) { if (isAtm(x) || rnk(x)!=1 || isAtm(w) || rnk(w)!=1) return def_fn_ucw(t, o, w, x); usz xia = a(x)->ia; usz wia = a(w)->ia; - BS2B wgetU = TI(w).getU; - if (TI(w).elType!=el_i32) for (usz i = 0; i < wia; i++) if (!q_i64(wgetU(w,i))) return def_fn_ucw(t, o, w, x); + BS2B wgetU = TI(w,getU); + if (TI(w,elType)!=el_i32) for (usz i = 0; i < wia; i++) if (!q_i64(wgetU(w,i))) return def_fn_ucw(t, o, w, x); B arg = select_c2(t, inc(w), inc(x)); B rep = c1(o, arg); if (isAtm(rep) || rnk(rep)!=1 || a(rep)->ia != wia) thrF("𝔽⌾(a⊸⊏)𝕩: Result of 𝔽 must have the same shape as a⊏𝕩 (expected ⟨%s⟩, got %H)", wia, rep); @@ -846,9 +846,9 @@ B select_ucw(B t, B o, B w, B x) { #define EQ(F) #define FREE_CHECK #endif - if (TI(w).elType==el_i32) { + if (TI(w,elType)==el_i32) { i32* wp = i32any_ptr(w); - if (reusable(x) && TI(x).elType==TI(rep).elType) { + if (reusable(x) && TI(x,elType)==TI(rep,elType)) { if (v(x)->type==t_i32arr) { i32* xp = i32arr_ptr(x); i32* rp = i32any_ptr(rep); @@ -862,7 +862,7 @@ B select_ucw(B t, B o, B w, B x) { return x; } else if (v(x)->type==t_harr) { B* xp = harr_ptr(x); - BS2B rget = TI(rep).get; + BS2B rget = TI(rep,get); for (usz i = 0; i < wia; i++) { i64 cw = wp[i]; if (cw<0) cw+= (i64)xia; B cr = rget(rep, i); @@ -874,9 +874,9 @@ B select_ucw(B t, B o, B w, B x) { return x; } } - MAKE_MUT(r, xia); mut_to(r, el_or(TI(x).elType, TI(rep).elType)); + MAKE_MUT(r, xia); mut_to(r, el_or(TI(x,elType), TI(rep,elType))); mut_copy(r, 0, x, 0, xia); - BS2B rget = TI(rep).get; + BS2B rget = TI(rep,get); for (usz i = 0; i < wia; i++) { i64 cw = wp[i]; if (cw<0) cw+= (i64)xia; B cr = rget(rep, i); @@ -887,9 +887,9 @@ B select_ucw(B t, B o, B w, B x) { dec(w); dec(rep); FREE_CHECK; return mut_fcd(r, x); } - MAKE_MUT(r, xia); mut_to(r, el_or(TI(x).elType, TI(rep).elType)); + MAKE_MUT(r, xia); mut_to(r, el_or(TI(x,elType), TI(rep,elType))); mut_copy(r, 0, x, 0, xia); - BS2B rget = TI(rep).get; + BS2B rget = TI(rep,get); for (usz i = 0; i < wia; i++) { i64 cw = o2i64u(wgetU(w, i)); if (cw<0) cw+= (i64)xia; B cr = rget(rep, i); diff --git a/src/builtins/sort.c b/src/builtins/sort.c index c4874cdb..94f638c7 100644 --- a/src/builtins/sort.c +++ b/src/builtins/sort.c @@ -31,7 +31,7 @@ B and_c1(B t, B x) { if (isAtm(x) || rnk(x)==0) thrM("∧: Argument cannot have rank 0"); if (rnk(x)!=1) return bqn_merge(and_c1(t, toCells(x))); usz xia = a(x)->ia; - if (TI(x).elType==el_i32) { + if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); i32* rp; B r = m_i32arrv(&rp, xia); memcpy(rp, xp, xia*4); @@ -41,7 +41,7 @@ B and_c1(B t, B x) { } B xf = getFillQ(x); HArr_p r = m_harrUv(xia); - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); for (usz i = 0; i < xia; i++) r.a[i] = xget(x,i); bA_tim_sort(r.a, xia); dec(x); @@ -63,7 +63,7 @@ B or_c1(B t, B x) { if (isAtm(x) || rnk(x)==0) thrM("∨: Argument cannot have rank 0"); if (rnk(x)!=1) return bqn_merge(or_c1(t, toCells(x))); usz xia = a(x)->ia; - if (TI(x).elType==el_i32) { + if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); i32* rp; B r = m_i32arrv(&rp, xia); memcpy(rp, xp, xia*4); @@ -73,7 +73,7 @@ B or_c1(B t, B x) { } B xf = getFillQ(x); HArr_p r = m_harrUv(xia); - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); for (usz i = 0; i < xia; i++) r.a[i] = xget(x,i); bD_tim_sort(r.a, xia); dec(x); diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index b935ad0c..1bc82857 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -24,7 +24,7 @@ B type_c1(B t, B x) { B decp_c1(B t, B x) { if (!isVal(x)) return m_v2(m_i32(-1), x); if (v(x)->flags) return m_v2(m_i32(0), x); - return TI(x).decompose(x); + return TI(x,decompose)(x); } B primInd_c1(B t, B x) { @@ -70,7 +70,7 @@ B fill_c2(B t, B w, B x) { // TODO not set fill for typed arrays B grLen_both(i64 ria, B x) { usz ia = a(x)->ia; - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < ia; i++) { i64 c = o2i64u(xgetU(x, i)); if (c>ria) ria = c; @@ -95,8 +95,8 @@ B grOrd_c2(B t, B w, B x) { // assumes valid arguments usz xia = a(x)->ia; if (wia==0) { dec(w); dec(x); return emptyIVec(); } if (xia==0) { dec(w); return x; } - BS2B wgetU = TI(w).getU; - BS2B xgetU = TI(x).getU; + BS2B wgetU = TI(w,getU); + BS2B xgetU = TI(x,getU); TALLOC(usz, tmp, wia); tmp[0] = 0; for (usz i = 1; i < wia; i++) tmp[i] = tmp[i-1]+o2su(wgetU(w,i-1)); @@ -136,10 +136,10 @@ B casrt_c2(B t, B w, B x) { unwindCompiler(); dec(x); if (isArr(w) && a(w)->ia==2) { - B w0 = TI(w).getU(w,0); + B w0 = TI(w,getU)(w,0); if (!isArr(w0) || a(w0)->ia<2) goto base; - B s = TI(w).get(w,1); - BS2B w0getU = TI(w0).getU; + B s = TI(w,get)(w,1); + BS2B w0getU = TI(w0,getU); AFMT("\n"); s = vm_fmtPoint(comp_currSrc, s, comp_currPath, o2s(w0getU(w0,0)), o2s(w0getU(w0,1))+1); dec(w); @@ -166,7 +166,7 @@ B bqn_c1(B t, B x) { if (isAtm(x) || rnk(x)!=1) thrM("•BQN: Argument must be a character vector"); if (a(x)->type!=t_c32arr && a(x)->type!=t_c32slice) { usz ia = a(x)->ia; - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < ia; i++) if (!isC32(xgetU(x,i))) thrM("•BQN: Argument must be a character vector"); } return bqn_exec(x, bi_N, bi_N); @@ -325,7 +325,7 @@ B sys_c1(B t, B x) { assert(isArr(x)); usz i = 0; HArr_p r = m_harrs(a(x)->ia, &i); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); B fileNS = m_f64(0); for (; i < a(x)->ia; i++) { B c = xgetU(x,i); diff --git a/src/core.h b/src/core.h index f45ba616..b1808bfe 100644 --- a/src/core.h +++ b/src/core.h @@ -41,7 +41,7 @@ static i64 isum(B x) { // doesn't consume; may error; TODO error on overflow assert(isArr(x)); i64 r = 0; usz xia = a(x)->ia; - u8 xe = TI(x).elType; + u8 xe = TI(x,elType); if (xe==el_i32) { i32* p = i32any_ptr(x); for (usz i = 0; i < xia; i++) r+= p[i]; @@ -49,7 +49,7 @@ static i64 isum(B x) { // doesn't consume; may error; TODO error on overflow f64* p = f64any_ptr(x); for (usz i = 0; i < xia; i++) { if(p[i]!=(f64)p[i]) thrM("Expected integer"); r+= p[i]; } } else { - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < xia; i++) r+= o2i64(xgetU(x,i)); } return r; diff --git a/src/core/c32arr.c b/src/core/c32arr.c index 196e5375..39452f71 100644 --- a/src/core/c32arr.c +++ b/src/core/c32arr.c @@ -34,16 +34,16 @@ static void c32arr_free(Value* x) { decSh(x); } static bool c32arr_canStore(B x) { return isC32(x); } void c32arr_init() { - ti[t_c32arr].get = c32arr_get; ti[t_c32slice].get = c32slice_get; - ti[t_c32arr].getU = c32arr_get; ti[t_c32slice].getU = c32slice_get; - ti[t_c32arr].slice = c32arr_slice; ti[t_c32slice].slice = c32slice_slice; - ti[t_c32arr].free = c32arr_free; ti[t_c32slice].free = slice_free; - ti[t_c32arr].visit = noop_visit; ti[t_c32slice].visit = slice_visit; - ti[t_c32arr].print = arr_print; ti[t_c32slice].print = arr_print; - ti[t_c32arr].isArr = true; ti[t_c32slice].isArr = true; - ti[t_c32arr].arrD1 = true; ti[t_c32slice].arrD1 = true; - ti[t_c32arr].elType = el_c32; ti[t_c32slice].elType = el_c32; - ti[t_c32arr].canStore = c32arr_canStore; + TIi(t_c32arr,get) = c32arr_get; TIi(t_c32slice,get) = c32slice_get; + TIi(t_c32arr,getU) = c32arr_get; TIi(t_c32slice,getU) = c32slice_get; + TIi(t_c32arr,slice) = c32arr_slice; TIi(t_c32slice,slice) = c32slice_slice; + TIi(t_c32arr,free) = c32arr_free; TIi(t_c32slice,free) = slice_free; + TIi(t_c32arr,visit) = noop_visit; TIi(t_c32slice,visit) = slice_visit; + TIi(t_c32arr,print) = arr_print; TIi(t_c32slice,print) = arr_print; + TIi(t_c32arr,isArr) = true; TIi(t_c32slice,isArr) = true; + TIi(t_c32arr,arrD1) = true; TIi(t_c32slice,arrD1) = true; + TIi(t_c32arr,elType) = el_c32; TIi(t_c32slice,elType) = el_c32; + TIi(t_c32arr,canStore) = c32arr_canStore; u32* tmp; bi_emptyCVec = m_c32arrv(&tmp, 0); gc_add(bi_emptyCVec); diff --git a/src/core/c32arr.h b/src/core/c32arr.h index e63bd676..69b38abe 100644 --- a/src/core/c32arr.h +++ b/src/core/c32arr.h @@ -39,14 +39,14 @@ static C32Arr* toC32Arr(B x) { if (v(x)->type==t_c32arr) return c(C32Arr,x); u32* rp; B r = m_c32arrc(&rp, x); usz ia = a(r)->ia; - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < ia; i++) rp[i] = o2c(xgetU(x,i)); dec(x); return c(C32Arr,r); } static bool eqStr(B w, u32* x) { if (isAtm(w) || rnk(w)!=1) return false; - BS2B wgetU = TI(w).getU; + BS2B wgetU = TI(w,getU); u64 i = 0; while (x[i]) { B c = wgetU(w, i); diff --git a/src/core/derv.c b/src/core/derv.c index 1cc3737b..1fb6a0fe 100644 --- a/src/core/derv.c +++ b/src/core/derv.c @@ -40,16 +40,16 @@ static B md2D_uc1(B t, B o, B x) { B f = c(Md2D, t)->f; B g = c(Md2D, t)->g; if (v(t)->flags || !isMd2(m)) return def_fn_uc1(t, o, x); // flags check to not deconstruct builtins - return TI(m).m2_uc1(m, o, f, g, x); + return TI(m,m2_uc1)(m, o, f, g, x); } void derv_init() { - ti[t_md1D].free = md1D_free; ti[t_md1D].visit = md1D_visit; ti[t_md1D].print = md1D_print; ti[t_md1D].decompose = md1D_decompose; - ti[t_md2D].free = md2D_free; ti[t_md2D].visit = md2D_visit; ti[t_md2D].print = md2D_print; ti[t_md2D].decompose = md2D_decompose; ti[t_md2D].fn_uc1 = md2D_uc1; - ti[t_md2H].free = md2H_free; ti[t_md2H].visit = md2H_visit; ti[t_md2H].print = md2H_print; ti[t_md2H].decompose = md2H_decompose; - ti[t_fork].free = fork_free; ti[t_fork].visit = fork_visit; ti[t_fork].print = fork_print; ti[t_fork].decompose = fork_decompose; - ti[t_atop].free = atop_free; ti[t_atop].visit = atop_visit; ti[t_atop].print = atop_print; ti[t_atop].decompose = atop_decompose; - ti[t_md1BI].m1_d = m_md1D; - ti[t_md2BI].m2_d = m_md2D; + TIi(t_md1D,free) = md1D_free; TIi(t_md1D,visit) = md1D_visit; TIi(t_md1D,print) = md1D_print; TIi(t_md1D,decompose) = md1D_decompose; + TIi(t_md2D,free) = md2D_free; TIi(t_md2D,visit) = md2D_visit; TIi(t_md2D,print) = md2D_print; TIi(t_md2D,decompose) = md2D_decompose; TIi(t_md2D,fn_uc1) = md2D_uc1; + TIi(t_md2H,free) = md2H_free; TIi(t_md2H,visit) = md2H_visit; TIi(t_md2H,print) = md2H_print; TIi(t_md2H,decompose) = md2H_decompose; + TIi(t_fork,free) = fork_free; TIi(t_fork,visit) = fork_visit; TIi(t_fork,print) = fork_print; TIi(t_fork,decompose) = fork_decompose; + TIi(t_atop,free) = atop_free; TIi(t_atop,visit) = atop_visit; TIi(t_atop,print) = atop_print; TIi(t_atop,decompose) = atop_decompose; + TIi(t_md1BI,m1_d) = m_md1D; + TIi(t_md2BI,m2_d) = m_md2D; } diff --git a/src/core/derv.h b/src/core/derv.h index c1b2dd4e..0013a327 100644 --- a/src/core/derv.h +++ b/src/core/derv.h @@ -42,6 +42,6 @@ static B m_fork(B f, B g, B h) { Fork* r = mm_alloc(sizeof(Fork), t_fork); r->f static B m_atop( B g, B h) { Atop* r = mm_alloc(sizeof(Atop), t_atop); r->g = g; r->h = h; r->c1=tr2D_c1; r->c2=tr2D_c2; return tag(r,FUN_TAG); } // consume all args -static B m1_d(B m, B f ) { if(isMd1(m)) return TI(m).m1_d(m, f ); thrM("Interpreting non-1-modifier as 1-modifier"); } -static B m2_d(B m, B f, B g) { if(isMd2(m)) return TI(m).m2_d(m, f, g); thrM("Interpreting non-2-modifier as 2-modifier"); } +static B m1_d(B m, B f ) { if(isMd1(m)) return TI(m,m1_d)(m, f ); thrM("Interpreting non-1-modifier as 1-modifier"); } +static B m2_d(B m, B f, B g) { if(isMd2(m)) return TI(m,m2_d)(m, f, g); thrM("Interpreting non-2-modifier as 2-modifier"); } static B m2_h(B m, B g) { return m_md2H(m, g); } diff --git a/src/core/f64arr.c b/src/core/f64arr.c index 493302ff..aa590099 100644 --- a/src/core/f64arr.c +++ b/src/core/f64arr.c @@ -21,14 +21,14 @@ static void f64arr_free(Value* x) { decSh(x); } static bool f64arr_canStore(B x) { return q_f64(x); } void f64arr_init() { - ti[t_f64arr].get = f64arr_get; ti[t_f64slice].get = f64slice_get; - ti[t_f64arr].getU = f64arr_get; ti[t_f64slice].getU = f64slice_get; - ti[t_f64arr].slice = f64arr_slice; ti[t_f64slice].slice = f64slice_slice; - ti[t_f64arr].free = f64arr_free; ti[t_f64slice].free = slice_free; - ti[t_f64arr].visit = noop_visit; ti[t_f64slice].visit = slice_visit; - ti[t_f64arr].print = arr_print; ti[t_f64slice].print = arr_print; - ti[t_f64arr].isArr = true; ti[t_f64slice].isArr = true; - ti[t_f64arr].arrD1 = true; ti[t_f64slice].arrD1 = true; - ti[t_f64arr].elType = el_f64; ti[t_f64slice].elType = el_f64; - ti[t_f64arr].canStore = f64arr_canStore; + TIi(t_f64arr,get) = f64arr_get; TIi(t_f64slice,get) = f64slice_get; + TIi(t_f64arr,getU) = f64arr_get; TIi(t_f64slice,getU) = f64slice_get; + TIi(t_f64arr,slice) = f64arr_slice; TIi(t_f64slice,slice) = f64slice_slice; + TIi(t_f64arr,free) = f64arr_free; TIi(t_f64slice,free) = slice_free; + TIi(t_f64arr,visit) = noop_visit; TIi(t_f64slice,visit) = slice_visit; + TIi(t_f64arr,print) = arr_print; TIi(t_f64slice,print) = arr_print; + TIi(t_f64arr,isArr) = true; TIi(t_f64slice,isArr) = true; + TIi(t_f64arr,arrD1) = true; TIi(t_f64slice,arrD1) = true; + TIi(t_f64arr,elType) = el_f64; TIi(t_f64slice,elType) = el_f64; + TIi(t_f64arr,canStore) = f64arr_canStore; } diff --git a/src/core/f64arr.h b/src/core/f64arr.h index f24d583f..2d459eeb 100644 --- a/src/core/f64arr.h +++ b/src/core/f64arr.h @@ -36,7 +36,7 @@ static F64Arr* toF64Arr(B x) { if (v(x)->type==t_f64arr) return c(F64Arr,x); f64* rp; B r = m_f64arrc(&rp, x); usz ia = a(r)->ia; - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < ia; i++) rp[i] = o2f(xgetU(x,i)); dec(x); return c(F64Arr,r); diff --git a/src/core/fillarr.c b/src/core/fillarr.c index 1fbb71ea..edf82c41 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -2,7 +2,7 @@ B asFill(B x) { // consumes if (isArr(x)) { - u8 xe = TI(x).elType; + u8 xe = TI(x,elType); usz ia = a(x)->ia; if (xe<=el_f64) { i32* rp; B r = m_i32arrc(&rp, x); @@ -17,7 +17,7 @@ B asFill(B x) { // consumes return r; } HArr_p r = m_harrUc(x); - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); bool noFill = false; for (usz i = 0; i < ia; i++) if ((r.a[i]=asFill(xget(x,i))).u == bi_noFill.u) noFill = true; B xf = getFillQ(x); @@ -60,21 +60,21 @@ static void fillarr_visit(Value* x) { assert(x->type == t_fillarr); static bool fillarr_canStore(B x) { return true; } void fillarr_init() { - ti[t_fillarr].get = fillarr_get; ti[t_fillslice].get = fillslice_get; - ti[t_fillarr].getU = fillarr_getU; ti[t_fillslice].getU = fillslice_getU; - ti[t_fillarr].slice = fillarr_slice; ti[t_fillslice].slice = fillslice_slice; - ti[t_fillarr].free = fillarr_free; ti[t_fillslice].free = slice_free; - ti[t_fillarr].visit = fillarr_visit; ti[t_fillslice].visit = slice_visit; - ti[t_fillarr].print = arr_print; ti[t_fillslice].print = arr_print; - ti[t_fillarr].isArr = true; ti[t_fillslice].isArr = true; - ti[t_fillarr].canStore = fillarr_canStore; + TIi(t_fillarr,get) = fillarr_get; TIi(t_fillslice,get) = fillslice_get; + TIi(t_fillarr,getU) = fillarr_getU; TIi(t_fillslice,getU) = fillslice_getU; + TIi(t_fillarr,slice) = fillarr_slice; TIi(t_fillslice,slice) = fillslice_slice; + TIi(t_fillarr,free) = fillarr_free; TIi(t_fillslice,free) = slice_free; + TIi(t_fillarr,visit) = fillarr_visit; TIi(t_fillslice,visit) = slice_visit; + TIi(t_fillarr,print) = arr_print; TIi(t_fillslice,print) = arr_print; + TIi(t_fillarr,isArr) = true; TIi(t_fillslice,isArr) = true; + TIi(t_fillarr,canStore) = fillarr_canStore; } void validateFill(B x) { if (isArr(x)) { - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); usz ia = a(x)->ia; for (usz i = 0; i < ia; i++) validateFill(xgetU(x,i)); } else if (isF64(x)) { @@ -89,15 +89,15 @@ NOINLINE bool fillEqualR(B w, B x) { // doesn't consume; both args must be array usz ia = a(w)->ia; if (ia==0) return true; - u8 we = TI(w).elType; - u8 xe = TI(x).elType; + u8 we = TI(w,elType); + u8 xe = TI(x,elType); if (we!=el_B && xe!=el_B) { if (we==el_c32 ^ xe==el_c32) return false; assert(we==el_c32 & xe==el_c32 || we<=el_f64 & xe<=el_f64); return true; } - BS2B xgetU = TI(x).getU; - BS2B wgetU = TI(w).getU; + BS2B xgetU = TI(x,getU); + BS2B wgetU = TI(w,getU); for (usz i = 0; i < ia; i++) if(!fillEqual(wgetU(w,i),xgetU(x,i))) return false; return true; } @@ -149,7 +149,7 @@ B withFill(B x, B fill) { // consumes both return r; } } else { - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); { i32* rp; B r = m_i32arrc(&rp, x); for (usz i = 0; i < ia; i++) { @@ -191,7 +191,7 @@ B withFill(B x, B fill) { // consumes both } } else if (isC32(fill)) { u32* rp; B r = m_c32arrc(&rp, x); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < ia; i++) { B c = xgetU(x, i); if (!isC32(c)) { dec(r); goto base; } @@ -205,7 +205,7 @@ B withFill(B x, B fill) { // consumes both arr_shCopy((Arr*)r, x); r->fill = fill; B* a = r->a; - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); for (usz i = 0; i < ia; i++) a[i] = xget(x,i); dec(x); return taga(r); diff --git a/src/core/fillarr.h b/src/core/fillarr.h index e25cf267..09915587 100644 --- a/src/core/fillarr.h +++ b/src/core/fillarr.h @@ -14,7 +14,7 @@ void validateFill(B x); B withFill(B x, B fill); // consumes both static B qWithFill(B x, B fill) { // consumes both assert(isArr(x)); - if (noFill(fill) || TI(x).elType!=el_B) return x; + if (noFill(fill) || TI(x,elType)!=el_B) return x; return withFill(x, fill); } @@ -28,7 +28,7 @@ static bool fillEqual(B w, B x) { static B getFillR(B x) { // doesn't consume; can return bi_noFill if (isArr(x)) { - switch(TI(x).elType) { default: UD; + switch(TI(x,elType)) { default: UD; case el_f64: case el_i32: return m_i32(0); case el_c32: return m_c32(' '); case el_B:; diff --git a/src/core/harr.c b/src/core/harr.c index b0a918ba..c02f2fc0 100644 --- a/src/core/harr.c +++ b/src/core/harr.c @@ -8,7 +8,7 @@ B toCells(B x) { usz cam = a(x)->sh[0]; usz csz = arr_csz(x); usz i = 0; - BS2A slice = TI(x).slice; + BS2A slice = TI(x,slice); usz p = 0; HArr_p r = m_harrs(cam, &i); if (rnk(x)==2) { @@ -50,7 +50,7 @@ B toKCells(B x, ur k) { usz i = 0; usz p = 0; HArr_p r = m_harrs(cam, &i); - BS2A slice = TI(x).slice; + BS2A slice = TI(x,slice); for (; i < cam; i++) { Arr* s = slice(inc(x), p); arr_shSetI(s, csz, cr, csh); @@ -69,7 +69,7 @@ HArr* toHArr(B x) { if (v(x)->type==t_harr) return c(HArr,x); HArr_p r = m_harrUc(x); usz ia = r.c->ia; - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); for (usz i = 0; i < ia; i++) r.a[i] = xget(x,i); dec(x); return r.c; @@ -146,13 +146,13 @@ static void harrP_print(B x) { } void harr_init() { - ti[t_harr].get = harr_get; ti[t_hslice].get = hslice_get; ti[t_harrPartial].get = harrP_get; - ti[t_harr].getU = harr_getU; ti[t_hslice].getU = hslice_getU; ti[t_harrPartial].getU = harrP_get; - ti[t_harr].slice = harr_slice; ti[t_hslice].slice = hslice_slice; - ti[t_harr].free = harr_free; ti[t_hslice].free = slice_free; ti[t_harrPartial].free = harrP_free; - ti[t_harr].visit = harr_visit; ti[t_hslice].visit = slice_visit; ti[t_harrPartial].visit = harrP_visit; - ti[t_harr].print = arr_print; ti[t_hslice].print = arr_print; ti[t_harrPartial].print = harrP_print; - ti[t_harr].isArr = true; ti[t_hslice].isArr = true; - ti[t_harr].canStore = harr_canStore; + TIi(t_harr,get) = harr_get; TIi(t_hslice,get) = hslice_get; TIi(t_harrPartial,get) = harrP_get; + TIi(t_harr,getU) = harr_getU; TIi(t_hslice,getU) = hslice_getU; TIi(t_harrPartial,getU) = harrP_get; + TIi(t_harr,slice) = harr_slice; TIi(t_hslice,slice) = hslice_slice; + TIi(t_harr,free) = harr_free; TIi(t_hslice,free) = slice_free; TIi(t_harrPartial,free) = harrP_free; + TIi(t_harr,visit) = harr_visit; TIi(t_hslice,visit) = slice_visit; TIi(t_harrPartial,visit) = harrP_visit; + TIi(t_harr,print) = arr_print; TIi(t_hslice,print) = arr_print; TIi(t_harrPartial,print) = harrP_print; + TIi(t_harr,isArr) = true; TIi(t_hslice,isArr) = true; + TIi(t_harr,canStore) = harr_canStore; bi_emptyHVec = m_harrUv(0).b; gc_add(bi_emptyHVec); } diff --git a/src/core/heap.c b/src/core/heap.c index a2aa85b7..11f5be69 100644 --- a/src/core/heap.c +++ b/src/core/heap.c @@ -30,14 +30,14 @@ void heapVerify_checkFn(Value* v) { void heapVerify_callVisit(Value* v) { - if (ti[v->type].isArr && prnk(v)>1) heapVerify_visitP(shObjP(v)); - ti[v->type].visit(v); + if (TIv(v,isArr) && prnk(v)>1) heapVerify_visitP(shObjP(v)); + TIv(v,visit)(v); } void heap_getReferents(Value* v) { heap_curr = v; - if (ti[v->type].isArr && prnk(v)>1) heapVerify_visitP(shObjP(v)); - ti[v->type].visit(v); + if (TIv(v,isArr) && prnk(v)>1) heapVerify_visitP(shObjP(v)); + TIv(v,visit)(v); } void heapVerify() { heap_observed = 0; diff --git a/src/core/i32arr.c b/src/core/i32arr.c index 5bba6323..036c8cf7 100644 --- a/src/core/i32arr.c +++ b/src/core/i32arr.c @@ -21,15 +21,15 @@ static void i32arr_free(Value* x) { decSh(x); } static bool i32arr_canStore(B x) { return q_i32(x); } void i32arr_init() { - ti[t_i32arr].get = i32arr_get; ti[t_i32slice].get = i32slice_get; - ti[t_i32arr].getU = i32arr_get; ti[t_i32slice].getU = i32slice_get; - ti[t_i32arr].slice = i32arr_slice; ti[t_i32slice].slice = i32slice_slice; - ti[t_i32arr].free = i32arr_free; ti[t_i32slice].free = slice_free; - ti[t_i32arr].visit = noop_visit; ti[t_i32slice].visit = slice_visit; - ti[t_i32arr].print = arr_print; ti[t_i32slice].print = arr_print; - ti[t_i32arr].isArr = true; ti[t_i32slice].isArr = true; - ti[t_i32arr].arrD1 = true; ti[t_i32slice].arrD1 = true; - ti[t_i32arr].elType = el_i32; ti[t_i32slice].elType = el_i32; - ti[t_i32arr].canStore = i32arr_canStore; + TIi(t_i32arr,get) = i32arr_get; TIi(t_i32slice,get) = i32slice_get; + TIi(t_i32arr,getU) = i32arr_get; TIi(t_i32slice,getU) = i32slice_get; + TIi(t_i32arr,slice) = i32arr_slice; TIi(t_i32slice,slice) = i32slice_slice; + TIi(t_i32arr,free) = i32arr_free; TIi(t_i32slice,free) = slice_free; + TIi(t_i32arr,visit) = noop_visit; TIi(t_i32slice,visit) = slice_visit; + TIi(t_i32arr,print) = arr_print; TIi(t_i32slice,print) = arr_print; + TIi(t_i32arr,isArr) = true; TIi(t_i32slice,isArr) = true; + TIi(t_i32arr,arrD1) = true; TIi(t_i32slice,arrD1) = true; + TIi(t_i32arr,elType) = el_i32; TIi(t_i32slice,elType) = el_i32; + TIi(t_i32arr,canStore) = i32arr_canStore; i32* tmp; bi_emptyIVec = m_i32arrv(&tmp, 0); gc_add(bi_emptyIVec); } diff --git a/src/core/i32arr.h b/src/core/i32arr.h index 9be3aa06..7cfe3ca1 100644 --- a/src/core/i32arr.h +++ b/src/core/i32arr.h @@ -36,11 +36,11 @@ static I32Arr* toI32Arr(B x) { // assumes it's possible if (v(x)->type==t_i32arr) return c(I32Arr,x); i32* rp; B r = m_i32arrc(&rp, x); usz ia = a(r)->ia; - if (TI(x).elType==el_f64) { + if (TI(x,elType)==el_f64) { f64* fp = f64any_ptr(x); for (usz i = 0; i < ia; i++) rp[i] = (i32)fp[i]; } else { - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < ia; i++) rp[i] = o2iu(xgetU(x,i)); } dec(x); diff --git a/src/core/stuff.c b/src/core/stuff.c index 736867a2..71187f65 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -33,7 +33,7 @@ NOINLINE TStack* ts_e(TStack* o, u32 elsz, u64 am) { u64 size = o->size; NOINLINE void arr_print(B x) { // should accept refc=0 arguments for debugging purposes ur r = rnk(x); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); usz ia = a(x)->ia; if (r!=1) { if (r==0) { @@ -81,12 +81,12 @@ NOINLINE void print(B x) { u8 t = v(x)->type; v(x)->type = v(x)->flags; printf(t==t_freed?"FREED:":"EMPTY:"); - TI(x).print(x); + TI(x,print)(x); v(x)->type = t; return; } #endif - TI(x).print(x); + TI(x,print)(x); } else if (isVar(x)) printf("(var d=%d i=%d)", (u16)(x.u>>32), (i32)x.u); else if (isExt(x)) printf("(extvar d=%d i=%d)", (u16)(x.u>>32), (i32)x.u); @@ -105,7 +105,7 @@ NOINLINE void printRaw(B x) { else thrM("bad printRaw argument: atom arguments should be either numerical or characters"); } else { usz ia = a(x)->ia; - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < ia; i++) { B c = xgetU(x,i); #if !CATCH_ERRORS @@ -226,8 +226,8 @@ NOINLINE i32 compareR(B w, B x) { if (isAtm(w) & isAtm(x)) thrM("Invalid comparison"); bool wa=isAtm(w); usz wia; ur wr; usz* wsh; BS2B wgetU; bool xa=isAtm(x); usz xia; ur xr; usz* xsh; BS2B xgetU; - if(wa) { wia=1; wr=0; wsh=NULL; wgetU=def_getU; } else { wia=a(w)->ia; wr=rnk(w); wsh=a(w)->sh; wgetU=TI(w).getU; } - if(xa) { xia=1; xr=0; xsh=NULL; xgetU=def_getU; } else { xia=a(x)->ia; xr=rnk(x); xsh=a(x)->sh; xgetU=TI(x).getU; } + if(wa) { wia=1; wr=0; wsh=NULL; wgetU=def_getU; } else { wia=a(w)->ia; wr=rnk(w); wsh=a(w)->sh; wgetU=TI(w,getU); } + if(xa) { xia=1; xr=0; xsh=NULL; xgetU=def_getU; } else { xia=a(x)->ia; xr=rnk(x); xsh=a(x)->sh; xgetU=TI(x,getU); } if (wia==0 || xia==0) return CMP(wia, xia); i32 rc = CMP(wr+(wa?0:1), xr+(xa?0:1)); @@ -254,7 +254,7 @@ NOINLINE i32 compareR(B w, B x) { NOINLINE bool atomEqualR(B w, B x) { if (v(w)->type!=v(x)->type) return false; - B2B dcf = TI(w).decompose; + B2B dcf = TI(w,decompose); if (dcf == def_decompose) return false; B wd=dcf(inc(w)); B* wdp = harr_ptr(wd); B xd=dcf(inc(x)); B* xdp = harr_ptr(xd); @@ -272,8 +272,8 @@ NOINLINE bool equal(B w, B x) { // doesn't consume if (wa) return atomEqual(w, x); if (!eqShape(w,x)) return false; usz ia = a(x)->ia; - u8 we = TI(w).elType; - u8 xe = TI(x).elType; + u8 we = TI(w,elType); + u8 xe = TI(x,elType); if (we<=el_f64 && xe<=el_f64) { assert(we==el_i32|we==el_f64); assert(xe==el_i32|xe==el_f64); if (we==el_i32) { i32* wp = i32any_ptr(w); if(xe==el_i32) { i32* xp = i32any_ptr(x); for (usz i = 0; i < ia; i++) if(wp[i]!=xp[i]) return false; } @@ -290,8 +290,8 @@ NOINLINE bool equal(B w, B x) { // doesn't consume for (usz i = 0; i < ia; i++) if(wp[i]!=xp[i]) return false; return true; } - BS2B xgetU = TI(x).getU; - BS2B wgetU = TI(w).getU; + BS2B xgetU = TI(x,getU); + BS2B wgetU = TI(w,getU); for (usz i = 0; i < ia; i++) if(!equal(wgetU(w,i),xgetU(x,i))) return false; return true; } @@ -301,7 +301,7 @@ bool atomEEqual(B w, B x) { // doesn't consume (not that that matters really cur if(isNum(w)|isNum(x)) return false; if (!isVal(w) | !isVal(x)) return false; if (v(w)->type!=v(x)->type) return false; - B2B dcf = TI(w).decompose; + B2B dcf = TI(w,decompose); if (dcf == def_decompose) return false; B wd=dcf(inc(w)); B* wdp = harr_ptr(wd); B xd=dcf(inc(x)); B* xdp = harr_ptr(xd); @@ -325,18 +325,18 @@ bool eequal(B w, B x) { // doesn't consume // if (!feq) return false; if (!eqShape(w,x)) return false; usz ia = a(x)->ia; - BS2B xgetU = TI(x).getU; - BS2B wgetU = TI(w).getU; + BS2B xgetU = TI(x,getU); + BS2B wgetU = TI(w,getU); for (usz i = 0; i < ia; i++) if(!eequal(wgetU(w,i),xgetU(x,i))) return false; return true; } u64 depth(B x) { // doesn't consume if (isAtm(x)) return 0; - if (TI(x).arrD1) return 1; + if (TI(x,arrD1)) return 1; u64 r = 0; usz ia = a(x)->ia; - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < ia; i++) { u64 n = depth(xgetU(x,i)); if (n>r) r = n; @@ -368,7 +368,7 @@ char* format_type(u8 u) { bool isPureFn(B x) { // doesn't consume if (isCallable(x)) { if (v(x)->flags) return true; - B2B dcf = TI(x).decompose; + B2B dcf = TI(x,decompose); B xd = dcf(inc(x)); B* xdp = harr_ptr(xd); i32 t = o2iu(xdp[0]); @@ -378,7 +378,7 @@ bool isPureFn(B x) { // doesn't consume dec(xd); return true; } else if (isArr(x)) { usz ia = a(x)->ia; - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < ia; i++) if (!isPureFn(xgetU(x,i))) return false; return true; } else return isNum(x) || isC32(x); @@ -386,7 +386,7 @@ bool isPureFn(B x) { // doesn't consume B bqn_squeeze(B x) { // consumes assert(isArr(x)); - u8 xe = TI(x).elType; + u8 xe = TI(x,elType); if (xe==el_i32 || xe==el_c32) return x; usz ia = a(x)->ia; if (ia==0) return x; @@ -396,7 +396,7 @@ B bqn_squeeze(B x) { // consumes return taga(toI32Arr(x)); } assert(xe==el_B); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); B x0 = xgetU(x, 0); if (isNum(x0)) { for (usz i = 0; i < ia; i++) { @@ -436,7 +436,7 @@ B bqn_merge(B x) { // consumes return taga(r); } - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); B x0 = xgetU(x, 0); usz* elSh = isArr(x0)? a(x0)->sh : NULL; ur elR = isArr(x0)? rnk(x0) : 0; diff --git a/src/core/stuff.h b/src/core/stuff.h index 848a6da4..48b58fdf 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -167,7 +167,7 @@ static bool atomEqual(B w, B x) { // doesn't consume (not that that matters real print(tag(x,OBJ_TAG)); putchar('\n'); fflush(stdout); err(""); } - if (ti[x->type].isArr) { + if (TIv(x,isArr)) { Arr* a = (Arr*)x; if (prnk(x)<=1) assert(a->sh == &a->ia); else VALIDATE(tag(shObjP(x),OBJ_TAG)); @@ -177,7 +177,7 @@ static bool atomEqual(B w, B x) { // doesn't consume (not that that matters real static NOINLINE B VALIDATE(B x) { if (!isVal(x)) return x; VALIDATEP(v(x)); - if(isArr(x)!=TI(x).isArr && v(x)->type!=t_freed && v(x)->type!=t_harrPartial) { + if(isArr(x)!=TI(x,isArr) && v(x)->type!=t_freed && v(x)->type!=t_harrPartial) { printf("bad array tag/type: type=%d, obj=%p\n", v(x)->type, (void*)x.u); print(x); err("\nk"); diff --git a/src/h.h b/src/h.h index 31f55c3c..b51f3b13 100644 --- a/src/h.h +++ b/src/h.h @@ -391,7 +391,9 @@ typedef struct TypeInfo { bool arrD1; // is always an array with depth 1 } TypeInfo; extern TypeInfo ti[t_COUNT]; -#define TI(x) (ti[v(x)->type]) +#define TIi(X,V) (ti[X].V) +#define TIv(X,V) (ti[(X)->type].V) +#define TI(X,V) (ti[v(X)->type].V) static bool isNothing(B b) { return b.u==bi_N.u; } @@ -400,7 +402,7 @@ static void mm_free(Value* x); // refcount static bool reusable(B x) { return v(x)->refc==1; } static inline void value_free(Value* x) { - ti[x->type].free(x); + TIv(x,free)(x); mm_free(x); } static NOINLINE void value_freeR(Value* x) { value_free(x); } diff --git a/src/load.c b/src/load.c index 7bac826c..e75df5f4 100644 --- a/src/load.c +++ b/src/load.c @@ -61,7 +61,7 @@ _Thread_local B comp_currSrc; B rt_merge, rt_undo, rt_select, rt_slash, rt_join, rt_ud, rt_pick,rt_take, rt_drop, rt_group, rt_under, rt_reverse, rt_indexOf, rt_count, rt_memberOf, rt_find, rt_cell; Block* load_compObj(B x, B src, B path, Scope* sc) { // consumes x,src - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); usz xia = a(x)->ia; if (xia!=5 & xia!=3) thrM("load_compObj: bad item count"); Block* r = xia==5? compile(xget(x,0),xget(x,1),xget(x,2),xget(x,3),xget(x,4), src, inc(path), sc) @@ -126,7 +126,7 @@ NOINLINE Block* bqn_compSc(B str, B path, B args, Scope* sc, bool repl) { // con for (i32 i = 0; i < csc->varAm; i++) { i32 nameID = csc->body->varIDs[i]; B nl = csc->body->nsDesc->nameList; - vName = vec_add(vName, TI(nl).get(nl, nameID)); + vName = vec_add(vName, TI(nl,get)(nl, nameID)); vDepth = vec_add(vDepth, m_i32(depth)); } if (csc->ext) for (i32 i = 0; i < csc->ext->varAm; i++) { @@ -205,13 +205,13 @@ static inline void load_init() { // very last init function #endif B rtRes = m_funBlock(runtime_b, 0); ptr_dec(runtime_b); - B rtObjRaw = TI(rtRes).get(rtRes,0); - B rtFinish = TI(rtRes).get(rtRes,1); + B rtObjRaw = TI(rtRes,get)(rtRes,0); + B rtFinish = TI(rtRes,get)(rtRes,1); dec(rtRes); if (c(Arr,rtObjRaw)->ia != rtLen) err("incorrectly defined rtLen!"); HArr_p runtimeH = m_harrUc(rtObjRaw); - BS2B rtObjGet = TI(rtObjRaw).get; + BS2B rtObjGet = TI(rtObjRaw,get); rt_undo = rtObjGet(rtObjRaw, 48); gc_add(rt_undo); rt_select = rtObjGet(rtObjRaw, 35); gc_add(rt_select); @@ -294,7 +294,7 @@ static inline void load_init() { // very last init function ); B fmtM = m_funBlock(fmt_b, 0); ptr_dec(fmt_b); B fmtR = c1(fmtM, m_caB(4, (B[]){inc(bi_type), inc(bi_decp), inc(bi_fmtF), inc(bi_repr)})); - BS2B fget = TI(fmtR).get; + BS2B fget = TI(fmtR,get); load_fmt = fget(fmtR, 0); gc_add(load_fmt); load_repr = fget(fmtR, 1); gc_add(load_repr); dec(fmtR); @@ -337,13 +337,13 @@ static Arr* def_slice(B x, usz s) { thrM("cannot slice non-array!"); } #ifdef DONT_FREE static B empty_get(B x, usz n) { v(x)->type = v(x)->flags; - B r = TI(x).get(x, n); + B r = TI(x,get)(x, n); v(x)->type = t_empty; return r; } static B empty_getU(B x, usz n) { v(x)->type = v(x)->flags; - B r = TI(x).getU(x, n); + B r = TI(x,getU)(x, n); v(x)->type = t_empty; return r; } @@ -351,37 +351,37 @@ static B empty_getU(B x, usz n) { static inline void base_init() { // very first init function for (i32 i = 0; i < t_COUNT; i++) { - ti[i].free = def_free; - ti[i].visit = def_visit; - ti[i].get = def_get; - ti[i].getU = def_getU; - ti[i].print = def_print; - ti[i].m1_d = def_m1_d; - ti[i].m2_d = def_m2_d; - ti[i].isArr = false; - ti[i].arrD1 = false; - ti[i].elType = el_B; - ti[i].identity = def_identity; - ti[i].decompose = def_decompose; - ti[i].slice = def_slice; - ti[i].canStore = def_canStore; - ti[i].fn_uc1 = def_fn_uc1; - ti[i].fn_ucw = def_fn_ucw; - ti[i].m1_uc1 = def_m1_uc1; - ti[i].m1_ucw = def_m1_ucw; - ti[i].m2_uc1 = def_m2_uc1; - ti[i].m2_ucw = def_m2_ucw; + TIi(i,free) = def_free; + TIi(i,visit) = def_visit; + TIi(i,get) = def_get; + TIi(i,getU) = def_getU; + TIi(i,print) = def_print; + TIi(i,m1_d) = def_m1_d; + TIi(i,m2_d) = def_m2_d; + TIi(i,isArr) = false; + TIi(i,arrD1) = false; + TIi(i,elType) = el_B; + TIi(i,identity) = def_identity; + TIi(i,decompose) = def_decompose; + TIi(i,slice) = def_slice; + TIi(i,canStore) = def_canStore; + TIi(i,fn_uc1) = def_fn_uc1; + TIi(i,fn_ucw) = def_fn_ucw; + TIi(i,m1_uc1) = def_m1_uc1; + TIi(i,m1_ucw) = def_m1_ucw; + TIi(i,m2_uc1) = def_m2_uc1; + TIi(i,m2_ucw) = def_m2_ucw; } - ti[t_empty].free = empty_free; - ti[t_freed].free = def_free; - ti[t_freed].visit = freed_visit; + TIi(t_empty,free) = empty_free; + TIi(t_freed,free) = def_free; + TIi(t_freed,visit) = freed_visit; #ifdef DONT_FREE - ti[t_empty].get = empty_get; - ti[t_empty].getU = empty_getU; + TIi(t_empty,get) = empty_get; + TIi(t_empty,getU) = empty_getU; #endif - ti[t_shape].visit = noop_visit; - ti[t_funBI].visit = ti[t_md1BI].visit = ti[t_md2BI].visit = noop_visit; - ti[t_funBI].free = ti[t_md1BI].free = ti[t_md2BI].free = builtin_free; + TIi(t_shape,visit) = noop_visit; + TIi(t_funBI,visit) = TIi(t_md1BI,visit) = TIi(t_md2BI,visit) = noop_visit; + TIi(t_funBI,free) = TIi(t_md1BI,free) = TIi(t_md2BI,free) = builtin_free; assert((MD1_TAG>>1) == (MD2_TAG>>1)); // just to be sure it isn't changed incorrectly, `isMd` depends on this #define FA(N,X) { BFn* f = mm_alloc(sizeof(BFn), t_funBI); f->c2=N##_c2 ; f->c1=N##_c1 ; f->extra=pf_##N; f->ident=bi_N; f->uc1=def_fn_uc1; f->ucw=def_fn_ucw; gc_add(bi_##N = tag(f,FUN_TAG)); } diff --git a/src/nfns.c b/src/nfns.c index 8090f293..df10cb6e 100644 --- a/src/nfns.c +++ b/src/nfns.c @@ -32,12 +32,12 @@ B m_nfn(NFnDesc* desc, B obj) { return tag(r,FUN_TAG); } B nfn_name(B x) { VTY(x, t_nfn); - return inc(c(NFnDesc,TI(nfn_list).getU(nfn_list,c(NFn,x)->id))->name); + return inc(c(NFnDesc,TI(nfn_list,getU)(nfn_list,c(NFn,x)->id))->name); } void nfn_free(Value* x) { dec(((NFn*)x)->obj); } void nfn_visit(Value* x) { mm_visit(((NFn*)x)->obj); } -void nfn_print(B x) { printRaw(c(NFnDesc,TI(nfn_list).getU(nfn_list,c(NFn,x)->id))->name); } +void nfn_print(B x) { printRaw(c(NFnDesc,TI(nfn_list,getU)(nfn_list,c(NFn,x)->id))->name); } void nfnDesc_free(Value* x) { err("nfnDesc shouldn't be freed!"); } void nfnDesc_visit(Value* x) { mm_visit(((NFnDesc*)x)->name); } void nfnDesc_print(B x) { printf("(native function description)"); } @@ -47,8 +47,8 @@ void nfn_gcFn() { } void nfn_init() { nfn_list = emptyHVec(); - ti[t_nfn].free = nfn_free; ti[t_nfnDesc].free = nfnDesc_free; - ti[t_nfn].visit = nfn_visit; ti[t_nfnDesc].visit = nfnDesc_visit; - ti[t_nfn].print = nfn_print; ti[t_nfnDesc].print = nfnDesc_print; + TIi(t_nfn,free) = nfn_free; TIi(t_nfnDesc,free) = nfnDesc_free; + TIi(t_nfn,visit) = nfn_visit; TIi(t_nfnDesc,visit) = nfnDesc_visit; + TIi(t_nfn,print) = nfn_print; TIi(t_nfnDesc,print) = nfnDesc_print; gc_addFn(nfn_gcFn); } diff --git a/src/ns.c b/src/ns.c index 9a3a6245..d9a254fd 100644 --- a/src/ns.c +++ b/src/ns.c @@ -13,8 +13,8 @@ void m_nsDesc(Body* body, bool imm, u8 ty, B nameList, B varIDs, B exported) { / NSDesc* r = mm_alloc(fsizeof(NSDesc, expIDs, i32, vam), t_nsDesc); r->nameList = nameList; r->varAm = vam; - BS2B getIDU = TI(varIDs).getU; - BS2B getOnU = TI(exported).getU; + BS2B getIDU = TI(varIDs,getU); + BS2B getOnU = TI(exported,getU); for (i32 i = 0; i < off; i++) { body->varIDs[i] = -1; r ->expIDs[i] = -1; @@ -44,8 +44,8 @@ B ns_getU(B ns, B cNL, i32 nameID) { VTY(ns, t_ns); assert(nameIDia && nameID>=0); B dNL = d->nameList; if (cNL.u != dNL.u) { - B cName = TI(cNL).getU(cNL, nameID); - BS2B dNLgetU = TI(dNL).getU; + B cName = TI(cNL,getU)(cNL, nameID); + BS2B dNLgetU = TI(dNL,getU); for (i32 i = 0; i < dVarAm; i++) { i32 dID = d->expIDs[i]; if (dID>=0 && equal(dNLgetU(dNL, dID), cName)) return n->sc->vars[i]; @@ -62,7 +62,7 @@ B ns_getNU(B ns, B name) { VTY(ns, t_ns); NSDesc* d = n->desc; i32 dVarAm = d->varAm; B dNL = d->nameList; - BS2B dNLgetU = TI(dNL).getU; + BS2B dNLgetU = TI(dNL,getU); for (i32 i = 0; i < dVarAm; i++) { i32 dID = d->expIDs[i]; if (dID>=0 && equal(dNLgetU(dNL, dID), name)) return n->sc->vars[i]; @@ -74,7 +74,7 @@ void ns_set(B ns, B name, B val) { VTY(ns, t_ns); NSDesc* d = n->desc; i32 dVarAm = d->varAm; B dNL = d->nameList; - BS2B dNLgetU = TI(dNL).getU; + BS2B dNLgetU = TI(dNL,getU); for (i32 i = 0; i < dVarAm; i++) { i32 dID = d->expIDs[i]; if (dID>=0 && equal(dNLgetU(dNL, dID), name)) { @@ -90,7 +90,7 @@ i32 ns_pos(B ns, B name) { VTY(ns, t_ns); Body* b = c(NS, ns)->sc->body; B nameList = c(NS, ns)->desc->nameList; i32 bVarAm = b->varAm; - BS2B nlGetU = TI(nameList).getU; + BS2B nlGetU = TI(nameList,getU); for (i32 i = 0; i < bVarAm; i++) { i32 id = b->varIDs[i]; if (id>=0) if (equal(nlGetU(nameList, id), name)) { dec(name); return i; } @@ -119,7 +119,7 @@ void ns_print(B x) { NSDesc* desc = c(NS,x)->desc; Scope* sc = c(NS,x)->sc; i32 am = desc->varAm; - BS2B getNameU = TI(desc->nameList).getU; + BS2B getNameU = TI(desc->nameList,getU); bool first = true; for (i32 i = 0; i < am; i++) { i32 id = desc->expIDs[i]; @@ -147,7 +147,7 @@ void nsDesc_print(B x) { void ns_init() { - ti[t_ns].free = ns_free; ti[t_nsDesc].free = nsDesc_free; - ti[t_ns].visit = ns_visit; ti[t_nsDesc].visit = nsDesc_visit; - ti[t_ns].print = ns_print; ti[t_nsDesc].print = nsDesc_print; + TIi(t_ns,free) = ns_free; TIi(t_nsDesc,free) = nsDesc_free; + TIi(t_ns,visit) = ns_visit; TIi(t_nsDesc,visit) = nsDesc_visit; + TIi(t_ns,print) = ns_print; TIi(t_nsDesc,print) = nsDesc_print; } diff --git a/src/opt/gc.c b/src/opt/gc.c index 6ad99c0b..dd997781 100644 --- a/src/opt/gc.c +++ b/src/opt/gc.c @@ -42,7 +42,7 @@ void gc_tryFree(Value* v) { #endif v->type = t_freed; ptr_inc(v); // required as otherwise the object may free itself while not done reading its own fields - ti[t].free(v); + TIi(t,free)(v); ptr_dec(v); // Object may not be immediately freed if it's not a part of a cycle, but instead a descendant of one. // It will be freed when the cycle is freed, and the t_freed type ensures it doesn't double-free itself diff --git a/src/opt/gc.h b/src/opt/gc.h index 64c67795..92b15003 100644 --- a/src/opt/gc.h +++ b/src/opt/gc.h @@ -26,7 +26,7 @@ static void mm_visit(B x) { #ifdef LOG_GC gc_visitBytes+= mm_size(vx); gc_visitCount++; #endif - TI(x).visit(vx); + TI(x,visit)(vx); } static void mm_visitP(void* xp) { #ifdef HEAP_VERIFY @@ -40,5 +40,5 @@ static void mm_visitP(void* xp) { #ifdef LOG_GC gc_visitBytes+= mm_size(x); gc_visitCount++; #endif - ti[x->type].visit(x); + TIv(x,visit)(x); } diff --git a/src/rtwrap.c b/src/rtwrap.c index e7e2b5b3..db0f5f3c 100644 --- a/src/rtwrap.c +++ b/src/rtwrap.c @@ -21,7 +21,7 @@ WFun* lastWF; void wf_visit(Value* x) { mm_visit(((WFun*)x)->v); } B wf_identity(B x) { B f = c(WFun,x)->v; - return inc(TI(f).identity(f)); + return inc(TI(f,identity)(f)); } #define CHK(A,B) { if (!eequal(A,B)) { print(f); printf(": failed RT_VERIFY\n"); vm_pstLive(); exit(1); } } u64 fwTotal; @@ -207,23 +207,23 @@ B rtWrap_unwrap(B x) { } -B wfn_uc1(B t, B o, B x) { B t2 = c(WFun,t)->v; return TI(t2).fn_uc1(t2, o, x); } -B wfn_ucw(B t, B o, B w, B x) { B t2 = c(WFun,t)->v; return TI(t2).fn_ucw(t2, o, w, x); } -B wm1_uc1(B t, B o, B f, B x) { B t2 = c(WMd1,t)->v; return TI(t2).m1_uc1(t2, o, f, x); } -B wm1_ucw(B t, B o, B f, B w, B x) { B t2 = c(WMd1,t)->v; return TI(t2).m1_ucw(t2, o, f, w, x); } -B wm2_uc1(B t, B o, B f, B g, B x) { B t2 = c(WMd2,t)->v; return TI(t2).m2_uc1(t2, o, f, g, x); } -B wm2_ucw(B t, B o, B f, B g, B w, B x) { B t2 = c(WMd2,t)->v; return TI(t2).m2_ucw(t2, o, f, g, w, x); } +B wfn_uc1(B t, B o, B x) { B t2 = c(WFun,t)->v; return TI(t2,fn_uc1)(t2, o, x); } +B wfn_ucw(B t, B o, B w, B x) { B t2 = c(WFun,t)->v; return TI(t2,fn_ucw)(t2, o, w, x); } +B wm1_uc1(B t, B o, B f, B x) { B t2 = c(WMd1,t)->v; return TI(t2,m1_uc1)(t2, o, f, x); } +B wm1_ucw(B t, B o, B f, B w, B x) { B t2 = c(WMd1,t)->v; return TI(t2,m1_ucw)(t2, o, f, w, x); } +B wm2_uc1(B t, B o, B f, B g, B x) { B t2 = c(WMd2,t)->v; return TI(t2,m2_uc1)(t2, o, f, g, x); } +B wm2_ucw(B t, B o, B f, B g, B w, B x) { B t2 = c(WMd2,t)->v; return TI(t2,m2_ucw)(t2, o, f, g, w, x); } void rtWrap_init() { - ti[t_funWrap].visit = wf_visit; ti[t_funWrap].identity = wf_identity; - ti[t_md1Wrap].visit = wm1_visit; ti[t_md1Wrap].m1_d = m_md1D; - ti[t_md2Wrap].visit = wm2_visit; ti[t_md2Wrap].m2_d = m_md2D; - ti[t_funWrap].fn_uc1 = wfn_uc1; - ti[t_funWrap].fn_ucw = wfn_ucw; - ti[t_md1Wrap].m1_uc1 = wm1_uc1; - ti[t_md1Wrap].m1_ucw = wm1_ucw; - ti[t_md2Wrap].m2_uc1 = wm2_uc1; - ti[t_md2Wrap].m2_ucw = wm2_ucw; + TIi(t_funWrap,visit) = wf_visit; TIi(t_funWrap,identity) = wf_identity; + TIi(t_md1Wrap,visit) = wm1_visit; TIi(t_md1Wrap,m1_d) = m_md1D; + TIi(t_md2Wrap,visit) = wm2_visit; TIi(t_md2Wrap,m2_d) = m_md2D; + TIi(t_funWrap,fn_uc1) = wfn_uc1; + TIi(t_funWrap,fn_ucw) = wfn_ucw; + TIi(t_md1Wrap,m1_uc1) = wm1_uc1; + TIi(t_md1Wrap,m1_ucw) = wm1_ucw; + TIi(t_md2Wrap,m2_uc1) = wm2_uc1; + TIi(t_md2Wrap,m2_ucw) = wm2_ucw; } #else void rtWrap_init() { } diff --git a/src/utils/each.h b/src/utils/each.h index d1e650db..6bededaf 100644 --- a/src/utils/each.h +++ b/src/utils/each.h @@ -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 static B eachd_fn(BBB2B f, B fo, B w, B x) { // consumes w,x; assumes at least one is array if (isAtm(w)) w = m_atomUnit(w); if (isAtm(x)) x = m_atomUnit(x); - ur wr = rnk(w); BS2B wget = TI(w).get; - ur xr = rnk(x); BS2B xget = TI(x).get; + ur wr = rnk(w); BS2B wget = TI(w,get); + ur xr = rnk(x); BS2B xget = TI(x,get); bool wg = wr>xr; ur rM = wg? wr : xr; ur rm = wg? xr : wr; @@ -55,11 +55,11 @@ static B eachd_fn(BBB2B f, B fo, B w, B x) { // consumes w,x; assumes at least o static B eachm_fn(BB2B f, B fo, B x) { // consumes x; x must be array usz ia = a(x)->ia; if (ia==0) return x; - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); usz i = 0; B cr = f(fo, xget(x,0)); HArr_p rH; - if (TI(x).canStore(cr)) { + if (TI(x,canStore)(cr)) { bool reuse = reusable(x); if (v(x)->type==t_harr) { B* xp = harr_ptr(x); @@ -73,7 +73,7 @@ static B eachm_fn(BB2B f, B fo, B x) { // consumes x; x must be array for (; i < ia; i++) rH.a[i] = f(fo, inc(xp[i])); return harr_fcd(rH, x); } - } else if (TI(x).elType==el_i32) { + } else if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); B r; i32* rp; if (reuse && v(x)->type==t_i32arr) { r=x; rp = xp; } @@ -91,7 +91,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 (TI(x).elType==el_f64) { + } else if (TI(x,elType)==el_f64) { f64* xp = f64any_ptr(x); B r; f64* rp; if (reuse && v(x)->type==t_f64arr) { r=x; rp = xp; } diff --git a/src/utils/file.c b/src/utils/file.c index fbef5c9d..9ee6dd1c 100644 --- a/src/utils/file.c +++ b/src/utils/file.c @@ -46,14 +46,14 @@ B file_chars(B path) { // consumes B path_resolve(B base, B rel) { // consumes rel; assumes base is a char vector or bi_N assert((isArr(base) || isNothing(base)) && isArr(rel)); - BS2B rgetU = TI(rel).getU; + BS2B rgetU = TI(rel,getU); usz ria = a(rel)->ia; if (rnk(rel)!=1) thrM("Paths must be character vectors"); for (usz i = 0; i < ria; i++) if (!isC32(rgetU(rel, i))) thrM("Paths must be character vectors"); if (ria==0) { dec(rel); return inc(base); } if (o2cu(rgetU(rel, 0))=='/') return rel; if (isNothing(base)) thrM("Using relative path with no absolute base path known"); - BS2B bgetU = TI(base).getU; + BS2B bgetU = TI(base,getU); usz bia = a(base)->ia; bool has = bia && o2cu(bgetU(base, bia-1))=='/'; u32* rp; B r = m_c32arrv(&rp, bia+ria+(has?0:1)); @@ -68,13 +68,13 @@ B path_resolve(B base, B rel) { // consumes rel; assumes base is a char vector o B path_dir(B path) { // consumes; returns directory part of file path with trailing slash, or · assert(isArr(path) || isNothing(path)); if (isNothing(path)) return path; - BS2B pgetU = TI(path).getU; + BS2B pgetU = TI(path,getU); usz pia = a(path)->ia; if (pia==0) thrM("Empty file path"); for (usz i = 0; i < pia; i++) if (!isC32(pgetU(path, i))) thrM("Paths must be character vectors"); for (i64 i = (i64)pia-1; i >= 0; i--) { if (o2cu(pgetU(path, i))=='/') { - Arr* r = TI(path).slice(path, 0); + Arr* r = TI(path,slice)(path, 0); arr_shVec(r, i+1); return taga(r); } @@ -102,7 +102,7 @@ void file_wBytes(B path, B x) { // consumes path u64 len = a(x)->ia; TALLOC(char, val, len); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (u64 i = 0; i < len; i++) val[i] = o2i(xgetU(x,i)); if (fwrite(val, 1, len, f) != len) thrF("Error writing to file \"%R\"", path); diff --git a/src/utils/hash.h b/src/utils/hash.h index d46ba954..8b6ba998 100644 --- a/src/utils/hash.h +++ b/src/utils/hash.h @@ -14,7 +14,7 @@ static u64 bqn_hash(B x, const u64 secret[4]) { // doesn't consume inc(x); x = bqn_squeeze(x); u64 shHash = wyhash(a(x)->sh, rnk(x)*sizeof(usz), 0, secret); - u8 xe = TI(x).elType; + u8 xe = TI(x,elType); usz xia = a(x)->ia; u64 r; if (xe==el_i32) { @@ -26,7 +26,7 @@ static u64 bqn_hash(B x, const u64 secret[4]) { // doesn't consume } else { assert(xe==el_B); TALLOC(u64, data, xia); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (usz i = 0; i < xia; i++) data[i] = bqn_hash(xgetU(x, i), secret); r = wyhash(data, xia*8, shHash, secret); TFREE(data); diff --git a/src/utils/mut.h b/src/utils/mut.h index ccc5c2fb..ad604c27 100644 --- a/src/utils/mut.h +++ b/src/utils/mut.h @@ -187,7 +187,7 @@ static void mut_fill(Mut* m, usz ms, B x, usz l) { static void mut_copy(Mut* m, usz ms, B x, usz xs, usz l) { assert(isArr(x)); u8 xt = v(x)->type; - u8 xe = ti[xt].elType; + u8 xe = TIi(xt,elType); // printf("mut_%d[%d…%d] ← %s[%d…%d]\n", m->type, ms, ms+l, format_type(xt), xs, xs+l); fflush(stdout); again: #define AGAIN { mut_to(m, el_or(m->type, xe)); goto again; } @@ -228,7 +228,7 @@ static void mut_copy(Mut* m, usz ms, B x, usz xs, usz l) { else if (xt==t_hslice) xp = c(HSlice,x)->a; else if (xt==t_fillarr) xp = c(FillArr,x)->a; else { - BS2B xget = ti[xt].get; + BS2B xget = TIi(xt,get); for (usz i = 0; i < l; i++) mpo[i] = xget(x,i+xs); return; } @@ -248,19 +248,19 @@ static B vec_join(B w, B x) { // consumes both if (v(w)->refc==1) { u64 wsz = mm_size(v(w)); u8 wt = v(w)->type; - if (wt==t_i32arr && fsizeof(I32Arr,a,i32,ria)ia = ria; memcpy(i32arr_ptr(w)+wia, i32any_ptr(x), xia*4); dec(x); return w; } - if (wt==t_c32arr && fsizeof(C32Arr,a,u32,ria)ia = ria; memcpy(c32arr_ptr(w)+wia, c32any_ptr(x), xia*4); dec(x); return w; } - if (wt==t_f64arr && fsizeof(F64Arr,a,f64,ria)ia = ria; memcpy(f64arr_ptr(w)+wia, f64any_ptr(x), xia*8); dec(x); @@ -270,7 +270,7 @@ static B vec_join(B w, B x) { // consumes both a(w)->ia = ria; B* rp = harr_ptr(w)+wia; u8 xt = v(x)->type; - u8 xe = TI(x).elType; + 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(a(x)); memcpy(rp, xp, xia*sizeof(B)); @@ -285,14 +285,14 @@ static B vec_join(B w, B x) { // consumes both f64* xp = f64any_ptr(x); for (usz i = 0; i < xia; i++) rp[i] = m_f64(xp[i]); } else { - BS2B xget = TI(x).get; + BS2B xget = TI(x,get); for (usz i = 0; i < xia; i++) rp[i] = xget(x, i); } dec(x); return w; } } - MAKE_MUT(r, ria); mut_to(r, el_or(TI(w).elType, TI(x).elType)); + MAKE_MUT(r, ria); mut_to(r, el_or(TI(w,elType), TI(x,elType))); mut_copy(r, 0, w, 0, wia); mut_copy(r, wia, x, 0, xia); dec(w); dec(x); @@ -330,7 +330,7 @@ static inline bool inplace_add(B w, B x) { // fails if fills wouldn't be correct static B vec_add(B w, B x) { // consumes both; fills may be wrong if (inplace_add(w, x)) return w; usz wia = a(w)->ia; - MAKE_MUT(r, wia+1); mut_to(r, el_or(TI(w).elType, selfElType(x))); + MAKE_MUT(r, wia+1); mut_to(r, el_or(TI(w,elType), selfElType(x))); mut_copy(r, 0, w, 0, wia); mut_set(r, wia, x); dec(w); diff --git a/src/utils/utf.c b/src/utils/utf.c index a69aafc8..f7923dee 100644 --- a/src/utils/utf.c +++ b/src/utils/utf.c @@ -53,7 +53,7 @@ void printUTF8(u32 c) { u64 utf8lenB(B x) { // doesn't consume; may error as it verifies whether is all chars assert(isArr(x)); - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); usz ia = a(x)->ia; u64 res = 0; for (usz i = 0; i < ia; i++) { @@ -63,7 +63,7 @@ u64 utf8lenB(B x) { // doesn't consume; may error as it verifies whether is all return res; } void toUTF8(B x, char* p) { // doesn't consume; doesn't verify anything; p must have utf8lenB(x) bytes (calculating which should verify that this call is ok) - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); usz ia = a(x)->ia; for (usz i = 0; i < ia; i++) { u32 c = o2cu(xgetU(x,i)); diff --git a/src/vm.c b/src/vm.c index c60873c0..7c04f3f5 100644 --- a/src/vm.c +++ b/src/vm.c @@ -123,7 +123,7 @@ void gsPrint() { Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B blocks, B nameList, Scope* sc, i32 depth) { usz cIA = a(block)->ia; if (cIA!=4 && cIA!=6) thrM("VM compiler: Bad block info size"); - BS2B bgetU = TI(block).getU; + BS2B bgetU = TI(block,getU); usz ty = o2s(bgetU(block,0)); if (ty>2) thrM("VM compiler: Bad type"); bool imm = o2b(bgetU(block,1)); usz idx = o2s(bgetU(block,2)); if (idx>=bcIA) thrM("VM compiler: Bytecode index out of bounds"); @@ -152,7 +152,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B block B varIDs = bgetU(block,4); for (i32 i = oSZ; i < nSZ; i++) { nE->vars[i] = bi_noVar; - nE->vars[i+nSZ] = TI(nameList).get(nameList, o2s(TI(varIDs).getU(varIDs, regAm+i))); + nE->vars[i+nSZ] = TI(nameList,get)(nameList, o2s(TI(varIDs,getU)(varIDs, regAm+i))); } sc->ext = nE; } @@ -185,7 +185,7 @@ Block* compileBlock(B block, Comp* comp, bool* bDone, u32* bc, usz bcIA, B block bDone[id] = true; TSADD(nBCT, DFND); TSADD(nBCT, TSSIZE(nBlT)); - TSADD(nBlT, compileBlock(TI(blocks).getU(blocks,id), comp, bDone, bc, bcIA, blocks, nameList, sc, depth+1)); + TSADD(nBlT, compileBlock(TI(blocks,getU)(blocks,id), comp, bDone, bc, bcIA, blocks, nameList, sc, depth+1)); break; } case LOCO: case LOCM: case LOCU: { @@ -281,21 +281,21 @@ NOINLINE Block* compile(B bcq, B objs, B blocks, B indices, B tokenInfo, B src, if (isNothing(tokenInfo)) { nameList = bi_emptyHVec; } else { - B t = TI(tokenInfo).getU(tokenInfo,2); - nameList = TI(t).getU(t,0); + B t = TI(tokenInfo,getU)(tokenInfo,2); + nameList = TI(t,getU)(t,0); } if (!isNothing(src) && !isNothing(indices)) { if (isAtm(indices) || rnk(indices)!=1 || a(indices)->ia!=2) thrM("VM compiler: Bad indices"); for (i32 i = 0; i < 2; i++) { - B ind = TI(indices).getU(indices,i); + B ind = TI(indices,getU)(indices,i); if (isAtm(ind) || rnk(ind)!=1 || a(ind)->ia!=bcIA) thrM("VM compiler: Bad indices"); - BS2B indGetU = TI(ind).getU; + BS2B indGetU = TI(ind,getU); for (usz j = 0; j < bcIA; j++) o2i(indGetU(ind,j)); } } TALLOC(bool,bDone,bIA); for (usz i = 0; i < bIA; i++) bDone[i] = false; - Block* ret = compileBlock(TI(blocks).getU(blocks, 0), comp, bDone, bc, bcIA, blocks, nameList, sc, 0); + Block* ret = compileBlock(TI(blocks,getU)(blocks, 0), comp, bDone, bc, bcIA, blocks, nameList, sc, 0); TFREE(bDone); ptr_dec(comp); dec(blocks); dec(tokenInfo); return ret; @@ -339,7 +339,7 @@ NOINLINE void v_setR(Scope* pscs[], B s, B x, bool upd) { } thrM("Assignment: Mismatched shape for spread assignment"); } - BS2B xgetU = TI(x).getU; + BS2B xgetU = TI(x,getU); for (u64 i = 0; i < ia; i++) v_set(pscs, sp[i], xgetU(x,i), upd); } } @@ -782,16 +782,16 @@ void print_vmStack() { void comp_init() { - ti[t_comp ].free = comp_free; ti[t_comp ].visit = comp_visit; ti[t_comp ].print = comp_print; - ti[t_body ].free = body_free; ti[t_body ].visit = body_visit; ti[t_body ].print = body_print; - ti[t_block ].free = block_free; ti[t_block ].visit = block_visit; ti[t_block ].print = block_print; - ti[t_scope ].free = scope_free; ti[t_scope ].visit = scope_visit; ti[t_scope ].print = scope_print; - ti[t_scopeExt ].free = scExt_free; ti[t_scopeExt ].visit = scExt_visit; ti[t_scopeExt ].print = scExt_print; - ti[t_blBlocks ].free = bBlks_free; ti[t_blBlocks ].visit = bBlks_visit; ti[t_blBlocks ].print = bBlks_print; - ti[t_fldAlias ].free = alias_free; ti[t_fldAlias ].visit = alias_visit; ti[t_fldAlias ].print = alias_print; - ti[t_fun_block].free = funBl_free; ti[t_fun_block].visit = funBl_visit; ti[t_fun_block].print = funBl_print; ti[t_fun_block].decompose = block_decompose; - ti[t_md1_block].free = md1Bl_free; ti[t_md1_block].visit = md1Bl_visit; ti[t_md1_block].print = md1Bl_print; ti[t_md1_block].decompose = block_decompose; ti[t_md1_block].m1_d=bl_m1d; - ti[t_md2_block].free = md2Bl_free; ti[t_md2_block].visit = md2Bl_visit; ti[t_md2_block].print = md2Bl_print; ti[t_md2_block].decompose = block_decompose; ti[t_md2_block].m2_d=bl_m2d; + TIi(t_comp ,free) = comp_free; TIi(t_comp ,visit) = comp_visit; TIi(t_comp ,print) = comp_print; + TIi(t_body ,free) = body_free; TIi(t_body ,visit) = body_visit; TIi(t_body ,print) = body_print; + TIi(t_block ,free) = block_free; TIi(t_block ,visit) = block_visit; TIi(t_block ,print) = block_print; + TIi(t_scope ,free) = scope_free; TIi(t_scope ,visit) = scope_visit; TIi(t_scope ,print) = scope_print; + TIi(t_scopeExt ,free) = scExt_free; TIi(t_scopeExt ,visit) = scExt_visit; TIi(t_scopeExt ,print) = scExt_print; + TIi(t_blBlocks ,free) = bBlks_free; TIi(t_blBlocks ,visit) = bBlks_visit; TIi(t_blBlocks ,print) = bBlks_print; + TIi(t_fldAlias ,free) = alias_free; TIi(t_fldAlias ,visit) = alias_visit; TIi(t_fldAlias ,print) = alias_print; + TIi(t_fun_block,free) = funBl_free; TIi(t_fun_block,visit) = funBl_visit; TIi(t_fun_block,print) = funBl_print; TIi(t_fun_block,decompose) = block_decompose; + TIi(t_md1_block,free) = md1Bl_free; TIi(t_md1_block,visit) = md1Bl_visit; TIi(t_md1_block,print) = md1Bl_print; TIi(t_md1_block,decompose) = block_decompose; TIi(t_md1_block,m1_d)=bl_m1d; + TIi(t_md2_block,free) = md2Bl_free; TIi(t_md2_block,visit) = md2Bl_visit; TIi(t_md2_block,print) = md2Bl_print; TIi(t_md2_block,decompose) = block_decompose; TIi(t_md2_block,m2_d)=bl_m2d; #ifndef GS_REALLOC allocStack((void**)&gStack, (void**)&gStackStart, (void**)&gStackEnd, sizeof(B), GS_SIZE); #endif @@ -834,7 +834,7 @@ void popCatch() { } NOINLINE B vm_fmtPoint(B src, B prepend, B path, usz cs, usz ce) { // consumes prepend - BS2B srcGetU = TI(src).getU; + BS2B srcGetU = TI(src,getU); usz srcL = a(src)->ia; usz srcS = cs; while (srcS>0 && o2cu(srcGetU(src,srcS-1))!='\n') srcS--; @@ -851,7 +851,7 @@ NOINLINE B vm_fmtPoint(B src, B prepend, B path, usz cs, usz ce) { // consumes p i64 padStart = padEnd; while (padStart>0 && o2cu(srcGetU(s,padStart-1))!='\n') padStart--; - Arr* slice = TI(src).slice(inc(src),srcS); arr_shVec(slice, srcE-srcS); + Arr* slice = TI(src,slice)(inc(src),srcS); arr_shVec(slice, srcE-srcS); AJOIN(taga(slice)); cs-= srcS; ce-= srcS; @@ -865,13 +865,13 @@ NOINLINE B vm_fmtPoint(B src, B prepend, B path, usz cs, usz ce) { // consumes p NOINLINE void vm_printPos(Comp* comp, i32 bcPos, i64 pos) { B src = comp->src; if (!isNothing(src) && !isNothing(comp->indices)) { - B inds = TI(comp->indices).getU(comp->indices, 0); usz cs = o2s(TI(inds).getU(inds,bcPos)); - B inde = TI(comp->indices).getU(comp->indices, 1); usz ce = o2s(TI(inde).getU(inde,bcPos))+1; + B inds = TI(comp->indices,getU)(comp->indices, 0); usz cs = o2s(TI(inds,getU)(inds,bcPos)); + B inde = TI(comp->indices,getU)(comp->indices, 1); usz ce = o2s(TI(inde,getU)(inde,bcPos))+1; // printf(" bcPos=%d\n", bcPos); // in case the pretty error generator is broken // printf(" inds:%d…%d\n", cs, ce); // int start = pos==-1? 0 : printf(N64d": ", pos); // usz srcL = a(src)->ia; - // BS2B srcGetU = TI(src).getU; + // BS2B srcGetU = TI(src,getU); // usz srcS = cs; while (srcS>0 && o2cu(srcGetU(src,srcS-1))!='\n') srcS--; // usz srcE = srcS; while (srcEsrcE) ce = srcE; @@ -924,7 +924,7 @@ void unwindCompiler() { NOINLINE void printErrMsg(B msg) { if (isArr(msg)) { - BS2B msgGetU = TI(msg).getU; + BS2B msgGetU = TI(msg,getU); usz msgLen = a(msg)->ia; for (usz i = 0; i < msgLen; i++) if (!isC32(msgGetU(msg,i))) goto base; printRaw(msg);