From: Andrea Faulds Date: Tue, 16 Sep 2014 12:45:06 +0000 (+0100) Subject: Merge branch 'master' into integer_semantics X-Git-Tag: PRE_NATIVE_TLS_MERGE~158^2~85 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=db72160e5ac2b267b9ffa23ad84e62e609382a44;p=php Merge branch 'master' into integer_semantics Conflicts: Zend/zend_operators.h --- db72160e5ac2b267b9ffa23ad84e62e609382a44 diff --cc Zend/zend_operators.h index f168af7ce8,a50e65d7c2..256429dddb --- a/Zend/zend_operators.h +++ b/Zend/zend_operators.h @@@ -72,18 -72,11 +72,18 @@@ ZEND_API zend_bool instanceof_function( 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; @@@ -93,17 -86,15 +93,17 @@@ * 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; @@@ -113,11 -104,9 +113,11 @@@ * 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 /* }}} */