Browse Source
Fix compile-time optimization of NAN comparisons
pull/2648/head
Sara Golemon
9 years ago
No known key found for this signature in database
GPG Key ID: DBDB397470D12172
2 changed files with
49 additions and
0 deletions
-
Zend/zend_operators.c
-
tests/lang/operators/nan-comparison-false.phpt
|
|
|
@ -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; |
|
|
|
} |
|
|
|
|
|
|
|
@ -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) |