From 59e947cc20b8b02f8b16ef7baa9ddb32ef7e575d Mon Sep 17 00:00:00 2001 From: dzaima Date: Wed, 7 Sep 2022 23:56:03 +0300 Subject: [PATCH] more consistent type checking & conversion functions --- src/README.md | 32 +++++++++++-------- src/builtins/arithd.c | 22 ++++++------- src/builtins/cmp.c | 14 ++++----- src/builtins/fns.c | 2 +- src/builtins/internal.c | 2 +- src/builtins/md1.c | 4 +-- src/builtins/md2.c | 6 ++-- src/builtins/select.c | 2 +- src/builtins/sfns.c | 28 ++++++++--------- src/builtins/squeeze.c | 8 ++--- src/builtins/sysfn.c | 24 +++++++------- src/core/fillarr.c | 2 +- src/core/numarr.h | 2 +- src/core/stuff.c | 2 +- src/core/stuff.h | 4 +-- src/ffi.c | 30 +++++++++--------- src/h.h | 54 ++++++++++++++------------------ src/load.c | 4 +-- src/main.c | 2 +- src/singeli/c/arithdDispatch.c | 30 +++++++++--------- src/singeli/src/cbqnDefs.singeli | 6 ++-- src/utils/bits.c | 6 ++-- src/utils/each.c | 8 ++--- src/utils/file.c | 16 +++++----- src/utils/mut.c | 50 ++++++++++++++--------------- src/utils/mut.h | 16 +++++----- src/utils/utf.c | 2 +- src/vm.c | 16 +++++----- 28 files changed, 196 insertions(+), 198 deletions(-) diff --git a/src/README.md b/src/README.md index 74786bf2..5a3c2af2 100644 --- a/src/README.md +++ b/src/README.md @@ -83,19 +83,25 @@ Functions for converting/using basic types: m_c32(x) // codepoint → B m_i32(x) // i32 → B m_usz(x) // usz → B - o2i(x) // B → i32, throw if impossible - o2i64(x) // B → i64, throw if impossible - o2u64(x) // B → u64, throw if impossible - o2s(x) // B → usz, throw if impossible - o2c(x) // B → c32, throw if impossible - o2f(x) // B → f64, throw if impossible - o2iu(x) // B → i32, assumes is valid (u ≡ unchecked) - o2i64u(x) // B → i64, assumes is valid - o2su(x) // B → usz, assumes is valid - o2cu(x) // B → c32, assumes is valid - o2fu(x) // B → f64, assumes is valid - o2b(x) // B → bool, throw if impossible - q_TYPE(x) // query if x is convertible to TYPE (see definitions in h.h) + + // convert B to a basic type (first one errors on invalid, second assumes the conversion is doable losslessly): + o2b(x) o2bG(x) // bool + o2i(x) o2iG(x) // i32 + o2c(x) o2cG(x) // c32 + o2s(x) o2sG(x) // usz + o2f(x) o2fG(x) // f64 + o2i64(x) o2i64G(x) // i64 + o2u64(x) o2u64G(x) // u64 + + // test if f64 or B fit in a specified type: + q_fbit(x) q_bit(x) + q_fi8(x) q_i8(x) + q_fi16(x) q_i16(x) + q_fi32(x) q_i32(x) + q_fi64(x) q_i64(x) + q_fu64(x) q_u64(x) + q_fusz(x) q_usz(x) + q_N(x) // query if x is · (≡ bi_N) noFill(x) // if x represents undefined fill (returned by getFill*; ≡ bi_noFill) tag(x,*_TAG) // pointer → B diff --git a/src/builtins/arithd.c b/src/builtins/arithd.c index 2959e3ce..709a20bc 100644 --- a/src/builtins/arithd.c +++ b/src/builtins/arithd.c @@ -124,15 +124,15 @@ B floor_c2(B, B, B); #define REG_SA(NAME, EXPR) \ if (xe==el_bit) return bit_sel1Fn(NAME##_c2,w,x,1); \ - if (xe==el_i8 && q_i8 (w)) { PI8 (x) i8 wc=o2iu(w); DOI8 (EXPR,x,wc,xp[i],sa8B ) } sa8B :; \ - if (xe==el_i16 && q_i16(w)) { PI16(x) i16 wc=o2iu(w); DOI16(EXPR,x,wc,xp[i],sa16B) } sa16B:; \ - if (xe==el_i32 && q_i32(w)) { PI32(x) i32 wc=o2iu(w); DOI32(EXPR,x,wc,xp[i],sa32B) } sa32B:; \ + if (xe==el_i8 && q_i8 (w)) { PI8 (x) i8 wc=o2iG(w); DOI8 (EXPR,x,wc,xp[i],sa8B ) } sa8B :; \ + if (xe==el_i16 && q_i16(w)) { PI16(x) i16 wc=o2iG(w); DOI16(EXPR,x,wc,xp[i],sa16B) } sa16B:; \ + if (xe==el_i32 && q_i32(w)) { PI32(x) i32 wc=o2iG(w); DOI32(EXPR,x,wc,xp[i],sa32B) } sa32B:; \ if (xe==el_f64) { Rf64(x) PF(x) DOF(EXPR,w,w.f,xp[i]) goto dec_ret; } #define REG_AS(NAME, EXPR) \ if (we==el_bit) return bit_sel1Fn(NAME##_c2,w,x,0); \ - if (we==el_i8 && q_i8 (x)) { PI8 (w) i8 xc=o2iu(x); DOI8 (EXPR,w,wp[i],xc,as8B ) } as8B :; \ - if (we==el_i16 && q_i16(x)) { PI16(w) i16 xc=o2iu(x); DOI16(EXPR,w,wp[i],xc,as16B) } as16B:; \ - if (we==el_i32 && q_i32(x)) { PI32(w) i32 xc=o2iu(x); DOI32(EXPR,w,wp[i],xc,as32B) } as32B:; \ + if (we==el_i8 && q_i8 (x)) { PI8 (w) i8 xc=o2iG(x); DOI8 (EXPR,w,wp[i],xc,as8B ) } as8B :; \ + if (we==el_i16 && q_i16(x)) { PI16(w) i16 xc=o2iG(x); DOI16(EXPR,w,wp[i],xc,as16B) } as16B:; \ + if (we==el_i32 && q_i32(x)) { PI32(w) i32 xc=o2iG(x); DOI32(EXPR,w,wp[i],xc,as32B) } as32B:; \ if (we==el_f64) { Rf64(w) PF(w) DOF(EXPR,x,wp[i],x.f) goto dec_ret; } static B bitAA0(B w, B x, usz ia) { UD; } @@ -243,7 +243,7 @@ B floor_c2(B, B, B); AR_I_SA("⌈", ceil , wv>xv?wv:xv, REG_SA, {}) AR_I_SA("+", add, wv+xv, SI_SA, { if (isC32(w) && xe==el_i32) { - u32 wv = o2cu(w); + u32 wv = o2cG(w); i32* xp = i32any_ptr(x); usz xia = IA(x); u32* rp; r = m_c32arrc(&rp, x); for (usz i = 0; i < xia; i++) { @@ -258,7 +258,7 @@ B floor_c2(B, B, B); AR_I_AS("-", sub, wv-xv, SI_AS, { if (we==el_c32 && isC32(x)) { - i32 xv = (i32)o2cu(x); + i32 xv = (i32)o2cG(x); u32* wp = c32any_ptr(w); usz wia = IA(w); i32* rp; r = m_i32arrc(&rp, w); for (usz i = 0; i < wia; i++) rp[i] = (i32)wp[i] - xv; @@ -297,11 +297,11 @@ B floor_c2(B, B, B); } AR_I_SCALAR("+", add, w.f+x.f, { - 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 (isC32(w) & isF64(x)) { u64 r = (u64)(o2cG(w)+o2i64(x)); if(r>CHR_MAX)thrM("+: Invalid character"); return m_c32((u32)r); } + if (isF64(w) & isC32(x)) { u64 r = (u64)(o2cG(x)+o2i64(w)); if(r>CHR_MAX)thrM("+: Invalid character"); return m_c32((u32)r); } }); AR_I_SCALAR("-", sub, w.f-x.f, { - 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) & isF64(x)) { u64 r = (u64)((i32)o2cG(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); }) AR_I_SCALAR("×", mul, w.f*x.f, {}) diff --git a/src/builtins/cmp.c b/src/builtins/cmp.c index 99efac5b..33cf6b41 100644 --- a/src/builtins/cmp.c +++ b/src/builtins/cmp.c @@ -80,13 +80,13 @@ CMP_AA("≠", "?", ne, !=, wv^xv, swapped=0;) u8 xe = TI(x, elType); if (xe==el_B) goto bad; AL(x) \ switch(xe) { default: UD; \ case el_bit: { if (!q_bit(w)) break; u64 wv=bitx(w); u64* xp=bitarr_ptr(x); for(usz i=0;imax) max = o2cu(c); + if (o2cG(c)>max) max = o2cG(c); } ac8 = max == (u8 )max; ac16 = max == (u16)max; diff --git a/src/builtins/md1.c b/src/builtins/md1.c index 29e10391..2db8dfd2 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -236,7 +236,7 @@ B scan_c2(Md1D* d, B w, B x) { B f = d->f; u8 xe = TI(x,elType); if (xr==1 && q_i32(w) && elInt(xe) && isFun(f) && v(f)->flags) { u8 rtid = v(f)->flags-1; - i32 wv = o2iu(w); + i32 wv = o2iG(w); if (xe==el_bit) { u64* xp=bitarr_ptr(x); if (rtid==n_add) { i32* rp; B r=m_i32arrv(&rp, ia); i64 c=wv; for (usz i=0; if; usz ia = IA(x); u8 xe = TI(x,elType); if (q_i32(w) && isFun(f) && v(f)->flags && elInt(xe)) { - i32 wi = o2iu(w); + i32 wi = o2iG(w); u8 rtid = v(f)->flags-1; if (xe==el_bit) { u64* xp = bitarr_ptr(x); diff --git a/src/builtins/md2.c b/src/builtins/md2.c index 19429152..cb3b2373 100644 --- a/src/builtins/md2.c +++ b/src/builtins/md2.c @@ -77,7 +77,7 @@ B repeat_replace(B g, B* q) { // doesn't consume for (usz i = 0; i < ia; i++) HARR_ADD(r, i, repeat_replace(GetU(g,i), q)); return HARR_FC(r, g); } else { - return inc(q[o2i64u(g)]); + return inc(q[o2i64G(g)]); } } #define REPEAT_T(CN, END, ...) \ @@ -281,7 +281,7 @@ B rank_c1(Md2D* d, B x) { B f = d->f; B g = d->g; bool gf = isFun(g); if (RARE(gf)) g = c1(g, inc(x)); if (LIKELY(isNum(g))) { - kf = req_whole(o2fu(g)); + kf = req_whole(o2fG(g)); } else { usz gia = check_rank_vec(g); SGetU(g); kf = GetU(g, gia==2).f; @@ -344,7 +344,7 @@ B rank_c2(Md2D* d, B w, B x) { B f = d->f; B g = d->g; bool gf = isFun(g); if (RARE(gf)) g = c2(g, inc(w), inc(x)); if (LIKELY(isNum(g))) { - wf = xf = req_whole(o2fu(g)); + wf = xf = req_whole(o2fG(g)); } else { usz gia = check_rank_vec(g); SGetU(g); diff --git a/src/builtins/select.c b/src/builtins/select.c index 48582759..f6f11984 100644 --- a/src/builtins/select.c +++ b/src/builtins/select.c @@ -316,7 +316,7 @@ B select_ucw(B t, B o, B w, B x) { mut_copyG(r, 0, x, 0, xia); SGet(rep) for (usz i = 0; i < wia; i++) { - i64 cw = o2i64u(GetU(w, i)); if (RARE(cw<0)) cw+= (i64)xia; + i64 cw = o2i64G(GetU(w, i)); if (RARE(cw<0)) cw+= (i64)xia; B cr = Get(rep, i); EQ(!equal(mut_getU(r, cw), cr)); mut_rm(r, cw); diff --git a/src/builtins/sfns.c b/src/builtins/sfns.c index 798422f2..ed91ed8a 100644 --- a/src/builtins/sfns.c +++ b/src/builtins/sfns.c @@ -30,7 +30,7 @@ B m_vec1(B a) { else { i32* rp; B r = m_i32arrv(&rp, 1); rp[0] = i; return r; } } if (isC32(a)) { - u32 c = o2cu(a); + u32 c = o2cG(a); if (LIKELY(cria) ria = c; if (c<-1) thrM("⊔: 𝕨 can't contain elements less than ¯1"); } @@ -1383,7 +1383,7 @@ B group_c2(B t, B w, B x) { TALLOC(i32, lenO, ria+1); i32* len = lenO+1; TALLOC(i32, pos, ria); for (usz i = 0; i < ria; i++) len[i] = pos[i] = 0; - for (usz i = 0; i < xia; i++) len[o2i64u(GetU(w, i))]++; + for (usz i = 0; i < xia; i++) len[o2i64G(GetU(w, i))]++; Arr* r = arr_shVec(m_fillarrp(ria)); fillarr_setFill(r, m_f64(0)); B* rp = fillarr_ptr(r); @@ -1402,7 +1402,7 @@ B group_c2(B t, B w, B x) { fillarr_setFill(r, taga(rf)); SGet(x) for (usz i = 0; i < xia; i++) { - i64 n = o2i64u(GetU(w, i)); + i64 n = o2i64G(GetU(w, i)); if (n>=0) fillarr_ptr(a(rp[n]))[pos[n]++] = Get(x, i); } for (usz i = 0; i < ria; i++) a(rp[i])->ia = len[i]; @@ -1547,10 +1547,10 @@ B pick_ucw(B t, B o, B w, B x) { B arg = IGet(x, wi); B rep = c1(o, arg); if (reusable(x) && TI(x,canStore)(rep)) { REUSE(x); - if (TI(x,elType)==el_i8 ) { i8* xp = i8any_ptr (x); xp[wi] = o2iu(rep); return x; } - else if (TI(x,elType)==el_i16) { i16* xp = i16any_ptr(x); xp[wi] = o2iu(rep); return x; } - else if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); xp[wi] = o2iu(rep); return x; } - else if (TI(x,elType)==el_f64) { f64* xp = f64any_ptr(x); xp[wi] = o2fu(rep); return x; } + if (TI(x,elType)==el_i8 ) { i8* xp = i8any_ptr (x); xp[wi] = o2iG(rep); return x; } + else if (TI(x,elType)==el_i16) { i16* xp = i16any_ptr(x); xp[wi] = o2iG(rep); return x; } + else if (TI(x,elType)==el_i32) { i32* xp = i32any_ptr(x); xp[wi] = o2iG(rep); return x; } + else if (TI(x,elType)==el_f64) { f64* xp = f64any_ptr(x); xp[wi] = o2fG(rep); return x; } else if (TY(x)==t_harr) { B* xp = harr_ptr(x); dec(xp[wi]); @@ -1607,7 +1607,7 @@ B slash_ucw(B t, B o, B w, B x) { SGetU(rep) MUTG_INIT(r); for (usz i = 0; i < ia; i++) { - i32 cw = o2iu(GetU(w, i)); + i32 cw = o2iG(GetU(w, i)); if (cw) { B cr = Get(rep,repI); if (CHECK_VALID) for (i32 j = 1; j < cw; j++) if (!equal(GetU(rep,repI+j), cr)) { mut_pfree(r,i); thrM("𝔽⌾(a⊸/): Incompatible result elements"); } diff --git a/src/builtins/squeeze.c b/src/builtins/squeeze.c index b6ab2081..79059b91 100644 --- a/src/builtins/squeeze.c +++ b/src/builtins/squeeze.c @@ -20,7 +20,7 @@ NOINLINE B num_squeezeF(B x, usz ia) { a = (Arr*) cpyF64Arr(x); goto retn; } - i32 c = o2iu(cr); + i32 c = o2iG(cr); or|= ((u32)c & ~1) ^ (u32)(c>>31); } a = or==0? (Arr*)cpyBitArr(x) @@ -80,7 +80,7 @@ B num_squeeze(B x) { while (i>31); } goto mostI32; @@ -148,7 +148,7 @@ B chr_squeeze(B x) { #else for (; i < ia; i++) { if (!isC32(xp[i])) goto r_x; - or|= o2cu(xp[i]); + or|= o2cG(xp[i]); } #endif } else { @@ -156,7 +156,7 @@ B chr_squeeze(B x) { for (; i < ia; i++) { B cr = GetU(x,i); if (!isC32(cr)) goto r_x; - or|= o2cu(cr); + or|= o2cG(cr); } } if (or<=U8_MAX ) r_c8: return FL_SET(toC8Any(x), fl_squoze); diff --git a/src/builtins/sysfn.c b/src/builtins/sysfn.c index 6719260e..d755f879 100644 --- a/src/builtins/sysfn.c +++ b/src/builtins/sysfn.c @@ -123,7 +123,7 @@ B grLen_both(i64 ria, B x) { usz ia = IA(x); SGetU(x) for (usz i = 0; i < ia; i++) { - i64 c = o2i64u(GetU(x, i)); + i64 c = o2i64G(GetU(x, i)); if (c>ria) ria = c; } if (ria > (i64)(USZ_MAX-1)) thrOOM(); @@ -133,7 +133,7 @@ B grLen_both(i64 ria, B x) { u64* rp; r = m_bitarrv(&rp, ria); for (usz i = 0; i < BIT_N(ria); i++) rp[i] = 0; for (usz i = 0; i < ia; i++) { - i64 n = o2i64u(GetU(x, i)); assert(n>=-1); + i64 n = o2i64G(GetU(x, i)); assert(n>=-1); if (n>=0) { if (bitp_get(rp,n)) { decG(r); goto r_i32; } bitp_set(rp,n,1); @@ -145,13 +145,13 @@ B grLen_both(i64 ria, B x) { i32* rp; r = m_i32arrv(&rp, ria); for (usz i = 0; i < ria; i++) rp[i] = 0; for (usz i = 0; i < ia; i++) { - i64 n = o2i64u(GetU(x, i)); assert(n>=-1); + i64 n = o2i64G(GetU(x, i)); assert(n>=-1); if (n>=0) rp[n]++; } r_r: decG(x); return r; } B grLen_c1(B t, B x) { return grLen_both( -1, x); } // assumes valid arguments -B grLen_c2(B t, B w, B x) { return grLen_both(o2i64u(w)-1, x); } // assumes valid arguments +B grLen_c2(B t, B w, B x) { return grLen_both(o2i64G(w)-1, x); } // assumes valid arguments B grOrd_c2(B t, B w, B x) { // assumes valid arguments usz wia = IA(w); @@ -162,8 +162,8 @@ B grOrd_c2(B t, B w, B x) { // assumes valid arguments SGetU(x) TALLOC(usz, tmp, wia); tmp[0] = 0; - for (usz i = 1; i < wia; i++) tmp[i] = tmp[i-1]+o2su(GetU(w,i-1)); - usz ria = tmp[wia-1]+o2su(GetU(w,wia-1)); + for (usz i = 1; i < wia; i++) tmp[i] = tmp[i-1]+o2sG(GetU(w,i-1)); + usz ria = tmp[wia-1]+o2sG(GetU(w,wia-1)); i32* rp; B r = m_i32arrv(&rp, ria); if (xia>=I32_MAX) thrM("⊔: Too large"); for (usz i = 0; i < xia; i++) { @@ -175,17 +175,17 @@ B grOrd_c2(B t, B w, B x) { // assumes valid arguments } B asrt_c1(B t, B x) { - if (LIKELY(isF64(x) && o2fu(x)==1)) return x; + if (LIKELY(isF64(x) && o2fG(x)==1)) return x; if (isF64(x)) thrM("Assertion error"); thr(x); } B asrt_c2(B t, B w, B x) { - if (LIKELY(isF64(x) && o2fu(x)==1)) { dec(w); return x; } + if (LIKELY(isF64(x) && o2fG(x)==1)) { dec(w); return x; } dec(x); thr(w); } B casrt_c2(B t, B w, B x) { - if (LIKELY(isF64(x) && o2fu(x)==1)) { dec(w); return x; } + if (LIKELY(isF64(x) && o2fG(x)==1)) { dec(w); return x; } unwindCompiler(); dec(x); if (isArr(w) && IA(w)==2) { @@ -216,7 +216,7 @@ B casrt_c2(B t, B w, B x) { thr(w); } B casrt_c1(B t, B x) { - if (LIKELY(isF64(x) && o2fu(x)==1)) return x; + if (LIKELY(isF64(x) && o2fG(x)==1)) return x; casrt_c2(t, inc(x), x); UD; } @@ -377,7 +377,7 @@ B rand_range_c2(B t, B w, B x) { default: { usz* sh = arr_shAlloc(r, wia); SGetU(w); - for (usz i = 0; i < wia; i++) sh[i] = o2su(GetU(w, i)); + for (usz i = 0; i < wia; i++) sh[i] = o2sG(GetU(w, i)); } } } else { @@ -835,7 +835,7 @@ B fromUtf8_c1(B t, B x) { for (u64 i = 0; i < ia; i++) { B c = GetU(x,i); if (isC32(c)) { - u32 v = o2cu(c); + u32 v = o2cG(c); if (v>=256) thrF("•FromUTF8: Argument contained a character with codepoint %i", v); chrs[i] = v; } else { diff --git a/src/core/fillarr.c b/src/core/fillarr.c index ddd48a07..2170282a 100644 --- a/src/core/fillarr.c +++ b/src/core/fillarr.c @@ -182,7 +182,7 @@ NOINLINE B m_atomUnit(B x) { else if (xi==(i16)xi) { i16 v=xi; memcpy(&data, &v, sizeof(v)); t=t_i16arr; } else { i32 v=xi; memcpy(&data, &v, sizeof(v)); t=t_i32arr; } } else if (isC32(x)) { - u32 xi = o2cu(x); + u32 xi = o2cG(x); if (xi==(u8 )xi) { u8 v=xi; memcpy(&data, &v, sizeof(v)); t=t_c8arr; } else if (xi==(u16)xi) { u16 v=xi; memcpy(&data, &v, sizeof(v)); t=t_c16arr; } else { u32 v=xi; memcpy(&data, &v, sizeof(v)); t=t_c32arr; } diff --git a/src/core/numarr.h b/src/core/numarr.h index 52ad2ae7..1a0f050b 100644 --- a/src/core/numarr.h +++ b/src/core/numarr.h @@ -40,7 +40,7 @@ static inline u64 bitp_l1(u64* arr, u64 ia) { // last u64 of the array, with the return ia&63? arr[ia>>6]|~((1ULL<<(ia&63))-1) : ~0ULL; } static inline u64 bitx(B x) { // repeats the boolean across all 64 bits - return o2bu(x)? ~(u64)0 : 0; + return o2bG(x)? ~(u64)0 : 0; } // BitArr diff --git a/src/core/stuff.c b/src/core/stuff.c index fad70f7b..1f86ed94 100644 --- a/src/core/stuff.c +++ b/src/core/stuff.c @@ -597,7 +597,7 @@ bool isPureFn(B x) { // doesn't consume B2B dcf = TI(x,decompose); B xd = dcf(inc(x)); B* xdp = harr_ptr(xd); - i32 t = o2iu(xdp[0]); + i32 t = o2iG(xdp[0]); if (t<2) { decG(xd); return t==0; } usz xdia = IA(xd); for (u64 i = 1; ixt?1:0)-(wtx, 0 if w≡x; 0==compare(NaN,NaN) - if (isNum(w) & isNum(x)) return CMP(o2fu(w), o2fu(x)); - if (isC32(w) & isC32(x)) return CMP(o2cu(w), o2cu(x)); + if (isNum(w) & isNum(x)) return CMP(o2fG(w), o2fG(x)); + if (isC32(w) & isC32(x)) return CMP(o2cG(w), o2cG(x)); return compareF(w, x); } #undef CMP diff --git a/src/ffi.c b/src/ffi.c index 0a93b643..b5defd52 100644 --- a/src/ffi.c +++ b/src/ffi.c @@ -35,10 +35,10 @@ static void freeTagged(BQNV v) { } #define DIRECT_BQNV 1 -double bqn_toF64 (BQNV v) { double r = o2fu(getB(v)); freeTagged(v); return r; } -uint32_t bqn_toChar(BQNV v) { uint32_t r = o2cu(getB(v)); freeTagged(v); return r; } -double bqn_readF64 (BQNV v) { return o2fu(getB(v)); } -uint32_t bqn_readChar(BQNV v) { return o2cu(getB(v)); } +double bqn_toF64 (BQNV v) { double r = o2fG(getB(v)); freeTagged(v); return r; } +uint32_t bqn_toChar(BQNV v) { uint32_t r = o2cG(getB(v)); freeTagged(v); return r; } +double bqn_readF64 (BQNV v) { return o2fG(getB(v)); } +uint32_t bqn_readChar(BQNV v) { return o2cG(getB(v)); } void bqn_init() { cbqn_init(); @@ -222,7 +222,7 @@ typedef struct BQNFFIType { B vfyStr(B x, char* name, char* arg); static void printFFIType(FILE* f, B x) { - if (isC32(x)) fprintf(f, "%d", o2cu(x)); + if (isC32(x)) fprintf(f, "%d", o2cG(x)); else fprint(f, x); } @@ -298,7 +298,7 @@ BQNFFIEnt ffi_parseTypeStr(u32** src, bool inPtr) { // parse actual type else thrM("FFI: Bad integer width"); ro = m_c32(scty); } - parseRepr = !inPtr; myWidth = sty_w[o2cu(ro)]; + parseRepr = !inPtr; myWidth = sty_w[o2cG(ro)]; canRetype = inPtr; break; @@ -333,7 +333,7 @@ BQNFFIEnt ffi_parseTypeStr(u32** src, bool inPtr) { // parse actual type if (t=='u') if (n!=1 & n!=8 & n!=16 & n!=32) goto badW; if (t=='f') if (n!=64) goto badW; - if (isC32(ro) && n > myWidth*8) thrF("FFI: Representation wider than the value for \"%S:%c%i\"", sty_names[o2cu(ro)], t, n); + if (isC32(ro) && n > myWidth*8) thrF("FFI: Representation wider than the value for \"%S:%c%i\"", sty_names[o2cG(ro)], t, n); // TODO figure out what to do with i32:i32 etc B roP = ro; @@ -440,7 +440,7 @@ usz genObj(BQNFFIEnt ent, B c, bool anyMut) { // printFFIType(stdout,ent.o); printf(" = "); print(c); printf("\n"); usz pos; if (isC32(ent.o)) { // scalar - u32 t = o2cu(ent.o); + u32 t = o2cG(ent.o); pos = ffiTmpAA(t==0? sizeof(BQNV) : 8); void* ptr = ffiTmpS+pos; f64 f = c.f; @@ -466,10 +466,10 @@ usz genObj(BQNFFIEnt ent, B c, bool anyMut) { if (!isC32(e)) thrM("FFI: Complex pointer elements NYI"); inc(c); B cG; - if (!isArr(c)) thrF("FFI: Expected array corresponding to \"*%S\"", sty_names[o2cu(e)]); + if (!isArr(c)) thrF("FFI: Expected array corresponding to \"*%S\"", sty_names[o2cG(e)]); usz ia = IA(c); bool mut = t->a[0].mutPtr; - switch(o2cu(e)) { default: thrF("FFI: \"*%S\" argument type NYI", sty_names[o2cu(e)]); + switch(o2cG(e)) { default: thrF("FFI: \"*%S\" argument type NYI", sty_names[o2cG(e)]); case sty_i8: cG = mut? taga(cpyI8Arr (c)) : toI8Any (c); break; case sty_i16: cG = mut? taga(cpyI16Arr(c)) : toI16Any(c); break; case sty_i32: cG = mut? taga(cpyI32Arr(c)) : toI32Any(c); break; @@ -488,7 +488,7 @@ usz genObj(BQNFFIEnt ent, B c, bool anyMut) { u8 reW = t->a[0].reWidth; if (isC32(o2)) { // scalar:any pos = ffiTmpAA(8); - u8 et = o2cu(o2); + u8 et = o2cG(o2); u8 etw = sty_w[et]*8; if (!isArr(c)) thrF("FFI: Expected array corresponding to \"%S:%c%i\"", sty_names[et], reT, 1<>reW) thrM("FFI: Bad input array length"); @@ -532,7 +532,7 @@ B buildObj(BQNFFIEnt ent, bool anyMut, B* objs, usz* objPos) { bool mut = t->a[0].mutPtr; if (mut) { usz ia = IA(f); - switch(o2cu(e)) { default: UD; + switch(o2cG(e)) { default: UD; case sty_i8: case sty_i16: case sty_i32: case sty_f64: return inc(f); case sty_u8: { u8* tp=tyarr_ptr(f); i16* rp; B r=m_i16arrv(&rp, ia); for (usz i=0; ity == cty_repr) { B o2 = t->a[0].o; if (!isC32(o2)) thrM("FFI: Unimplemented result type"); - resCType = o2cu(o2); + resCType = o2cG(o2); } else thrM("FFI: Unimplemented result type"); } resPos = ffiTmpAA(resCType==sty_a? sizeof(BQNV) : sizeof(ffi_arg)>8? sizeof(ffi_arg) : 8); @@ -626,7 +626,7 @@ B libffiFn_c2(B t, B w, B x) { } } else { // cty_repr, scalar:x BQNFFIType* t = c(BQNFFIType, ents[0].o); - u8 et = o2cu(t->a[0].o); + u8 et = o2cG(t->a[0].o); u8 reT = t->a[0].reType; u8 reW = t->a[0].reWidth; u8 etw = sty_w[et]; diff --git a/src/h.h b/src/h.h index b5c2b98f..4afb5a87 100644 --- a/src/h.h +++ b/src/h.h @@ -417,40 +417,32 @@ FORCE_INLINE bool isPrim(B x) { return isCallable(x) && v(x)->flags; } static B m_f64(f64 n) { assert(isF64(b(n))); return b(n); } // assert just to make sure we're actually creating a float static B m_c32(u32 n) { return tagu64(n,C32_TAG); } // TODO check validity? static B m_i32(i32 n) { return m_f64(n); } -static B m_usz(usz n) { return n>8 == ((u64)C32_TAG)<<40; } +FORCE_INLINE bool q_c16(B x) { return x.u>>16 == ((u64)C32_TAG)<<32; } +FORCE_INLINE bool q_c32(B x) { return isC32(x); } +FORCE_INLINE bool q_N (B x) { return x.u==bi_N.u; } // is · +FORCE_INLINE bool noFill(B x) { return x.u==bi_noFill.u; } -static bool q_N (B x) { return x.u==bi_N.u; } // is · -static bool noFill(B x) { return x.u==bi_noFill.u; } -static i32 o2i (B x) { if (!q_i32(x)) thrM("Expected integer"); return (i32)x.f; } // i have no clue whether these consume or not, but it doesn't matter -static usz o2s (B x) { if (!q_usz(x)) thrM("Expected non-negative integer"); return (usz)x.f; } -static i64 o2i64 (B x) { if (!q_i64(x)) thrM("Expected integer"); return (i64)x.f; } -static u64 o2u64 (B x) { if (!q_u64(x)) thrM("Expected integer"); return (u64)x.f; } -static f64 o2f (B x) { if (!isNum(x)) thrM("Expected number"); return x.f; } -static u32 o2c (B x) { if (!isC32(x)) thrM("Expected character"); return (u32)x.u; } -static i32 o2iu (B x) { return (i32)x.f; } -static u32 o2cu (B x) { return (u32)x.u; } -static usz o2su (B x) { return (usz)x.f; } -static f64 o2fu (B x) { return x.f; } -static i64 o2i64u(B x) { return (i64)x.f; } +FORCE_INLINE bool o2bG(B x) { return(x.u<<1)!=0;} FORCE_INLINE bool o2b(B x) { i32 t=(i32)x.f; if(t!=x.f || t!=0&t!=1)thrM("Expected boolean"); return o2bG(x); } +FORCE_INLINE i32 o2iG(B x) { return (i32)x.f; } FORCE_INLINE i32 o2i(B x) { if (!q_i32(x)) thrM("Expected integer"); return o2iG(x); } +FORCE_INLINE u32 o2cG(B x) { return (u32)x.u; } FORCE_INLINE u32 o2c(B x) { if (!isC32(x)) thrM("Expected character"); return o2cG(x); } +FORCE_INLINE usz o2sG(B x) { return (usz)x.f; } FORCE_INLINE usz o2s(B x) { if (!q_usz(x)) thrM("Expected non-negative integer"); return o2sG(x); } +FORCE_INLINE f64 o2fG(B x) { return x.f; } FORCE_INLINE f64 o2f(B x) { if (!isNum(x)) thrM("Expected number"); return o2fG(x); } +FORCE_INLINE i64 o2i64G(B x) { return (i64)x.f; } FORCE_INLINE i64 o2i64(B x) { if (!q_i64(x)) thrM("Expected integer"); return o2i64G(x); } +FORCE_INLINE u64 o2u64G(B x) { return (u64)x.f; } FORCE_INLINE u64 o2u64(B x) { if (!q_u64(x)) thrM("Expected integer"); return o2u64G(x); } typedef struct Slice { diff --git a/src/load.c b/src/load.c index 844a0726..a72b8960 100644 --- a/src/load.c +++ b/src/load.c @@ -248,7 +248,7 @@ void init_comp(B* set, B prim) { B gv = GetU(prim, i); B v = IGet(gv, 1); i32 t = isFun(v)? 0 : isMd1(v)? 1 : isMd2(v)? 2 : 3; - *(gl[t]++) = o2cu(IGet(gv, 0)); + *(gl[t]++) = o2cG(IGet(gv, 0)); prh.a[np[t]++] = v; } @@ -284,7 +284,7 @@ B rebqn_exec(B str, B path, B args, B o) { comp_currRe = inc(o); B* op = harr_ptr(o); - i32 replMode = o2iu(op[0]); + i32 replMode = o2iG(op[0]); Scope* sc = c(Scope, op[1]); B res; if (replMode>0) { diff --git a/src/main.c b/src/main.c index 335a914f..55992ef5 100644 --- a/src/main.c +++ b/src/main.c @@ -135,7 +135,7 @@ void cbqn_runLine0(char* ln, i64 read) { if (IA(c) != len) continue; SGetU(c) bool ok = true; - for (i32 j = 0; j < len; j++) ok&= o2cu(GetU(c, j))==name[j]; + for (i32 j = 0; j < len; j++) ok&= o2cG(GetU(c, j))==name[j]; if (ok) { B val = e->vars[i]; e->vars[i] = bi_noVar; diff --git a/src/singeli/c/arithdDispatch.c b/src/singeli/c/arithdDispatch.c index 843743db..651efd89 100644 --- a/src/singeli/c/arithdDispatch.c +++ b/src/singeli/c/arithdDispatch.c @@ -235,7 +235,7 @@ B dyArith_SA(DyTableSA* table, B w, B x) { table = t2; - wa = o2cu(w); + wa = o2cG(w); newXEc: switch(xe) { default: UD; case el_bit: goto bitsel; @@ -269,15 +269,15 @@ B dyArith_SA(DyTableSA* table, B w, B x) { case el_B: goto rec; } - wint: wa=(u32)o2iu(w); goto f1; + wint: wa=(u32)o2iG(w); goto f1; wf64: wa=w.u; goto f1; - iwiden_i8: if (q_i16(w)) { wa=(u32)o2iu(w); type=t_i16arr; goto cpy_i16; } - iwiden_i16: if (q_i32(w)) { wa=(u32)o2iu(w); type=t_i32arr; goto cpy_i32; } + iwiden_i8: if (q_i16(w)) { wa=(u32)o2iG(w); type=t_i16arr; goto cpy_i16; } + iwiden_i16: if (q_i32(w)) { wa=(u32)o2iG(w); type=t_i32arr; goto cpy_i32; } iwiden_i32: { wa=w.u; type=t_f64arr; goto cpy_f64; } - iwiden_c8: if (q_i16(w)) { wa=(u32)o2iu(w); type=t_c16arr; goto cpy_c16; } - iwiden_c16: if (q_i32(w)) { wa=(u32)o2iu(w); type=t_c32arr; goto cpy_c32; } + iwiden_c8: if (q_i16(w)) { wa=(u32)o2iG(w); type=t_c16arr; goto cpy_c16; } + iwiden_c16: if (q_i32(w)) { wa=(u32)o2iG(w); type=t_c32arr; goto cpy_c32; } goto rec; // TODO reuse the copied array for the result; maybe even alternate copy & operation to stay in cache @@ -323,15 +323,15 @@ static void powAAu_f64_f64_f64(u8* r, u8* w, u8* x, u64 len) { for (u64 i = 0; static void stileAAu_f64_f64_f64(u8* r, u8* w, u8* x, u64 len) { for (u64 i = 0; i < len; i++) ((f64*)r)[i] = pfmod(((f64*)x)[i], ((f64*)w)[i]); } static void logAAu_f64_f64_f64(u8* r, u8* w, u8* x, u64 len) { for (u64 i = 0; i < len; i++) ((f64*)r)[i] = log(((f64*)x)[i])/log(((f64*)w)[i]); } -bool add_forBitselNN_SA (DyTableSA* table, B w, B* r) { f64 f=o2fu(w); r[0] = m_f64(f+0); r[1] = m_f64(f+1); return true; } -bool sub_forBitselNN_SA (DyTableSA* table, B w, B* r) { f64 f=o2fu(w); r[0] = m_f64(f-0); r[1] = m_f64(f-1); return true; } -bool subR_forBitselNN_SA(DyTableSA* table, B w, B* r) { f64 f=o2fu(w); r[0] = m_f64(0-f); r[1] = m_f64(1-f); return true; } -bool mul_forBitselNN_SA (DyTableSA* table, B w, B* r) { f64 f=o2fu(w); r[0] = m_f64(f*0); r[1] = m_f64(f*1); return true; } -bool min_forBitselNN_SA (DyTableSA* table, B w, B* r) { f64 f=o2fu(w); r[0] = m_f64(f<=0?f:0); r[1] = m_f64(f<=1?f:1); return true; } -bool max_forBitselNN_SA (DyTableSA* table, B w, B* r) { f64 f=o2fu(w); r[0] = m_f64(f>=0?f:0); r[1] = m_f64(f>=1?f:1); return true; } +bool add_forBitselNN_SA (DyTableSA* table, B w, B* r) { f64 f=o2fG(w); r[0] = m_f64(f+0); r[1] = m_f64(f+1); return true; } +bool sub_forBitselNN_SA (DyTableSA* table, B w, B* r) { f64 f=o2fG(w); r[0] = m_f64(f-0); r[1] = m_f64(f-1); return true; } +bool subR_forBitselNN_SA(DyTableSA* table, B w, B* r) { f64 f=o2fG(w); r[0] = m_f64(0-f); r[1] = m_f64(1-f); return true; } +bool mul_forBitselNN_SA (DyTableSA* table, B w, B* r) { f64 f=o2fG(w); r[0] = m_f64(f*0); r[1] = m_f64(f*1); return true; } +bool min_forBitselNN_SA (DyTableSA* table, B w, B* r) { f64 f=o2fG(w); r[0] = m_f64(f<=0?f:0); r[1] = m_f64(f<=1?f:1); return true; } +bool max_forBitselNN_SA (DyTableSA* table, B w, B* r) { f64 f=o2fG(w); r[0] = m_f64(f>=0?f:0); r[1] = m_f64(f>=1?f:1); return true; } -bool add_forBitselCN_SA(DyTableSA* table, B w, B* r) { u32 wc=o2cu(w); if(wc+1<=CHR_MAX) return false; r[0] = m_c32(wc); r[1] = m_c32(wc+1); return true; } -bool sub_forBitselCN_SA(DyTableSA* table, B w, B* r) { u32 wc=o2cu(w); if(wc !=0 ) return false; r[0] = m_c32(wc); r[1] = m_c32(wc-1); return true; } +bool add_forBitselCN_SA(DyTableSA* table, B w, B* r) { u32 wc=o2cG(w); if(wc+1<=CHR_MAX) return false; r[0] = m_c32(wc); r[1] = m_c32(wc+1); return true; } +bool sub_forBitselCN_SA(DyTableSA* table, B w, B* r) { u32 wc=o2cG(w); if(wc !=0 ) return false; r[0] = m_c32(wc); r[1] = m_c32(wc-1); return true; } B sub_c2R(B t, B w, B x) { return sub_c2(t, x, w); } @@ -339,7 +339,7 @@ static NOINLINE B or_SA(B t, B w, B x) { if (!isF64(w)) return arith_recd(or_c2, w, x); if (LIKELY(TI(x,elType)==el_bit)) { bitsel: - f64 wf = o2fu(w); + f64 wf = o2fG(w); return bit_sel(x, m_f64(bqn_or(wf, 0)), 1, m_f64(bqn_or(wf, 1)), 1); } x = num_squeezeChk(x); diff --git a/src/singeli/src/cbqnDefs.singeli b/src/singeli/src/cbqnDefs.singeli index d8cdb842..6c00cb9a 100644 --- a/src/singeli/src/cbqnDefs.singeli +++ b/src/singeli/src/cbqnDefs.singeli @@ -1,7 +1,7 @@ def bcall{T, f, x} = emit{T, 'BCALL', f, x} -def from_B{T, x & T==f64} = bcall{T, 'o2fu', x} -def from_B{T, x & T<=i32 & issigned{T}} = bcall{T, 'o2iu', x} -def from_B{T, x & T<=u32 & isunsigned{T}} = bcall{T, 'o2cu', x} +def from_B{T, x & T==f64} = bcall{T, 'o2fG', x} +def from_B{T, x & T<=i32 & issigned{T}} = bcall{T, 'o2iG', x} +def from_B{T, x & T<=u32 & isunsigned{T}} = bcall{T, 'o2cG', x} def q_f64{x} = bcall{u1, 'q_f64', x} def q_chr{x} = bcall{u1, 'q_c32', x} diff --git a/src/utils/bits.c b/src/utils/bits.c index 2ecf10bd..e58b8d4e 100644 --- a/src/utils/bits.c +++ b/src/utils/bits.c @@ -11,8 +11,8 @@ NOINLINE B bit_sel(B b, B e0, bool h0, B e1, bool h1) { u64* bp = bitarr_ptr(b); usz ia = IA(b); if (elNum(t0) && elNum(t1)) { B r; - f64 f0 = o2fu(e0); i32 i0 = f0; - f64 f1 = o2fu(e1); i32 i1 = f1; + f64 f0 = o2fG(e0); i32 i0 = f0; + f64 f1 = o2fG(e1); i32 i1 = f1; u8 tM = t0>t1? t0 : t1; if (tM==el_bit) { if (i0) { @@ -28,7 +28,7 @@ NOINLINE B bit_sel(B b, B e0, bool h0, B e1, bool h1) { else if (tM==el_i32) { i32* rp; r=m_i32arrc(&rp, b); for (usz i = 0; i < ia; i++) rp[i] = bitp_get(bp,i)? i1 : i0; } else { f64* rp; r=m_f64arrc(&rp, b); for (usz i = 0; i < ia; i++) rp[i] = bitp_get(bp,i)? f1 : f0; } decG(b); return r; - } else if (elChr(t0) && elChr(t1)) { B r; u32 u0 = o2cu(e0); u32 u1 = o2cu(e1); + } else if (elChr(t0) && elChr(t1)) { B r; u32 u0 = o2cG(e0); u32 u1 = o2cG(e1); if (t0<=el_c8 & t1<=el_c8 ) { u8* rp; r=m_c8arrc (&rp, b); for (usz i = 0; i < ia; i++) rp[i] = bitp_get(bp,i)? u1 : u0; } else if (t0<=el_c16 & t1<=el_c16) { u16* rp; r=m_c16arrc(&rp, b); for (usz i = 0; i < ia; i++) rp[i] = bitp_get(bp,i)? u1 : u0; } else { u32* rp; r=m_c32arrc(&rp, b); for (usz i = 0; i < ia; i++) rp[i] = bitp_get(bp,i)? u1 : u0; } diff --git a/src/utils/each.c b/src/utils/each.c index a0b5a911..73aed598 100644 --- a/src/utils/each.c +++ b/src/utils/each.c @@ -77,7 +77,7 @@ B eachm_fn(B fo, B x, BB2B f) { // TODO definitely rewrite this. Probably still B r; i32* rp; if (reuse && TY(x)==t_i32arr) { r=incG(REUSE(x)); rp = xp; } else r = m_i32arrc(&rp, x); - rp[i++] = o2iu(cr); + rp[i++] = o2iG(cr); for (; i < ia; i++) { cr = f(fo, m_i32(xp[i])); if (!q_i32(cr)) { @@ -86,7 +86,7 @@ B eachm_fn(B fo, B x, BB2B f) { // TODO definitely rewrite this. Probably still decG(r); goto fallback; } - rp[i] = o2iu(cr); + rp[i] = o2iG(cr); } decG(x); return num_squeeze(r); @@ -95,7 +95,7 @@ B eachm_fn(B fo, B x, BB2B f) { // TODO definitely rewrite this. Probably still B r; f64* rp; if (reuse && TY(x)==t_f64arr) { r=incG(REUSE(x)); rp = xp; } else r = m_f64arrc(&rp, x); - rp[i++] = o2fu(cr); + rp[i++] = o2fG(cr); for (; i < ia; i++) { cr = f(fo, m_f64(xp[i])); if (!q_f64(cr)) { @@ -104,7 +104,7 @@ B eachm_fn(B fo, B x, BB2B f) { // TODO definitely rewrite this. Probably still decG(r); goto fallback; } - rp[i] = o2fu(cr); + rp[i] = o2fG(cr); } decG(x); return num_squeeze(r); diff --git a/src/utils/file.c b/src/utils/file.c index 9e16ef57..a300a6be 100644 --- a/src/utils/file.c +++ b/src/utils/file.c @@ -102,18 +102,18 @@ B path_rel(B base, B rel) { // consumes rel; assumes base is a char vector or bi usz ria = IA(rel); if (RNK(rel)!=1) thrM("Paths must be character vectors"); guaranteeStr(rel); - if (ria>0 && o2cu(GetU(rel, 0))=='/') return rel; + if (ria>0 && o2cG(GetU(rel, 0))=='/') return rel; if (q_N(base)) thrM("Using relative path with no absolute base path known"); if (ria==0) { dec(rel); return incG(base); } usz bia = IA(base); if (bia==0) return rel; SGetU(base) - bool has = o2cu(GetU(base, bia-1))=='/'; + bool has = o2cG(GetU(base, bia-1))=='/'; u32* rp; B r = m_c32arrv(&rp, bia+ria+(has?0:1)); usz ri = 0; - for (usz i = 0; i < bia-(has?1:0); i++) rp[ri++] = o2cu(GetU(base, i)); + for (usz i = 0; i < bia-(has?1:0); i++) rp[ri++] = o2cG(GetU(base, i)); rp[ri++] = '/'; - for (usz i = 0; i < ria; i++) rp[ri++] = o2cu(GetU(rel, i)); + for (usz i = 0; i < ria; i++) rp[ri++] = o2cG(GetU(rel, i)); dec(rel); return r; } @@ -125,9 +125,9 @@ B path_parent(B path) { if (pia==0) thrM("Empty file path"); guaranteeStr(path); for (i64 i = (i64)pia-2; i >= 0; i--) { - if (o2cu(GetU(path, i))=='/') return taga(arr_shVec(TI(path,slice)(path, 0, i+1))); + if (o2cG(GetU(path, i))=='/') return taga(arr_shVec(TI(path,slice)(path, 0, i+1))); } - if (o2cu(GetU(path, 0))=='/') return path; + if (o2cG(GetU(path, 0))=='/') return path; dec(path); u32* rp; B r = m_c32arrv(&rp, 2); rp[0] = '.'; rp[1] = '/'; return r; @@ -139,7 +139,7 @@ B path_name(B path) { if (pia==0) thrM("Empty file path"); guaranteeStr(path); for (i64 i = (i64)pia-1; i >= 0; i--) { - if (o2cu(GetU(path, i))=='/') { + if (o2cG(GetU(path, i))=='/') { if (i == pia-1) thrF("File path ended with a slash: \"%R\"", path); return taga(arr_shVec(TI(path,slice)(path, i+1, pia - (i+1)))); } @@ -180,7 +180,7 @@ CharBuf get_chars(B x) { SGetU(x) for (u64 i = 0; i < len; i++) { B c = GetU(x,i); - buf[i] = isNum(c)? o2iu(c) : o2c(c); + buf[i] = isNum(c)? o2iG(c) : o2c(c); } } return (CharBuf){.data=buf, .alloc=alloc}; diff --git a/src/utils/mut.c b/src/utils/mut.c index 7e66146e..132264e1 100644 --- a/src/utils/mut.c +++ b/src/utils/mut.c @@ -90,25 +90,25 @@ B vec_join(B w, B x) { static RT m_##N##G_##TY ARGS DEF_S(void, set, MAX, false, x, (void* a, usz ms, B x), ms, x) { err("m_setG_MAX"); } -DEF_S(void, set, bit, q_bit(x), x, (void* a, usz ms, B x), ms, x) { bitp_set((u64*)a, ms, o2bu(x)); } -DEF_S(void, set, i8, q_i8 (x), x, (void* a, usz ms, B x), ms, x) { (( i8*)a)[ms] = o2iu(x); } -DEF_S(void, set, i16, q_i16(x), x, (void* a, usz ms, B x), ms, x) { ((i16*)a)[ms] = o2iu(x); } -DEF_S(void, set, i32, q_i32(x), x, (void* a, usz ms, B x), ms, x) { ((i32*)a)[ms] = o2iu(x); } -DEF_S(void, set, c8, q_c8 (x), x, (void* a, usz ms, B x), ms, x) { (( u8*)a)[ms] = o2cu(x); } -DEF_S(void, set, c16, q_c16(x), x, (void* a, usz ms, B x), ms, x) { ((u16*)a)[ms] = o2cu(x); } -DEF_S(void, set, c32, q_c32(x), x, (void* a, usz ms, B x), ms, x) { ((u32*)a)[ms] = o2cu(x); } -DEF_S(void, set, f64, q_f64(x), x, (void* a, usz ms, B x), ms, x) { ((f64*)a)[ms] = o2fu(x); } +DEF_S(void, set, bit, q_bit(x), x, (void* a, usz ms, B x), ms, x) { bitp_set((u64*)a, ms, o2bG(x)); } +DEF_S(void, set, i8, q_i8 (x), x, (void* a, usz ms, B x), ms, x) { (( i8*)a)[ms] = o2iG(x); } +DEF_S(void, set, i16, q_i16(x), x, (void* a, usz ms, B x), ms, x) { ((i16*)a)[ms] = o2iG(x); } +DEF_S(void, set, i32, q_i32(x), x, (void* a, usz ms, B x), ms, x) { ((i32*)a)[ms] = o2iG(x); } +DEF_S(void, set, c8, q_c8 (x), x, (void* a, usz ms, B x), ms, x) { (( u8*)a)[ms] = o2cG(x); } +DEF_S(void, set, c16, q_c16(x), x, (void* a, usz ms, B x), ms, x) { ((u16*)a)[ms] = o2cG(x); } +DEF_S(void, set, c32, q_c32(x), x, (void* a, usz ms, B x), ms, x) { ((u32*)a)[ms] = o2cG(x); } +DEF_S(void, set, f64, q_f64(x), x, (void* a, usz ms, B x), ms, x) { ((f64*)a)[ms] = o2fG(x); } DEF_G(void, set, B, (void* a, usz ms, B x), ms, x) { (( B*)a)[ms] = x; } DEF_S(void, fill, MAX, false, x, (void* a, usz ms, B x, usz l), ms, x, l) { err("m_fillG_MAX"); } -DEF_S(void, fill, bit, q_bit(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { u64* p = (u64*)a;bool v = o2bu(x); for (usz i = 0; i < l; i++) bitp_set(p, ms+i, v); } -DEF_S(void, fill, i8 , q_i8 (x), x, (void* a, usz ms, B x, usz l), ms, x, l) { i8* p = ms+( i8*)a; i8 v = o2iu(x); for (usz i = 0; i < l; i++) p[i] = v; } -DEF_S(void, fill, i16, q_i16(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { i16* p = ms+(i16*)a; i16 v = o2iu(x); for (usz i = 0; i < l; i++) p[i] = v; } -DEF_S(void, fill, i32, q_i32(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { i32* p = ms+(i32*)a; i32 v = o2iu(x); for (usz i = 0; i < l; i++) p[i] = v; } -DEF_S(void, fill, c8 , q_c8 (x), x, (void* a, usz ms, B x, usz l), ms, x, l) { u8* p = ms+( u8*)a; u8 v = o2cu(x); for (usz i = 0; i < l; i++) p[i] = v; } -DEF_S(void, fill, c16, q_c16(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { u16* p = ms+(u16*)a; u16 v = o2cu(x); for (usz i = 0; i < l; i++) p[i] = v; } -DEF_S(void, fill, c32, q_c32(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { u32* p = ms+(u32*)a; u32 v = o2cu(x); for (usz i = 0; i < l; i++) p[i] = v; } -DEF_S(void, fill, f64, isF64(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { f64* p = ms+(f64*)a; f64 v = o2fu(x); for (usz i = 0; i < l; i++) p[i] = v; } +DEF_S(void, fill, bit, q_bit(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { u64* p = (u64*)a;bool v = o2bG(x); for (usz i = 0; i < l; i++) bitp_set(p, ms+i, v); } +DEF_S(void, fill, i8 , q_i8 (x), x, (void* a, usz ms, B x, usz l), ms, x, l) { i8* p = ms+( i8*)a; i8 v = o2iG(x); for (usz i = 0; i < l; i++) p[i] = v; } +DEF_S(void, fill, i16, q_i16(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { i16* p = ms+(i16*)a; i16 v = o2iG(x); for (usz i = 0; i < l; i++) p[i] = v; } +DEF_S(void, fill, i32, q_i32(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { i32* p = ms+(i32*)a; i32 v = o2iG(x); for (usz i = 0; i < l; i++) p[i] = v; } +DEF_S(void, fill, c8 , q_c8 (x), x, (void* a, usz ms, B x, usz l), ms, x, l) { u8* p = ms+( u8*)a; u8 v = o2cG(x); for (usz i = 0; i < l; i++) p[i] = v; } +DEF_S(void, fill, c16, q_c16(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { u16* p = ms+(u16*)a; u16 v = o2cG(x); for (usz i = 0; i < l; i++) p[i] = v; } +DEF_S(void, fill, c32, q_c32(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { u32* p = ms+(u32*)a; u32 v = o2cG(x); for (usz i = 0; i < l; i++) p[i] = v; } +DEF_S(void, fill, f64, isF64(x), x, (void* a, usz ms, B x, usz l), ms, x, l) { f64* p = ms+(f64*)a; f64 v = o2fG(x); for (usz i = 0; i < l; i++) p[i] = v; } DEF_G(void, fill, B , (void* a, usz ms, B x, usz l), ms, x, l) { B* p = ms + (B*)a; for (usz i = 0; i < l; i++) p[i] = x; @@ -246,11 +246,11 @@ DEF_G(void, copy, B, (void* a, usz ms, B x, usz xs, usz l), ms, x, x else decG(x); \ return (T##Arr*)r; \ } - #define BIT_PUT(V) bitp_set((u64*)rp, i, o2bu(V)) + #define BIT_PUT(V) bitp_set((u64*)rp, i, o2bG(V)) #define H2T_COPY(T) copy##T##Fns[el_MAX]((u8*)bxp, rp, ia, xRaw) #define MAKE_TYCPY(T, E, F, ...) MAKE_CPY(1, T##Atom* rp; Arr* r = m_##E##arrp(&rp, ia), getU, ((T##Atom*)rp)[i] = F, rp, H2T_COPY(T), T, __VA_ARGS__) - #define MAKE_CCPY(T,E) MAKE_TYCPY(T, E, o2cu, {badCopy, badCopy, badCopy, badCopy, badCopy, COPY_FN(c8,E),COPY_FN(c16,E),COPY_FN(c32,E),cpy##T##Arr_B,COPY_FN(B,E)}) - #define MAKE_ICPY(T,E) MAKE_TYCPY(T, E, o2fu, {COPY_FN(1,E),COPY_FN(i8,E),COPY_FN(i16,E),COPY_FN(i32,E),COPY_FN(f64,E),badCopy, badCopy, badCopy, cpy##T##Arr_B,COPY_FN(f64,E)}) + #define MAKE_CCPY(T,E) MAKE_TYCPY(T, E, o2cG, {badCopy, badCopy, badCopy, badCopy, badCopy, COPY_FN(c8,E),COPY_FN(c16,E),COPY_FN(c32,E),cpy##T##Arr_B,COPY_FN(B,E)}) + #define MAKE_ICPY(T,E) MAKE_TYCPY(T, E, o2fG, {COPY_FN(1,E),COPY_FN(i8,E),COPY_FN(i16,E),COPY_FN(i32,E),COPY_FN(f64,E),badCopy, badCopy, badCopy, cpy##T##Arr_B,COPY_FN(f64,E)}) MAKE_CPY(0, HArr_p p = m_harrUp(ia); Arr* r = (Arr*)p.c, get, ((B*)rp)[i] =, p.a, for (usz i=0; i>6 ; *p++ = 0x80|(c &0x3F); } else if (c<=0xFFFF) { *p++ = 0xE0|c>>12; *p++ = 0x80|(c>>6 &0x3F);*p++ = 0x80|(c &0x3F); } diff --git a/src/vm.c b/src/vm.c index 65bc912d..52417caa 100644 --- a/src/vm.c +++ b/src/vm.c @@ -1289,27 +1289,27 @@ NOINLINE B vm_fmtPoint(B src, B prepend, B path, usz cs, usz ce) { // consumes p SGetU(src) usz srcL = IA(src); usz srcS = cs; - while (srcS>0 && o2cu(GetU(src,srcS-1))!='\n') srcS--; + while (srcS>0 && o2cG(GetU(src,srcS-1))!='\n') srcS--; usz srcE = srcS; - while (srcEsrcE) ce = srcE; i64 ln = 1; - for (usz i = 0; i < srcS; i++) if(o2cu(GetU(src, i))=='\n') ln++; + for (usz i = 0; i < srcS; i++) if(o2cG(GetU(src, i))=='\n') ln++; B s = prepend; if (isArr(path) && (IA(path)>1 || (IA(path)==1 && IGetU(path,0).u!=m_c32('.').u))) AFMT("%R:%l:\n ", path, ln); else AFMT("at "); i64 padEnd = (i64)IA(s); i64 padStart = padEnd; SGetU(s) - while (padStart>0 && o2cu(GetU(s,padStart-1))!='\n') padStart--; + while (padStart>0 && o2cG(GetU(s,padStart-1))!='\n') padStart--; AJOIN(taga(arr_shVec(TI(src,slice)(incG(src),srcS, srcE-srcS)))); cs-= srcS; ce-= srcS; ACHR('\n'); for (i64 i = padStart; i < padEnd; i++) ACHR(' '); - for (u64 i = 0; i < cs; i++) ACHR(o2cu(GetU(src, srcS+i))=='\t'? '\t' : ' '); // ugh tabs + for (u64 i = 0; i < cs; i++) ACHR(o2cG(GetU(src, srcS+i))=='\t'? '\t' : ' '); // ugh tabs for (u64 i = cs; i < ce; i++) ACHR('^'); return s; } @@ -1341,8 +1341,8 @@ native_print: int start = fprintf(stderr, "at "); usz srcL = IA(src); SGetU(src) - usz srcS = cs; while (srcS>0 && o2cu(GetU(src,srcS-1))!='\n') srcS--; - usz srcE = srcS; while (srcE0 && o2cG(GetU(src,srcS-1))!='\n') srcS--; + usz srcE = srcS; while (srcEsrcE) ce = srcE; cs-= srcS; ce-= srcS; fputc('\n', stderr); @@ -1534,7 +1534,7 @@ void profiler_displayResults() { usz pi = 0; i32 curr = 0; for (usz i = 0; i < sia; i++) { - u32 c = o2cu(GetU(src, i)); + u32 c = o2cG(GetU(src, i)); curr+= m[i]; if (c=='\n' || i==sia-1) { Arr* sl = arr_shVec(TI(src,slice)(incG(src), pi, i-pi+(c=='\n'?0:1)));