dmitry          Fri Dec 19 06:22:14 2003 EDT

  Added files:                 
    /php-src/tests/classes      array_access_006.phpt 

  Modified files:              
    /ZendEngine2        zend_execute.c 
  Log:
  Assign_op operators (+=) were fixed for elements of overloaded objects
  
  
Index: ZendEngine2/zend_execute.c
diff -u ZendEngine2/zend_execute.c:1.571 ZendEngine2/zend_execute.c:1.572
--- ZendEngine2/zend_execute.c:1.571    Thu Dec 18 18:30:22 2003
+++ ZendEngine2/zend_execute.c  Fri Dec 19 06:22:12 2003
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_execute.c,v 1.571 2003/12/18 23:30:22 andi Exp $ */
+/* $Id: zend_execute.c,v 1.572 2003/12/19 11:22:12 dmitry Exp $ */
 
 #define ZEND_INTENSIVE_DEBUGGING 0
 
@@ -1591,24 +1591,21 @@
                        return zend_binary_assign_op_obj_helper(binary_op, 
ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                        break;
                case ZEND_ASSIGN_DIM: {
-                               zend_op *op_data = EX(opline)+1;
                                zval **object_ptr = 
get_obj_zval_ptr_ptr(&EX(opline)->op1, EX(Ts), BP_VAR_W TSRMLS_CC);
 
+                               (*object_ptr)->refcount++;  /* undo the effect of 
get_obj_zval_ptr_ptr() */
+
                                if ((*object_ptr)->type == IS_OBJECT) {
-                                       zend_assign_to_object(&EX(opline)->result, 
object_ptr, &EX(opline)->op2, &op_data->op1, EX(Ts), ZEND_ASSIGN_DIM TSRMLS_CC);
-                                       EX(opline)++;
-                                       NEXT_OPCODE();
+                                       return 
zend_binary_assign_op_obj_helper(binary_op, ZEND_OPCODE_HANDLER_ARGS_PASSTHRU);
                                } else {
                                        zend_op *data_opline = EX(opline)+1;
 
-                                       (*object_ptr)->refcount++;  /* undo the effect 
of get_obj_zval_ptr_ptr() */
                                        
zend_fetch_dimension_address(&data_opline->op2, &EX(opline)->op1, &EX(opline)->op2, 
EX(Ts), BP_VAR_RW TSRMLS_CC);
 
                                        value = get_zval_ptr(&data_opline->op1, 
EX(Ts), &EG(free_op1), BP_VAR_R);
                                        var_ptr = get_zval_ptr_ptr(&data_opline->op2, 
EX(Ts), BP_VAR_RW);
                                        EG(free_op2) = 0;
                                        increment_opline = 1;
-/*                                     zend_assign_to_variable(&EX(opline)->result, 
&data_opline->op2, &data_opline->op1, value, 
(EG(free_op1)?IS_TMP_VAR:EX(opline)->op1.op_type), EX(Ts) TSRMLS_CC); */
                                }
                        }
                        break;

Index: php-src/tests/classes/array_access_006.phpt
+++ php-src/tests/classes/array_access_006.phpt
--TEST--
ZE2 ArrayAccess and ASSIGN_OP operators (+=)
--FILE--
<?php 

class OverloadedArray implements ArrayAccess {
        public $realArray;
        
        function __construct() {
                $this->realArray = array(1,2,3);
        }

        function offsetExists($index) {
                return array_key_exists($this->realArray, $index);
        }

        function offsetGet($index) {
                return $this->realArray[$index];
        }

        function offsetSet($index, $value) {
                $this->realArray[$index] = $value;
        }

        function offsetUnset($index) {
                unset($this->realArray[$index]);
        }
}

$a = new OverloadedArray;
$a[1] += 10;
var_dump($a[1]);
echo "---Done---\n";
?>
--EXPECT--
int(12)
---Done---

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to