use TI macros everywhere

This commit is contained in:
dzaima 2021-07-06 19:22:45 +03:00
parent cd60db1c89
commit 08723a3c80
38 changed files with 377 additions and 375 deletions

View File

@ -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++) {

View File

@ -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;i<ria;i++)rp[i]=wv OP xp[i]; } \

View File

@ -39,7 +39,7 @@ B ud_c1(B t, B x) {
for (usz i = 0; i < xu; i++) rp[i] = i;
return r;
}
BS2B xgetU = TI(x).getU;
BS2B xgetU = TI(x,getU);
usz xia = a(x)->ia;
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;
}

View File

@ -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++) {

View File

@ -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);
}

View File

@ -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 (rr<xr) thrF("⌜: Result rank too large (%i≡=𝕨, %i≡=𝕩)", wr, xr);
BS2B wgetU = TI(w).getU;
BS2B xget = TI(x).get;
BS2B wgetU = TI(w,getU);
BS2B xget = TI(x,get);
BBB2B fc2 = c2fn(f);
usz ri = 0;
@ -92,7 +92,7 @@ B scan_c1(B d, B x) { B f = c(Md1D,d)->f;
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;
}

View File

@ -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;
}

View File

@ -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 = wia<xia? wia : xia;
mut_copy(r, 0 , w, 0, mid);
mut_copy(r, mid, x, 0, xia-mid);
@ -566,7 +566,7 @@ B shifta_c1(B t, B x) {
if (ia==0) return 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, 0, x, csz, ia-csz);
mut_fill(r, ia-csz, xf, csz);
return qWithFill(mut_fcd(r, x), xf);
@ -578,7 +578,7 @@ B shifta_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)));
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);

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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); }

View File

@ -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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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:;

View File

@ -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);
}

View File

@ -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;

View File

@ -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);
}

View File

@ -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);

View File

@ -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;

View File

@ -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");

View File

@ -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); }

View File

@ -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)); }

View File

@ -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);
}

View File

@ -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(nameID<a(cNL)->ia && 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;
}

View File

@ -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

View File

@ -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);
}

View File

@ -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() { }

View File

@ -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; }

View File

@ -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);

View File

@ -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);

View File

@ -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)<wsz && TI(x).elType==el_i32) {
if (wt==t_i32arr && fsizeof(I32Arr,a,i32,ria)<wsz && TI(x,elType)==el_i32) {
a(w)->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)<wsz && TI(x).elType==el_c32) {
if (wt==t_c32arr && fsizeof(C32Arr,a,u32,ria)<wsz && TI(x,elType)==el_c32) {
a(w)->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)<wsz && TI(x).elType==el_f64) { // TODO handle f64∾i32
if (wt==t_f64arr && fsizeof(F64Arr,a,f64,ria)<wsz && TI(x,elType)==el_f64) { // TODO handle f64∾i32
a(w)->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);

View File

@ -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));

View File

@ -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 (srcE<srcL) { u32 chr = o2cu(srcGetU(src, srcE)); if(chr=='\n')break; printUTF8(chr); srcE++; }
// if (ce>srcE) 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);