>> From:             [EMAIL PROTECTED]
>> Operating system: FreeBSD 4.3
>> PHP version:      4.0.6
>> PHP Bug Type:     Scripting Engine problem
>> Bug description:  ++, -- operators does not conert the type of variable.

The attached patch should cure it. jeroen, are you on it or should I
commit this patch?
-- 
Stanislav Malyshev, Zend Products Engineer
[EMAIL PROTECTED]  http://www.zend.com/ +972-3-6139665 ext.115

Index: zend_operators.c
===================================================================
RCS file: /repository/Zend/zend_operators.c,v
retrieving revision 1.114
diff -u -b -r1.114 zend_operators.c
--- zend_operators.c    2001/08/26 10:30:19     1.114
+++ zend_operators.c    2001/09/04 16:12:03
@@ -1443,7 +1443,13 @@
 {
        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;
@@ -1459,8 +1465,14 @@
 
                                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:
@@ -1492,21 +1504,31 @@
        
        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;
-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to