From: Marcus Boerger Date: Sun, 9 Jul 2006 16:57:35 +0000 (+0000) Subject: - Fix comparision edgecases involving objects (Tony, Marcus) X-Git-Tag: RELEASE_1_0_0RC1~2543 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93a1d862f871c1443725edcb859c43d037da3cf3;p=php - Fix comparision edgecases involving objects (Tony, Marcus) - Use ZVAL_LONG() where appropriate --- diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 028e99c326..9417279460 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -1470,8 +1470,7 @@ ZEND_API int numeric_compare_function(zval *result, zval *op1, zval *op2 TSRMLS_ convert_to_double(&op1_copy); convert_to_double(&op2_copy); - Z_LVAL_P(result) = ZEND_NORMALIZE_BOOL(Z_DVAL(op1_copy)-Z_DVAL(op2_copy)); - Z_TYPE_P(result) = IS_LONG; + ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_DVAL(op1_copy)-Z_DVAL(op2_copy))); return SUCCESS; } @@ -1502,14 +1501,17 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) int op2_obj = Z_TYPE_P(op2) == IS_OBJECT; if (op1_obj) { - if (Z_OBJ_HT_P(op1)->get) { + if (Z_TYPE_P(op2) == IS_NULL) { + ZVAL_LONG(result, 1); + return SUCCESS; + } else if (Z_OBJ_HT_P(op1)->get) { op1 = op1_free = Z_OBJ_HT_P(op1)->get(op1 TSRMLS_CC); } else if (!op2_obj && Z_OBJ_HT_P(op1)->cast_object) { ALLOC_INIT_ZVAL(op1_free); if (Z_OBJ_HT_P(op1)->cast_object(op1, op1_free, Z_TYPE_P(op2) TSRMLS_CC) == FAILURE) { op2_free = NULL; - ZVAL_BOOL(result, 0); - COMPARE_RETURN_AND_FREE(FAILURE); + ZVAL_LONG(result, 1); + COMPARE_RETURN_AND_FREE(SUCCESS); } op1 = op1_free; } else { @@ -1519,13 +1521,17 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) op1_free = NULL; } if (op2_obj) { - if (Z_OBJ_HT_P(op2)->get) { + if (Z_TYPE_P(op1) == IS_NULL) { + op2_free = NULL; + ZVAL_LONG(result, -1); + COMPARE_RETURN_AND_FREE(SUCCESS); + } else if (Z_OBJ_HT_P(op2)->get) { op2 = op2_free = Z_OBJ_HT_P(op2)->get(op2 TSRMLS_CC); } else if (!op1_obj && Z_OBJ_HT_P(op2)->cast_object) { ALLOC_INIT_ZVAL(op2_free); if (Z_OBJ_HT_P(op2)->cast_object(op2, op2_free, Z_TYPE_P(op1) TSRMLS_CC) == FAILURE) { - ZVAL_BOOL(result, 0); - COMPARE_RETURN_AND_FREE(FAILURE); + ZVAL_LONG(result, -1); + COMPARE_RETURN_AND_FREE(SUCCESS); } op2 = op2_free; } else { @@ -1538,12 +1544,10 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) if ((Z_TYPE_P(op1) == IS_NULL && Z_TYPE_P(op2) == IS_STRING) || (Z_TYPE_P(op2) == IS_NULL && Z_TYPE_P(op1) == IS_STRING)) { if (Z_TYPE_P(op1) == IS_NULL) { - Z_TYPE_P(result) = IS_LONG; - Z_LVAL_P(result) = zend_binary_strcmp("", 0, Z_STRVAL_P(op2), Z_STRLEN_P(op2)); + ZVAL_LONG(result, zend_binary_strcmp("", 0, Z_STRVAL_P(op2), Z_STRLEN_P(op2))); COMPARE_RETURN_AND_FREE(SUCCESS); } else { - Z_TYPE_P(result) = IS_LONG; - Z_LVAL_P(result) = zend_binary_strcmp(Z_STRVAL_P(op1), Z_STRLEN_P(op1), "", 0); + ZVAL_LONG(result, zend_binary_strcmp(Z_STRVAL_P(op1), Z_STRLEN_P(op1), "", 0)); COMPARE_RETURN_AND_FREE(SUCCESS); } } @@ -1560,8 +1564,7 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) * Will we ever get here? This might be dead code. */ Z_LVAL_P(result) = zend_binary_zval_strcmp(op1, op2); - Z_LVAL_P(result) = ZEND_NORMALIZE_BOOL(Z_LVAL_P(result)); - Z_TYPE_P(result) = IS_LONG; + ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_LVAL_P(result))); } COMPARE_RETURN_AND_FREE(SUCCESS); } @@ -1570,8 +1573,7 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) || Z_TYPE_P(op1) == IS_NULL || Z_TYPE_P(op2) == IS_NULL) { zendi_convert_to_boolean(op1, op1_copy, result); zendi_convert_to_boolean(op2, op2_copy, result); - Z_TYPE_P(result) = IS_LONG; - Z_LVAL_P(result) = ZEND_NORMALIZE_BOOL(Z_LVAL_P(op1) - Z_LVAL_P(op2)); + ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_LVAL_P(op1) - Z_LVAL_P(op2))); COMPARE_RETURN_AND_FREE(SUCCESS); } @@ -1589,15 +1591,13 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC) zendi_convert_scalar_to_number(op2, op2_copy, result); if (Z_TYPE_P(op1) == IS_LONG && Z_TYPE_P(op2) == IS_LONG) { - Z_TYPE_P(result) = IS_LONG; - Z_LVAL_P(result) = Z_LVAL_P(op1)>Z_LVAL_P(op2)?1:(Z_LVAL_P(op1)Z_LVAL_P(op2)?1:(Z_LVAL_P(op1)