summaryrefslogtreecommitdiff
path: root/Zend
diff options
context:
space:
mode:
authorStanislav Malyshev <stas@php.net>2001-09-05 09:29:28 +0000
committerStanislav Malyshev <stas@php.net>2001-09-05 09:29:28 +0000
commitd082fb373d4a2b1cdd336cab5bf4ca574803cdfb (patch)
tree5a13bdd374c00024bb80ae7715fa91d216df80d4 /Zend
parentb9edf7c17cb30fd5080bc10219a4e88e494905a0 (diff)
downloadphp-git-d082fb373d4a2b1cdd336cab5bf4ca574803cdfb.tar.gz
MFZE1
Diffstat (limited to 'Zend')
-rw-r--r--Zend/zend_operators.c24
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;