]> granicus.if.org Git - php/commitdiff
- Fix comparision edgecases involving objects (Tony, Marcus)
authorMarcus Boerger <helly@php.net>
Sun, 9 Jul 2006 16:57:35 +0000 (16:57 +0000)
committerMarcus Boerger <helly@php.net>
Sun, 9 Jul 2006 16:57:35 +0000 (16:57 +0000)
- Use ZVAL_LONG() where appropriate

Zend/zend_operators.c

index 028e99c326cdfd7929d638b8d47a3f309a2cfba6..94172794607355ae816818a4135546526f245321 100644 (file)
@@ -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:0);
+               ZVAL_LONG(result, Z_LVAL_P(op1)>Z_LVAL_P(op2)?1:(Z_LVAL_P(op1)<Z_LVAL_P(op2)?-1:0));
                COMPARE_RETURN_AND_FREE(SUCCESS);
        }
        if ((Z_TYPE_P(op1) == IS_DOUBLE || Z_TYPE_P(op1) == IS_LONG)
                && (Z_TYPE_P(op2) == IS_DOUBLE || Z_TYPE_P(op2) == IS_LONG)) {
                Z_DVAL_P(result) = (Z_TYPE_P(op1) == IS_LONG ? (double) Z_LVAL_P(op1) : Z_DVAL_P(op1)) - (Z_TYPE_P(op2) == IS_LONG ? (double) Z_LVAL_P(op2) : Z_DVAL_P(op2));
-               Z_LVAL_P(result) = ZEND_NORMALIZE_BOOL(Z_DVAL_P(result));
-               Z_TYPE_P(result) = IS_LONG;
+               ZVAL_LONG(result, ZEND_NORMALIZE_BOOL(Z_DVAL_P(result)));
                COMPARE_RETURN_AND_FREE(SUCCESS);
        }
        if (Z_TYPE_P(op1)==IS_ARRAY && Z_TYPE_P(op2)==IS_ARRAY) {
@@ -1606,23 +1606,19 @@ ZEND_API int compare_function(zval *result, zval *op1, zval *op2 TSRMLS_DC)
        }
 
        if (Z_TYPE_P(op1)==IS_ARRAY) {
-               Z_LVAL_P(result) = 1;
-               Z_TYPE_P(result) = IS_LONG;
+               ZVAL_LONG(result, 1);
                COMPARE_RETURN_AND_FREE(SUCCESS);
        }
        if (Z_TYPE_P(op2)==IS_ARRAY) {
-               Z_LVAL_P(result) = -1;
-               Z_TYPE_P(result) = IS_LONG;
+               ZVAL_LONG(result, -1);
                COMPARE_RETURN_AND_FREE(SUCCESS);
        }
        if (Z_TYPE_P(op1)==IS_OBJECT) {
-               Z_LVAL_P(result) = 1;
-               Z_TYPE_P(result) = IS_LONG;
+               ZVAL_LONG(result, 1);
                COMPARE_RETURN_AND_FREE(SUCCESS);
        }
        if (Z_TYPE_P(op2)==IS_OBJECT) {
-               Z_LVAL_P(result) = -1;
-               Z_TYPE_P(result) = IS_LONG;
+               ZVAL_LONG(result, -1);
                COMPARE_RETURN_AND_FREE(SUCCESS);
        }