com php-src: Fix compile-time optimization of NAN comparisons: Zend/zend_operators.c tests/lang/operators/nan-comparison -false.phpt

From: Date: Sun, 23 Jul 2017 01:22:51 +0000
Subject: com php-src: Fix compile-time optimization of NAN comparisons: Zend/zend_operators.c tests/lang/operators/nan-comparison -false.phpt
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-98728@lists.php.net to get a copy of this message
Commit: c562d44321ea69612fbe3f7460055e9ed4340baa Author: Sara Golemon <pollita@php.net> Sat, 22 Jul 2017 20:58:54 -0400 Parents: ad12da49085c05e11a65eafae1384eae43804d1d Branches: PHP-7.0 PHP-7.1 PHP-7.2 master Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=c562d44321ea69612fbe3f7460055e9ed4340baa Log: Fix compile-time optimization of NAN comparisons Changed paths: M Zend/zend_operators.c A tests/lang/operators/nan-comparison-false.phpt Diff: diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 3a8929b..0b4d82b 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -2151,6 +2151,16 @@ ZEND_API int ZEND_FASTCALL is_not_equal_function(zval *result, zval *op1, zval * ZEND_API int ZEND_FASTCALL is_smaller_function(zval *result, zval *op1, zval *op2) /* {{{ */ { + if (UNEXPECTED((Z_TYPE_P(op1) == IS_DOUBLE) && isnan(Z_DVAL_P(op1)))) { + ZVAL_FALSE(result); + return SUCCESS; + } + + if (UNEXPECTED((Z_TYPE_P(op2) == IS_DOUBLE) && isnan(Z_DVAL_P(op2)))) { + ZVAL_FALSE(result); + return SUCCESS; + } + if (compare_function(result, op1, op2) == FAILURE) { return FAILURE; } @@ -2161,6 +2171,16 @@ ZEND_API int ZEND_FASTCALL is_smaller_function(zval *result, zval *op1, zval *op ZEND_API int ZEND_FASTCALL is_smaller_or_equal_function(zval *result, zval *op1, zval *op2) /* {{{ */ { + if (UNEXPECTED((Z_TYPE_P(op1) == IS_DOUBLE) && isnan(Z_DVAL_P(op1)))) { + ZVAL_FALSE(result); + return SUCCESS; + } + + if (UNEXPECTED((Z_TYPE_P(op2) == IS_DOUBLE) && isnan(Z_DVAL_P(op2)))) { + ZVAL_FALSE(result); + return SUCCESS; + } + if (compare_function(result, op1, op2) == FAILURE) { return FAILURE; } diff --git a/tests/lang/operators/nan-comparison-false.phpt b/tests/lang/operators/nan-comparison-false.phpt new file mode 100644 index 0000000..f7679b8 --- /dev/null +++ b/tests/lang/operators/nan-comparison-false.phpt @@ -0,0 +1,29 @@ +--TEST-- +Comparisons with NAN should yield false, even at compile-time +--FILE-- +<?php + +echo "** CONST\n"; +var_dump(0 < NAN); +var_dump(0 <= NAN); +var_dump(0 > NAN); +var_dump(0 >= NAN); + +echo "** VAR\n"; +$nan = NAN; +var_dump(0 < $nan); +var_dump(0 <= $nan); +var_dump(0 > $nan); +var_dump(0 >= $nan); + +--EXPECT-- +** CONST +bool(false) +bool(false) +bool(false) +bool(false) +** VAR +bool(false) +bool(false) +bool(false) +bool(false)

« previous php.cvs (#98728) next »