diff options
author | Stanislav Malyshev <stas@php.net> | 2001-09-05 09:29:28 +0000 |
---|---|---|
committer | Stanislav Malyshev <stas@php.net> | 2001-09-05 09:29:28 +0000 |
commit | d082fb373d4a2b1cdd336cab5bf4ca574803cdfb (patch) | |
tree | 5a13bdd374c00024bb80ae7715fa91d216df80d4 /Zend | |
parent | b9edf7c17cb30fd5080bc10219a4e88e494905a0 (diff) | |
download | php-git-d082fb373d4a2b1cdd336cab5bf4ca574803cdfb.tar.gz |
MFZE1
Diffstat (limited to 'Zend')
-rw-r--r-- | Zend/zend_operators.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c index 8056cfe559..6af80a36ee 100644 --- a/Zend/zend_operators.c +++ b/Zend/zend_operators.c @@ -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; |