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

Reply via email to