END_EXTERN_C()
#if ZEND_DVAL_TO_LVAL_CAST_OK
- static zend_always_inline long zend_dval_to_lval(double d)
-# define zend_dval_to_lval(d) ((zend_long) (d))
++static zend_always_inline zend_long zend_dval_to_lval(double d)
+{
+ if (EXPECTED(zend_finite(d)) && EXPECTED(!zend_isnan(d))) {
- return (long)d;
++ return (zend_long)d;
+ } else {
+ return 0;
+ }
+}
- #elif SIZEOF_LONG == 4
- static zend_always_inline long zend_dval_to_lval(double d)
+ #elif SIZEOF_ZEND_LONG == 4
+ static zend_always_inline zend_long zend_dval_to_lval(double d)
{
- if (d > LONG_MAX || d < LONG_MIN) {
+ if (d > ZEND_LONG_MAX || d < ZEND_LONG_MIN) {
double two_pow_32 = pow(2., 32.),
dmod;
* to simulate rounding towards 0 of the negative number */
dmod = ceil(dmod) + two_pow_32;
}
- return (long)(unsigned long)dmod;
+ return (zend_long)(zend_ulong)dmod;
+ } else if (UNEXPECTED(!zend_finite(d)) || UNEXPECTED(zend_isnan(d))) {
+ return 0;
}
- return (long)d;
+ return (zend_long)d;
}
#else
- static zend_always_inline long zend_dval_to_lval(double d)
+ static zend_always_inline zend_long zend_dval_to_lval(double d)
{
- /* >= as (double)LONG_MAX is outside signed range */
- if (d >= LONG_MAX || d < LONG_MIN) {
+ /* >= as (double)ZEND_LONG_MAX is outside signed range */
+ if (d >= ZEND_LONG_MAX || d < ZEND_LONG_MIN) {
double two_pow_64 = pow(2., 64.),
dmod;
* fractional part, hence dmod does not have one either */
dmod += two_pow_64;
}
- return (long)(unsigned long)dmod;
+ return (zend_long)(zend_ulong)dmod;
+ } else if (UNEXPECTED(!zend_finite(d)) || UNEXPECTED(zend_isnan(d))) {
+ return 0;
}
- return (long)d;
+ return (zend_long)d;
}
#endif
/* }}} */