Changeset: e0811ce98831 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=e0811ce98831 Modified Files: configure.ag monetdb5/modules/kernel/batmmath.c monetdb5/modules/kernel/mmath.c Branch: Oct2014 Log Message:
Check for error conditions when calling functions in the math library.
diffs (truncated from 392 to 300 lines):
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -2635,6 +2635,7 @@ AC_CHECK_HEADERS([ \
dlfcn.h \
execinfo.h \
fcntl.h \
+ fenv.h \
getopt.h \
iconv.h \
ieeefp.h \
diff --git a/monetdb5/modules/kernel/batmmath.c
b/monetdb5/modules/kernel/batmmath.c
--- a/monetdb5/modules/kernel/batmmath.c
+++ b/monetdb5/modules/kernel/batmmath.c
@@ -29,96 +29,124 @@
*/
#include "monetdb_config.h"
#include "batmmath.h"
+#ifdef HAVE_FENV_H
+#include <fenv.h>
+#else
+#define feclearexcept(x)
+#define fetestexcept(x) 0
+#endif
-#define voidresultBAT(X1,X2)\
- bn = BATnew(TYPE_void, X1, BATcount(b), TRANSIENT);\
- if (bn == NULL) {\
- BBPreleaseref(b->batCacheid);\
- throw(MAL, X2, MAL_MALLOC_FAIL);\
- }\
- BATseqbase(bn, b->hseqbase);\
- bn->hsorted = b->hsorted;\
- bn->hrevsorted = b->hrevsorted;\
- bn->tsorted = b->tsorted;\
- bn->trevsorted = b->trevsorted;\
- bn->H->nonil = 1;\
- bn->T->nonil = b->T->nonil;
+#define voidresultBAT(X1,X2)
\
+ do {
\
+ bn = BATnew(TYPE_void, X1, BATcount(b), TRANSIENT); \
+ if (bn == NULL) {
\
+ BBPreleaseref(b->batCacheid);
\
+ throw(MAL, X2, MAL_MALLOC_FAIL);
\
+ }
\
+ BATseqbase(bn, b->hseqbase);
\
+ bn->hsorted = b->hsorted;
\
+ bn->hrevsorted = b->hrevsorted;
\
+ bn->tsorted = b->tsorted;
\
+ bn->trevsorted = b->trevsorted;
\
+ bn->H->nonil = 1;
\
+ bn->T->nonil = b->T->nonil;
\
+ } while (0)
-#define scienceFcnImpl(X1,X2,X3)
\
-str CMDscience_bat_##X2##_##X1(bat *ret, const bat *bid) \
-{
\
- BAT *b,*bn;
\
- X2 *o, *p, *q;
\
- if ((b = BATdescriptor(*bid)) == NULL) {
\
- throw(MAL, #X2, RUNTIME_OBJECT_MISSING);
\
- }
\
- voidresultBAT(TYPE_##X2,"batcalc." #X1);
\
- o = (X2*) Tloc(bn, BUNfirst(bn));
\
- p = (X2*) Tloc(b, BUNfirst(b));
\
- q = (X2*) Tloc(b, BUNlast(b));
\
-
\
- if (b->T->nonil){
\
- for(;p<q; o++, p++)
\
- *o = X1##X3(*p);
\
- } else
\
- for(;p<q; o++, p++){
\
- *o = *p == X2##_nil? X2##_nil: X1##X3(*p);
\
- }
\
- BATsetcount(bn, BATcount(b));
\
- bn->tsorted = 0;
\
- bn->trevsorted = 0;
\
- BATkey(BATmirror(bn),0);
\
- if (!(bn->batDirty&2)) bn = BATsetaccess(bn, BAT_READ); \
- if (b->htype != bn->htype) {
\
- BAT *r = VIEWcreate(b,bn);
\
-
\
- BBPreleaseref(bn->batCacheid);
\
- bn = r;
\
- }
\
- BBPkeepref(*ret = bn->batCacheid);
\
- BBPreleaseref(b->batCacheid);
\
- return MAL_SUCCEED;
\
+#define scienceFcnImpl(FUNC,TYPE,SUFF)
\
+str CMDscience_bat_##TYPE##_##FUNC(bat *ret, const bat *bid) \
+{
\
+ BAT *b, *bn;
\
+ TYPE *o, *p, *q;
\
+ if ((b = BATdescriptor(*bid)) == NULL) {
\
+ throw(MAL, #TYPE, RUNTIME_OBJECT_MISSING);
\
+ }
\
+ voidresultBAT(TYPE_##TYPE, "batcalc." #FUNC);
\
+ o = (TYPE *) Tloc(bn, BUNfirst(bn));
\
+ p = (TYPE *) Tloc(b, BUNfirst(b));
\
+ q = (TYPE *) Tloc(b, BUNlast(b));
\
+
\
+ errno = 0;
\
+ feclearexcept(FE_ALL_EXCEPT);
\
+ if (b->T->nonil) {
\
+ for (; p < q; o++, p++)
\
+ *o = FUNC##SUFF(*p);
\
+ } else {
\
+ for (; p < q; o++, p++)
\
+ *o = *p == TYPE##_nil ? TYPE##_nil : FUNC##SUFF(*p);
\
+ }
\
+ if (errno != 0 ||
\
+ fetestexcept(FE_INVALID | FE_DIVBYZERO |
\
+ FE_OVERFLOW | FE_UNDERFLOW) != 0) {
\
+ BBPreleaseref(bn->batCacheid);
\
+ throw(MAL, "batmmath." #FUNC, "Math exception");
\
+ }
\
+ BATsetcount(bn, BATcount(b));
\
+ bn->tsorted = 0;
\
+ bn->trevsorted = 0;
\
+ bn->T->nil = b->T->nil;
\
+ bn->T->nonil = b->T->nonil;
\
+ BATkey(BATmirror(bn), 0);
\
+ if (!(bn->batDirty&2))
\
+ bn = BATsetaccess(bn, BAT_READ);
\
+ if (b->htype != bn->htype) {
\
+ BAT *r = VIEWcreate(b,bn);
\
+
\
+ BBPreleaseref(bn->batCacheid);
\
+ bn = r;
\
+ }
\
+ BBPkeepref(*ret = bn->batCacheid);
\
+ BBPreleaseref(b->batCacheid);
\
+ return MAL_SUCCEED;
\
}
-#define scienceBinaryImpl(X1,X2,X3)
\
-str CMDscience_bat_cst_##X1##_##X2(bat *ret, const bat *bid, const X2 *d)
\
-{
\
- BAT *b,*bn;
\
- X2 *o, *p, *q;
\
-
\
- if ((b = BATdescriptor(*bid)) == NULL) {
\
- throw(MAL, #X2, RUNTIME_OBJECT_MISSING);
\
- }
\
- voidresultBAT(TYPE_##X2,"batcalc." #X1)
\
- o = (X2*) Tloc(bn, BUNfirst(bn));
\
- p = (X2*) Tloc(b, BUNfirst(b));
\
- q = (X2*) Tloc(b, BUNlast(b));
\
-
\
- if (b->T->nonil){
\
- for(;p<q; o++, p++)
\
- *o = X1##X3(*p,*d);
\
- } else
\
- for(;p<q; o++, p++){
\
- *o = *p == X2##_nil? X2##_nil: X1##X3(*p,*d);
\
- }
\
-
\
- BATsetcount(bn, BATcount(b));
\
- bn->tsorted = 0;
\
- bn->trevsorted = 0;
\
- BATkey(BATmirror(bn),0);
\
-
\
- if (!(bn->batDirty&2)) bn = BATsetaccess(bn, BAT_READ); \
-
\
- if (b->htype != bn->htype) {
\
- BAT *r = VIEWcreate(b,bn);
\
-
\
- BBPreleaseref(bn->batCacheid);
\
- bn = r;
\
- }
\
- BBPkeepref(*ret = bn->batCacheid);
\
- BBPreleaseref(b->batCacheid);
\
- return MAL_SUCCEED;
\
+#define scienceBinaryImpl(FUNC,TYPE,SUFF)
\
+str CMDscience_bat_cst_##FUNC##_##TYPE(bat *ret, const bat *bid,
\
+
const TYPE *d) \
+{
\
+ BAT *b, *bn;
\
+ TYPE *o, *p, *q;
\
+
\
+ if ((b = BATdescriptor(*bid)) == NULL) {
\
+ throw(MAL, #TYPE, RUNTIME_OBJECT_MISSING);
\
+ }
\
+ voidresultBAT(TYPE_##TYPE, "batcalc." #FUNC);
\
+ o = (TYPE *) Tloc(bn, BUNfirst(bn));
\
+ p = (TYPE *) Tloc(b, BUNfirst(b));
\
+ q = (TYPE *) Tloc(b, BUNlast(b));
\
+
\
+ errno = 0;
\
+ feclearexcept(FE_ALL_EXCEPT);
\
+ if (b->T->nonil) {
\
+ for (; p < q; o++, p++)
\
+ *o = FUNC##SUFF(*p, *d);
\
+ } else {
\
+ for (; p < q; o++, p++)
\
+ *o = *p == TYPE##_nil ? TYPE##_nil : FUNC##SUFF(*p,
*d); \
+ }
\
+ if (errno != 0 ||
\
+ fetestexcept(FE_INVALID | FE_DIVBYZERO |
\
+ FE_OVERFLOW | FE_UNDERFLOW) != 0) {
\
+ BBPreleaseref(bn->batCacheid);
\
+ throw(MAL, "batmmath." #FUNC, "Math exception");
\
+ }
\
+ BATsetcount(bn, BATcount(b));
\
+ bn->tsorted = 0;
\
+ bn->trevsorted = 0;
\
+ bn->T->nil = b->T->nil;
\
+ bn->T->nonil = b->T->nonil;
\
+ BATkey(BATmirror(bn),0);
\
+ if (!(bn->batDirty&2))
\
+ bn = BATsetaccess(bn, BAT_READ);
\
+ if (b->htype != bn->htype) {
\
+ BAT *r = VIEWcreate(b,bn);
\
+
\
+ BBPreleaseref(bn->batCacheid);
\
+ bn = r;
\
+ }
\
+ BBPkeepref(*ret = bn->batCacheid);
\
+ BBPreleaseref(b->batCacheid);
\
+ return MAL_SUCCEED;
\
}
#define scienceImpl(Operator) \
diff --git a/monetdb5/modules/kernel/mmath.c b/monetdb5/modules/kernel/mmath.c
--- a/monetdb5/modules/kernel/mmath.c
+++ b/monetdb5/modules/kernel/mmath.c
@@ -30,6 +30,12 @@
*/
#include "monetdb_config.h"
#include "mmath.h"
+#ifdef HAVE_FENV_H
+#include <fenv.h>
+#else
+#define feclearexcept(x)
+#define fetestexcept(x) 0
+#endif
#ifdef _MSC_VER
# include <float.h>
@@ -72,32 +78,12 @@ MNisinf(double x)
# endif
#endif /* HAVE_FPCLASSIFY */
-#define acos_unary(x, z) *z = acos(*x)
-#define asin_unary(x, z) *z = asin(*x)
-#define atan_unary(x, z) *z = atan(*x)
#define atan2_binary(x, y, z) *z = atan2(*x,*y)
-#define cos_unary(x, z) *z = cos(*x)
-#define sin_unary(x, z) *z = sin(*x)
-#define tan_unary(x, z) *z = tan(*x)
-#define cot_unary(x, z) *z = (1/tan(*x))
+#define pow_binary(x, y, z) *z = pow(*x,*y)
-#define cosh_unary(x, z) *z = cosh(*x)
-#define sinh_unary(x, z) *z = sinh(*x)
-#define tanh_unary(x, z) *z = tanh(*x)
-
-#define radians_unary(x, z) *z = *x * 3.14159265358979323846 /180.0
-#define degrees_unary(x, z) *z = *x * 180.0/3.14159265358979323846
-
-#define exp_unary(x, z) *z = exp(*x)
-#define log_unary(x, z) *z = log(*x)
-#define log10_unary(x, z) *z = log10(*x)
-
-#define pow_binary(x, y, z) *z = pow(*x,*y)
-#define sqrt_unary(x, z) *z = sqrt(*x)
-
-#define ceil_unary(x, z) *z = ((-1.0<*x)&&(*x<0.0))?0.0:ceil(*x)
-#define fabs_unary(x, z) *z = fabs(*x)
-#define floor_unary(x, z) *z = floor(*x)
+#define cot(x) (1 / tan(x))
+#define radians(x) ((x) * 3.14159265358979323846 / 180.0)
+#define degrees(x) ((x) * 180.0 / 3.14159265358979323846)
static str
math_unary_ISNAN(bit *res, const dbl *a)
@@ -145,55 +131,51 @@ math_unary_FINITE(bit *res, const dbl *a
return MAL_SUCCEED;
}
-#define unopbaseM5(X1,X2,X3) \
-str
\
-MATHunary##X1##X3(X3 *res , const X3 *a) \
-{
\
- dbl tmp1,tmp2;
\
- str msg= MAL_SUCCEED; \
- if (*a == X3##_nil) { \
- *res =X3##_nil;
\
- } else {
\
- tmp1= *a;
\
- X2##_unary( &tmp1, &tmp2); \
- *res = (X3) tmp2;
\
- }
\
- return msg;
\
+#define unopM5(NAME, FUNC)
\
+str
\
+MATHunary##NAME##dbl(dbl *res , const dbl *a) \
+{
\
+ double tmp1,tmp2;
\
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
