{
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;
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:
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;