From 97c1b1d31d6e39e2b5c00fa59633373ace21bd26 Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 21 Sep 2021 16:56:20 +0300 Subject: [PATCH] overflow builtin cleanup --- src/builtins/md1.c | 42 +++++++++++++++++++++--------------------- src/builtins/sfns.c | 6 +++--- src/core/stuff.h | 10 +++++----- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/builtins/md1.c b/src/builtins/md1.c index d78b8e3a..5a539c5f 100644 --- a/src/builtins/md1.c +++ b/src/builtins/md1.c @@ -48,7 +48,7 @@ B tbl_c2(Md1D* d, B w, B x) { B f = d->f; if (isAtm(x)) x = m_atomUnit(x); ur wr = rnk(w); usz wia = a(w)->ia; ur xr = rnk(x); usz xia = a(x)->ia; - ur rr = wr+xr; usz ria = uszMulT(wia, xia); + ur rr = wr+xr; usz ria = uszMul(wia, xia); if (rrf; if (xr==1 && xe<=el_f64 && isFun(f) && v(f)->flags) { u8 rtid = v(f)->flags-1; if (rtid==0) { // + - if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=0; for (usz i=0; ic)c=xp[i]; rp[i]=c; } dec(x); return r; } @@ -144,9 +144,9 @@ B scan_c2(Md1D* d, B w, B x) { B f = d->f; u8 rtid = v(f)->flags-1; i32 wv = o2iu(w); if (rtid==0) { // + - if (xe==el_i8 ) { i8* xp=i8any_ptr (x); i32* rp; B r=m_i32arrv(&rp, ia); i32 c=wv; for (usz i=0; ic)c=xp[i]; rp[i]=c; } dec(x); return r; } @@ -199,16 +199,16 @@ B fold_c1(Md1D* d, B x) { B f = d->f; if (isFun(f) && v(f)->flags && xe<=el_f64) { u8 rtid = v(f)->flags-1; if (rtid==0) { // + - if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=0; for (usz i=0; if; i32 wi = o2iu(w); u8 rtid = v(f)->flags-1; if (rtid==0) { // + - if (xe==el_i8 ) { i8* xp = i8any_ptr (x); i64 c=wi; for (usz i=0; ia[i] = v; - bad|= uszMul(&nia, v); + bad|= mulOn(nia, v); good|= v==0; } else { if (isArr(c) || !isVal(c)) thrM("ℊ: š•Ø must consist of natural numbers or ∘ ⌊ ⌽ ↑"); @@ -136,7 +136,7 @@ B shape_c2(B t, B w, B x) { fill = true; } else UD; if (sh) sh->a[unkPos] = item; - nia = uszMulT(nia, item); + nia = uszMul(nia, item); if (fill) { if (!isArr(x)) x = m_atomUnit(x); Arr* a = take_impl(nia, x); diff --git a/src/core/stuff.h b/src/core/stuff.h index 5effb432..d4718749 100644 --- a/src/core/stuff.h +++ b/src/core/stuff.h @@ -96,11 +96,11 @@ B m_vec2(B a, B b); // random stuff -static bool uszMul(usz* c, usz n) { - return __builtin_mul_overflow(*c, n, c); -} -static usz uszMulT(usz a, usz b) { - if (uszMul(&a, b)) thrM("Size too large"); +#define addOn(V,X) ({ AUTO v_ = &(V); __builtin_add_overflow(*v_, X, v_); }) +#define mulOn(V,X) ({ AUTO v_ = &(V); __builtin_mul_overflow(*v_, X, v_); }) + +static usz uszMul(usz a, usz b) { + if (mulOn(a, b)) thrM("Size too large"); return a; }