throw overflow error in isum
This commit is contained in:
parent
97c1b1d31d
commit
77cb03033d
18
src/core.h
18
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;
|
||||
}
|
||||
|
||||
@ -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)); }
|
||||
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");
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user