From 77cb03033d99ef4870f14df9a8d83b0c396516a7 Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 21 Sep 2021 17:02:38 +0300 Subject: [PATCH] throw overflow error in isum --- src/core.h | 18 ------------------ src/core/numarr.h | 22 +++++++++++++++++++++- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/core.h b/src/core.h index 24fab9d3..fa6988ba 100644 --- a/src/core.h +++ b/src/core.h @@ -78,21 +78,3 @@ typedef struct BMd2 { BBBBB2B uc1; BBBBBB2B ucw; } BMd2; - -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); - if (xe==el_i8 ) { i8* p = i8any_ptr (x); for (usz i = 0; i < xia; i++) r+= p[i]; } - else if (xe==el_i16) { i16* p = i16any_ptr(x); for (usz i = 0; i < xia; i++) r+= p[i]; } - else if (xe==el_i32) { i32* p = i32any_ptr(x); for (usz i = 0; i < xia; i++) r+= p[i]; } - else if (xe==el_f64) { - f64* p = f64any_ptr(x); - for (usz i = 0; i < xia; i++) { if(p[i]!=(i64)p[i]) thrM("Expected integer"); r+= p[i]; } - } else { - SGetU(x) - for (usz i = 0; i < xia; i++) r+= o2i64(GetU(x,i)); - } - return r; -} diff --git a/src/core/numarr.h b/src/core/numarr.h index 4e2e468d..ee30da59 100644 --- a/src/core/numarr.h +++ b/src/core/numarr.h @@ -16,4 +16,24 @@ static F64Arr* toF64Arr(B x) { return v(x)->type==t_f64arr? c(F64Arr,x) : cpyF64 static B toI8Any (B x) { u8 t=v(x)->type; return t==t_i8arr || t==t_i8slice ? x : taga(cpyI8Arr (x)); } static B toI16Any(B x) { u8 t=v(x)->type; return t==t_i16arr || t==t_i16slice? x : taga(cpyI16Arr(x)); } static B toI32Any(B x) { u8 t=v(x)->type; return t==t_i32arr || t==t_i32slice? x : taga(cpyI32Arr(x)); } -static B toF64Any(B x) { u8 t=v(x)->type; return t==t_f64arr || t==t_f64slice? x : taga(cpyF64Arr(x)); } \ No newline at end of file +static B toF64Any(B x) { u8 t=v(x)->type; return t==t_f64arr || t==t_f64slice? x : taga(cpyF64Arr(x)); } + + +static i64 isum(B x) { // doesn't consume; may error + assert(isArr(x)); + i64 r = 0; + usz xia = a(x)->ia; + u8 xe = TI(x,elType); + if (xe==el_i8 ) { i8* p = i8any_ptr (x); for (usz i = 0; i < xia; i++) r+= p[i]; } + else if (xe==el_i16) { i16* p = i16any_ptr(x); for (usz i = 0; i < xia; i++) if (addOn(r,p[i])) goto err; } + else if (xe==el_i32) { i32* p = i32any_ptr(x); for (usz i = 0; i < xia; i++) if (addOn(r,p[i])) goto err; } + else if (xe==el_f64) { + f64* p = f64any_ptr(x); + for (usz i = 0; i < xia; i++) { if(p[i]!=(i64)p[i] || addOn(r,(i64)p[i])) goto err; } + } else { + SGetU(x) + for (usz i = 0; i < xia; i++) r+= o2i64(GetU(x,i)); + } + return r; + err: thrM("Expected integer"); +}