]> granicus.if.org Git - php/commitdiff
MFZE1
authorStanislav Malyshev <stas@php.net>
Wed, 5 Sep 2001 09:29:28 +0000 (09:29 +0000)
committerStanislav Malyshev <stas@php.net>
Wed, 5 Sep 2001 09:29:28 +0000 (09:29 +0000)
Zend/zend_operators.c

index 8056cfe55987534b4e891c27db4284843d519838..6af80a36eed41623a86481322f038f9f143fede0 100644 (file)
@@ -1454,7 +1454,13 @@ ZEND_API int increment_function(zval *op1)
 {
        switch (op1->type) {
                case IS_LONG:
+                       if(op1->value.lval == LONG_MAX) {
+                               /* switch to double */
+                               double d = (double)op1->value.lval;
+                               ZVAL_DOUBLE(op1, d+1);
+                       } else {
                        op1->value.lval++;
+                       } 
                        break;
                case IS_DOUBLE:
                        op1->value.dval = op1->value.dval + 1;
@@ -1470,8 +1476,14 @@ ZEND_API int increment_function(zval *op1)
 
                                switch (is_numeric_string(strval, op1->value.str.len, &lval, &dval, 0)) {
                                        case IS_LONG:
+                                               if(lval == LONG_MAX) {
+                                                       /* switch to double */
+                                                       double d = (double)lval;
+                                                       ZVAL_DOUBLE(op1, d+1);
+                                               } else {
                                                op1->value.lval = lval+1;
                                                op1->type = IS_LONG;
+                                               }
                                                efree(strval);
                                                break;
                                        case IS_DOUBLE:
@@ -1503,21 +1515,31 @@ ZEND_API int decrement_function(zval *op1)
        
        switch (op1->type) {
                case IS_LONG:
+                       if(op1->value.lval == LONG_MIN) {
+                               double d = (double)op1->value.lval;
+                               ZVAL_DOUBLE(op1, d-1);
+                       } else {
                        op1->value.lval--;
+                       }
                        break;
                case IS_DOUBLE:
                        op1->value.dval = op1->value.dval - 1;
                        break;
                case IS_STRING:         /* Like perl we only support string increment */
-                       if (op1->value.str.len==0) { /* consider as 0 */
+                       if (op1->value.str.len == 0) { /* consider as 0 */
                                STR_FREE(op1->value.str.val);
                                op1->value.lval = -1;
                                op1->type = IS_LONG;
                                break;
                        } else if (is_numeric_string(op1->value.str.val, op1->value.str.len, &lval, NULL, 0)==IS_LONG) { /* long */
                                STR_FREE(op1->value.str.val);
+                               if(lval == LONG_MIN) {
+                                       double d = (double)lval;
+                                       ZVAL_DOUBLE(op1, d-1);
+                               } else {
                                op1->value.lval = lval-1;
                                op1->type = IS_LONG;
+                               }
                                break;
                        }
                        break;