--- Begin Message ---
Hi Sean,

 

Dmitry who made the necessary fixes in the PHP 5.2.x tree just forwarded
me the patch.

It is attached.

With this patch the said Zend Framework functionality should work.

 

Btw, once you bundle a PHP version which actually works with Zend
Framework, would you be interested in bundling ZF itself? I will also be
talking to some other Linux distros about that.

 

Best,


Andi

 

 

From: Dmitry Stogov [mailto:[EMAIL PROTECTED] 
Sent: Wednesday, January 10, 2007 7:58 AM
To: [EMAIL PROTECTED]
Subject: [ZEND-ENGINE-CVS] cvs: ZendEngine2(PHP_5_2) / zend_compile.c
zend_compile.h zend_execute.c zend_execute.h zend_hash.c zend_hash.h
zend_language_parser.y zend_object_handlers.c zend_vm_def.h
zend_vm_execute.h /tests bug35106.phpt bug36214.ph

 

dmitry          Wed Jan 10 15:58:09 2007 UTC 

  Added files:                 (Branch: PHP_5_2) 
    /ZendEngine2/tests  bug35106.phpt bug36214.phpt bug39449.phpt 
                        bug39990.phpt 

  Modified files:              
    /php-src    NEWS 
    /ZendEngine2        zend_compile.c zend_compile.h zend_execute.c 
                        zend_execute.h zend_hash.c zend_hash.h 
                        zend_language_parser.y zend_object_handlers.c 
                        zend_vm_def.h zend_vm_execute.h 
    /ZendEngine2/tests  bug38146.phpt 
  Log: 
  - Fixed bug #35106 (nested foreach fails when array variable has a
reference). 
  - Fixed bug #36214 (__get method works properly only when conditional
operator is used). 
  - Fixed bug #39449 (Overloaded array properties do not work
correctly). 
  - Fixed bug #39990 (Cannot "foreach" over overloaded properties). 
  
  

http://cvs.php.net/viewvc.cgi/php-src/NEWS?r1=1.2027.2.547.2.486&r2=1.2027.2.547.2.487&diff_format=u
Index: php-src/NEWS
diff -u php-src/NEWS:1.2027.2.547.2.486 php-src/NEWS:1.2027.2.547.2.487
--- php-src/NEWS:1.2027.2.547.2.486     Wed Jan 10 14:11:44 2007
+++ php-src/NEWS        Wed Jan 10 15:58:07 2007
@@ -13,13 +13,20 @@
 - Fixed bug #40036 (empty() does not work correctly with ArrayObject when using
   ARRAY_AS_PROPS). (Ilia)
 - Fixed bug #40002 (Try/Catch performs poorly). (Dmitry)
+- Fixed bug #39990 (Cannot "foreach" over overloaded properties). (Dmitry)
 - Fixed bug #39979 (PGSQL_CONNECT_FORCE_NEW will causes next connect to
   establish a new connection). (Ilia)
 - Fixed bug #39504 (xmlwriter_write_dtd_entity() creates Attlist tag,
   not entity). (Hannes)
+- Fixed bug #39449 (Overloaded array properties do not work correctly).
+  (Dmitry)
 - Fixed bug #39394 (Missing check for older variants of openssl). (Ilia)
 - Fixed bug #38325 (spl_autoload_register() gaves wrong line for "class
   not found"). (Ilia)
+- Fixed bug #36214 (__get method works properly only when conditional operator
+  is used). (Dmitry)
+- Fixed bug #35106 (nested foreach fails when array variable has a reference).
+  (Dmitry)
 
 04 Jan 2007, PHP 5.2.1RC2
 - Small optimization of the date() function (Matt,Ilia)
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.c?r1=1.647.2.27.2.25&r2=1.647.2.27.2.26&diff_format=u
Index: ZendEngine2/zend_compile.c
diff -u ZendEngine2/zend_compile.c:1.647.2.27.2.25 
ZendEngine2/zend_compile.c:1.647.2.27.2.26
--- ZendEngine2/zend_compile.c:1.647.2.27.2.25  Tue Jan  9 15:06:07 2007
+++ ZendEngine2/zend_compile.c  Wed Jan 10 15:58:07 2007
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_compile.c,v 1.647.2.27.2.25 2007/01/09 15:06:07 dmitry Exp $ */
+/* $Id: zend_compile.c,v 1.647.2.27.2.26 2007/01/10 15:58:07 dmitry Exp $ */
 
 #include <zend_language_parser.h>
 #include "zend.h"
@@ -3677,11 +3677,12 @@
 }
 
 
-void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, 
znode *array, int variable TSRMLS_DC)
+void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, 
znode *array, znode *as_token, int variable TSRMLS_DC)
 {
        zend_op *opline;
        zend_bool is_variable;
        zend_bool push_container = 0;
+       zend_op dummy_opline;
 
        if (variable) {
                if (zend_is_function_or_method_call(array)) {
@@ -3689,6 +3690,8 @@
                } else {
                        is_variable = 1;
                }
+               /* save the location of FETCH_W instruction(s) */
+               open_brackets_token->u.opline_num = 
get_next_op_number(CG(active_op_array));
                zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC);
                if (CG(active_op_array)->last > 0 &&
                    
CG(active_op_array)->opcodes[CG(active_op_array)->last-1].opcode == 
ZEND_FETCH_OBJ_W) {
@@ -3700,6 +3703,7 @@
                }
        } else {
                is_variable = 0;
+               open_brackets_token->u.opline_num = 
get_next_op_number(CG(active_op_array));
        }
 
        /* save the location of FE_RESET */
@@ -3714,28 +3718,17 @@
        opline->op1 = *array;
        SET_UNUSED(opline->op2);
        opline->extended_value = is_variable ? ZEND_FE_RESET_VARIABLE : 0;
-       *open_brackets_token = opline->result;
 
-       {
-               zend_op dummy_opline;
-
-               dummy_opline.result = opline->result;
-               if (push_container) {
-                       dummy_opline.op1 = 
CG(active_op_array)->opcodes[CG(active_op_array)->last-2].op1;
-               } else {
-                       znode tmp;
+       dummy_opline.result = opline->result;
+       if (push_container) {
+               dummy_opline.op1 = 
CG(active_op_array)->opcodes[CG(active_op_array)->last-2].op1;
+       } else {
+               znode tmp;
 
-                       tmp.op_type = IS_UNUSED;
-                       dummy_opline.op1 = tmp;
-               }
-               zend_stack_push(&CG(foreach_copy_stack), (void *) 
&dummy_opline, sizeof(zend_op));
+               tmp.op_type = IS_UNUSED;
+               dummy_opline.op1 = tmp;
        }
-}
-
-
-void zend_do_foreach_fetch(znode *foreach_token, znode *open_brackets_token, 
znode *as_token TSRMLS_DC)
-{
-       zend_op *opline;
+       zend_stack_push(&CG(foreach_copy_stack), (void *) &dummy_opline, 
sizeof(zend_op));
 
        /* save the location of FE_FETCH */
        as_token->u.opline_num = get_next_op_number(CG(active_op_array));
@@ -3744,7 +3737,7 @@
        opline->opcode = ZEND_FE_FETCH;
        opline->result.op_type = IS_VAR;
        opline->result.u.var = get_temporary_variable(CG(active_op_array));
-       opline->op1 = *open_brackets_token;
+       opline->op1 = dummy_opline.result;
        opline->extended_value = 0;
        SET_UNUSED(opline->op2);
 
@@ -3756,7 +3749,7 @@
 }
 
 
-void zend_do_foreach_cont(znode *foreach_token, znode *as_token, znode *value, 
znode *key TSRMLS_DC)
+void zend_do_foreach_cont(znode *foreach_token, znode *open_brackets_token, 
znode *as_token, znode *value, znode *key TSRMLS_DC)
 {
        zend_op *opline;
        znode dummy, value_node;
@@ -3787,6 +3780,19 @@
                /* Mark extended_value for assign-by-reference */
                opline->extended_value |= ZEND_FE_FETCH_BYREF;
                
CG(active_op_array)->opcodes[foreach_token->u.opline_num].extended_value |= 
ZEND_FE_RESET_REFERENCE;
+       } else {
+               zend_op *foreach_copy;
+               zend_op *fetch = 
&CG(active_op_array)->opcodes[foreach_token->u.opline_num];
+               zend_op *end = 
&CG(active_op_array)->opcodes[open_brackets_token->u.opline_num];
+
+               /* Change "write context" into "read context" */
+               fetch->extended_value = 0;  /* reset ZEND_FE_RESET_VARIABLE */
+               while (fetch != end) {
+                       (--fetch)->opcode -= 3; /* FETCH_W -> FETCH_R */
+               }
+               /* prevent double SWITCH_FREE */
+               zend_stack_top(&CG(foreach_copy_stack), (void **) 
&foreach_copy);
+               foreach_copy->op1.op_type = IS_UNUSED;
        }
 
        value_node = opline->result;
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_compile.h?r1=1.316.2.8.2.8&r2=1.316.2.8.2.9&diff_format=u
Index: ZendEngine2/zend_compile.h
diff -u ZendEngine2/zend_compile.h:1.316.2.8.2.8 
ZendEngine2/zend_compile.h:1.316.2.8.2.9
--- ZendEngine2/zend_compile.h:1.316.2.8.2.8    Mon Jan  1 09:35:46 2007
+++ ZendEngine2/zend_compile.h  Wed Jan 10 15:58:07 2007
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_compile.h,v 1.316.2.8.2.8 2007/01/01 09:35:46 sebastian Exp $ */
+/* $Id: zend_compile.h,v 1.316.2.8.2.9 2007/01/10 15:58:07 dmitry Exp $ */
 
 #ifndef ZEND_COMPILE_H
 #define ZEND_COMPILE_H
@@ -476,9 +476,8 @@
 
 void zend_do_instanceof(znode *result, znode *expr, znode *class_znode, int 
type TSRMLS_DC);
 
-void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, 
znode *array, int variable TSRMLS_DC);
-void zend_do_foreach_fetch(znode *foreach_token, znode *open_brackets_token, 
znode *as_token TSRMLS_DC);
-void zend_do_foreach_cont(znode *foreach_token, znode *as_token, znode *value, 
znode *key TSRMLS_DC);
+void zend_do_foreach_begin(znode *foreach_token, znode *open_brackets_token, 
znode *array, znode *as_token, int variable TSRMLS_DC);
+void zend_do_foreach_cont(znode *foreach_token, znode *open_brackets_token, 
znode *as_token, znode *value, znode *key TSRMLS_DC);
 void zend_do_foreach_end(znode *foreach_token, znode *as_token TSRMLS_DC);
 
 void zend_do_declare_begin(TSRMLS_D);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute.c?r1=1.716.2.12.2.16&r2=1.716.2.12.2.17&diff_format=u
Index: ZendEngine2/zend_execute.c
diff -u ZendEngine2/zend_execute.c:1.716.2.12.2.16 
ZendEngine2/zend_execute.c:1.716.2.12.2.17
--- ZendEngine2/zend_execute.c:1.716.2.12.2.16  Mon Jan  1 09:35:46 2007
+++ ZendEngine2/zend_execute.c  Wed Jan 10 15:58:07 2007
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_execute.c,v 1.716.2.12.2.16 2007/01/01 09:35:46 sebastian Exp $ */
+/* $Id: zend_execute.c,v 1.716.2.12.2.17 2007/01/10 15:58:07 dmitry Exp $ */
 
 #define ZEND_INTENSIVE_DEBUGGING 0
 
@@ -1163,7 +1163,8 @@
                                overloaded_result = 
Z_OBJ_HT_P(container)->read_dimension(container, dim, type TSRMLS_CC);
 
                                if (overloaded_result) {
-                                       if (type == BP_VAR_W || type == 
BP_VAR_RW  || type == BP_VAR_UNSET) {
+                                       if (!overloaded_result->is_ref &&
+                                           (type == BP_VAR_W || type == 
BP_VAR_RW  || type == BP_VAR_UNSET)) {
                                                if (overloaded_result->refcount 
> 0) {
                                                        zval *tmp = 
overloaded_result;
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_execute.h?r1=1.84.2.4.2.5&r2=1.84.2.4.2.6&diff_format=u
Index: ZendEngine2/zend_execute.h
diff -u ZendEngine2/zend_execute.h:1.84.2.4.2.5 
ZendEngine2/zend_execute.h:1.84.2.4.2.6
--- ZendEngine2/zend_execute.h:1.84.2.4.2.5     Mon Jan  1 09:35:46 2007
+++ ZendEngine2/zend_execute.h  Wed Jan 10 15:58:07 2007
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_execute.h,v 1.84.2.4.2.5 2007/01/01 09:35:46 sebastian Exp $ */
+/* $Id: zend_execute.h,v 1.84.2.4.2.6 2007/01/10 15:58:07 dmitry Exp $ */
 
 #ifndef ZEND_EXECUTE_H
 #define ZEND_EXECUTE_H
@@ -41,6 +41,12 @@
                zval *str;
                zend_uint offset;
        } str_offset;
+       struct {
+               zval **ptr_ptr;
+               zval *ptr;
+               zend_bool fcall_returned_reference;
+               HashPointer fe_pos;
+       } fe;
        zend_class_entry *class_entry;
 } temp_variable;
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_hash.c?r1=1.121.2.4.2.4&r2=1.121.2.4.2.5&diff_format=u
Index: ZendEngine2/zend_hash.c
diff -u ZendEngine2/zend_hash.c:1.121.2.4.2.4 
ZendEngine2/zend_hash.c:1.121.2.4.2.5
--- ZendEngine2/zend_hash.c:1.121.2.4.2.4       Mon Jan  1 09:35:46 2007
+++ ZendEngine2/zend_hash.c     Wed Jan 10 15:58:07 2007
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_hash.c,v 1.121.2.4.2.4 2007/01/01 09:35:46 sebastian Exp $ */
+/* $Id: zend_hash.c,v 1.121.2.4.2.5 2007/01/10 15:58:07 dmitry Exp $ */
 
 #include "zend.h"
 
@@ -1006,6 +1006,37 @@
 }
 
 
+ZEND_API int zend_hash_get_pointer(HashTable *ht, HashPointer *ptr)
+{
+       ptr->pos = ht->pInternalPointer;
+       if (ht->pInternalPointer) {
+               ptr->h = ht->pInternalPointer->h;
+               return 1;
+       } else {
+               ptr->h = 0;
+               return 0;
+       }
+}
+
+ZEND_API int zend_hash_set_pointer(HashTable *ht, const HashPointer *ptr)
+{
+       if (ht->pInternalPointer != ptr->pos) {
+               Bucket *p;
+
+               IS_CONSISTENT(ht);
+               p = ht->arBuckets[ptr->h & ht->nTableMask];
+               while (p != NULL) {
+                       if (p == ptr->pos) {
+                               ht->pInternalPointer = p;
+                               return 1;
+                       }
+                       p = p->pNext;
+               }
+               return 0;
+       }
+       return 1;
+}
+
 ZEND_API void zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition 
*pos)
 {
        IS_CONSISTENT(ht);
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_hash.h?r1=1.78.2.2.2.1&r2=1.78.2.2.2.2&diff_format=u
Index: ZendEngine2/zend_hash.h
diff -u ZendEngine2/zend_hash.h:1.78.2.2.2.1 
ZendEngine2/zend_hash.h:1.78.2.2.2.2
--- ZendEngine2/zend_hash.h:1.78.2.2.2.1        Mon Jan  1 09:35:46 2007
+++ ZendEngine2/zend_hash.h     Wed Jan 10 15:58:07 2007
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_hash.h,v 1.78.2.2.2.1 2007/01/01 09:35:46 sebastian Exp $ */
+/* $Id: zend_hash.h,v 1.78.2.2.2.2 2007/01/10 15:58:07 dmitry Exp $ */
 
 #ifndef ZEND_HASH_H
 #define ZEND_HASH_H
@@ -176,6 +176,14 @@
 ZEND_API void zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition 
*pos);
 ZEND_API int zend_hash_update_current_key_ex(HashTable *ht, int key_type, char 
*str_index, uint str_length, ulong num_index, HashPosition *pos);
 
+typedef struct _HashPointer {
+       HashPosition pos;
+       ulong h;
+} HashPointer;
+
+ZEND_API int zend_hash_get_pointer(HashTable *ht, HashPointer *ptr);
+ZEND_API int zend_hash_set_pointer(HashTable *ht, const HashPointer *ptr);
+
 #define zend_hash_has_more_elements(ht) \
        zend_hash_has_more_elements_ex(ht, NULL)
 #define zend_hash_move_forward(ht) \
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_language_parser.y?r1=1.160.2.4.2.2&r2=1.160.2.4.2.3&diff_format=u
Index: ZendEngine2/zend_language_parser.y
diff -u ZendEngine2/zend_language_parser.y:1.160.2.4.2.2 
ZendEngine2/zend_language_parser.y:1.160.2.4.2.3
--- ZendEngine2/zend_language_parser.y:1.160.2.4.2.2    Wed Dec 20 16:31:10 2006
+++ ZendEngine2/zend_language_parser.y  Wed Jan 10 15:58:07 2007
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_language_parser.y,v 1.160.2.4.2.2 2006/12/20 16:31:10 tony2001 
Exp $ */
+/* $Id: zend_language_parser.y,v 1.160.2.4.2.3 2007/01/10 15:58:07 dmitry Exp 
$ */
 
 /*
  * LALR shift/reduce conflicts and how they are resolved:
@@ -214,14 +214,14 @@
        |       expr ';'                                { zend_do_free(&$1 
TSRMLS_CC); }
        |       T_USE use_filename ';'          { 
zend_error(E_COMPILE_ERROR,"use: Not yet supported. Please use include_once() 
or require_once()");  zval_dtor(&$2.u.constant); }
        |       T_UNSET '(' unset_variables ')' ';'
-       |       T_FOREACH '(' variable { zend_do_foreach_begin(&$1, &$2, &$3, 1 
TSRMLS_CC); } T_AS
-               { zend_do_foreach_fetch(&$1, &$2, &$5 TSRMLS_CC); }
-               foreach_variable foreach_optional_arg ')' { 
zend_do_foreach_cont(&$1, &$5, &$7, &$8 TSRMLS_CC); }
-               foreach_statement { zend_do_foreach_end(&$1, &$5 TSRMLS_CC); }
-       |       T_FOREACH '(' expr_without_variable { 
zend_do_foreach_begin(&$1, &$2, &$3, 0 TSRMLS_CC); } T_AS
-               { zend_do_foreach_fetch(&$1, &$2, &$5 TSRMLS_CC); }
-               variable foreach_optional_arg ')' { 
zend_check_writable_variable(&$7); zend_do_foreach_cont(&$1, &$5, &$7, &$8 
TSRMLS_CC); }
-               foreach_statement { zend_do_foreach_end(&$1, &$5 TSRMLS_CC); }
+       |       T_FOREACH '(' variable T_AS
+               { zend_do_foreach_begin(&$1, &$2, &$3, &$4, 1 TSRMLS_CC); }
+               foreach_variable foreach_optional_arg ')' { 
zend_do_foreach_cont(&$1, &$2, &$4, &$6, &$7 TSRMLS_CC); }
+               foreach_statement { zend_do_foreach_end(&$1, &$4 TSRMLS_CC); }
+       |       T_FOREACH '(' expr_without_variable T_AS
+               { zend_do_foreach_begin(&$1, &$2, &$3, &$4, 0 TSRMLS_CC); }
+               variable foreach_optional_arg ')' { 
zend_check_writable_variable(&$6); zend_do_foreach_cont(&$1, &$2, &$4, &$6, &$7 
TSRMLS_CC); }
+               foreach_statement { zend_do_foreach_end(&$1, &$4 TSRMLS_CC); }
        |       T_DECLARE { $1.u.opline_num = 
get_next_op_number(CG(active_op_array)); zend_do_declare_begin(TSRMLS_C); } '(' 
declare_list ')' declare_statement { zend_do_declare_end(&$1 TSRMLS_CC); }
        |       ';'             /* empty statement */
        |       T_TRY { zend_do_try(&$1 TSRMLS_CC); } '{' inner_statement_list 
'}'
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_object_handlers.c?r1=1.135.2.6.2.18&r2=1.135.2.6.2.19&diff_format=u
Index: ZendEngine2/zend_object_handlers.c
diff -u ZendEngine2/zend_object_handlers.c:1.135.2.6.2.18 
ZendEngine2/zend_object_handlers.c:1.135.2.6.2.19
--- ZendEngine2/zend_object_handlers.c:1.135.2.6.2.18   Mon Jan  1 09:35:47 2007
+++ ZendEngine2/zend_object_handlers.c  Wed Jan 10 15:58:07 2007
@@ -17,7 +17,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_object_handlers.c,v 1.135.2.6.2.18 2007/01/01 09:35:47 sebastian 
Exp $ */
+/* $Id: zend_object_handlers.c,v 1.135.2.6.2.19 2007/01/10 15:58:07 dmitry Exp 
$ */
 
 #include "zend.h"
 #include "zend_globals.h"
@@ -334,7 +334,8 @@
 
                        if (rv) {
                                retval = &rv;
-                               if (type == BP_VAR_W || type == BP_VAR_RW  || 
type == BP_VAR_UNSET) {
+                               if (!rv->is_ref &&
+                                   (type == BP_VAR_W || type == BP_VAR_RW  || 
type == BP_VAR_UNSET)) {
                                        if (rv->refcount > 0) {
                                                zval *tmp = rv;
 
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_def.h?r1=1.59.2.29.2.35&r2=1.59.2.29.2.36&diff_format=u
Index: ZendEngine2/zend_vm_def.h
diff -u ZendEngine2/zend_vm_def.h:1.59.2.29.2.35 
ZendEngine2/zend_vm_def.h:1.59.2.29.2.36
--- ZendEngine2/zend_vm_def.h:1.59.2.29.2.35    Mon Jan  1 09:35:47 2007
+++ ZendEngine2/zend_vm_def.h   Wed Jan 10 15:58:07 2007
@@ -18,7 +18,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: zend_vm_def.h,v 1.59.2.29.2.35 2007/01/01 09:35:47 sebastian Exp $ */
+/* $Id: zend_vm_def.h,v 1.59.2.29.2.36 2007/01/10 15:58:07 dmitry Exp $ */
 
 /* If you change this file, please regenerate the zend_vm_execute.h and
  * zend_vm_opcodes.h files by running:
@@ -3207,6 +3207,7 @@
                        }
                }
                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
+               zend_hash_get_pointer(fe_ht, 
&EX_T(opline->result.u.var).fe.fe_pos);
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for 
foreach()");
                is_empty = 1;
@@ -3251,6 +3252,7 @@
                        zend_object *zobj = zend_objects_get_address(array 
TSRMLS_CC);
 
                        fe_ht = HASH_OF(array);
+                       zend_hash_set_pointer(fe_ht, 
&EX_T(opline->op1.u.var).fe.fe_pos);
                        do {
                                if (zend_hash_get_current_data(fe_ht, (void **) 
&value)==FAILURE) {
                                        /* reached end of iteration */
@@ -3262,6 +3264,7 @@
                        } while (key_type == HASH_KEY_NON_EXISTANT ||
                                 (key_type != HASH_KEY_IS_LONG &&
                                  zend_check_property_access(zobj, str_key, 
str_key_len-1 TSRMLS_CC) != SUCCESS));
+                       zend_hash_get_pointer(fe_ht, 
&EX_T(opline->op1.u.var).fe.fe_pos);
                        if (use_key && key_type != HASH_KEY_IS_LONG) {
                                zend_unmangle_property_name(str_key, 
str_key_len-1, &class_name, &prop_name);
                                str_key_len = strlen(prop_name);
@@ -3273,6 +3276,7 @@
 
                case ZEND_ITER_PLAIN_ARRAY:
                        fe_ht = HASH_OF(array);
+                       zend_hash_set_pointer(fe_ht, 
&EX_T(opline->op1.u.var).fe.fe_pos);
                        if (zend_hash_get_current_data(fe_ht, (void **) 
&value)==FAILURE) {
                                /* reached end of iteration */
                                
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
@@ -3281,6 +3285,7 @@
                                key_type = zend_hash_get_current_key_ex(fe_ht, 
&str_key, &str_key_len, &int_key, 1, NULL);
                        }
                        zend_hash_move_forward(fe_ht);
+                       zend_hash_get_pointer(fe_ht, 
&EX_T(opline->op1.u.var).fe.fe_pos);
                        break;
 
                case ZEND_ITER_OBJECT:
http://cvs.php.net/viewvc.cgi/ZendEngine2/zend_vm_execute.h?r1=1.62.2.30.2.35&r2=1.62.2.30.2.36&diff_format=u
Index: ZendEngine2/zend_vm_execute.h
diff -u ZendEngine2/zend_vm_execute.h:1.62.2.30.2.35 
ZendEngine2/zend_vm_execute.h:1.62.2.30.2.36
--- ZendEngine2/zend_vm_execute.h:1.62.2.30.2.35        Mon Jan  1 09:35:47 2007
+++ ZendEngine2/zend_vm_execute.h       Wed Jan 10 15:58:07 2007
@@ -2256,6 +2256,7 @@
                        }
                }
                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
+               zend_hash_get_pointer(fe_ht, 
&EX_T(opline->result.u.var).fe.fe_pos);
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for 
foreach()");
                is_empty = 1;
@@ -4796,6 +4797,7 @@
                        }
                }
                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
+               zend_hash_get_pointer(fe_ht, 
&EX_T(opline->result.u.var).fe.fe_pos);
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for 
foreach()");
                is_empty = 1;
@@ -7926,6 +7928,7 @@
                        }
                }
                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
+               zend_hash_get_pointer(fe_ht, 
&EX_T(opline->result.u.var).fe.fe_pos);
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for 
foreach()");
                is_empty = 1;
@@ -7970,6 +7973,7 @@
                        zend_object *zobj = zend_objects_get_address(array 
TSRMLS_CC);
 
                        fe_ht = HASH_OF(array);
+                       zend_hash_set_pointer(fe_ht, 
&EX_T(opline->op1.u.var).fe.fe_pos);
                        do {
                                if (zend_hash_get_current_data(fe_ht, (void **) 
&value)==FAILURE) {
                                        /* reached end of iteration */
@@ -7981,6 +7985,7 @@
                        } while (key_type == HASH_KEY_NON_EXISTANT ||
                                 (key_type != HASH_KEY_IS_LONG &&
                                  zend_check_property_access(zobj, str_key, 
str_key_len-1 TSRMLS_CC) != SUCCESS));
+                       zend_hash_get_pointer(fe_ht, 
&EX_T(opline->op1.u.var).fe.fe_pos);
                        if (use_key && key_type != HASH_KEY_IS_LONG) {
                                zend_unmangle_property_name(str_key, 
str_key_len-1, &class_name, &prop_name);
                                str_key_len = strlen(prop_name);
@@ -7992,6 +7997,7 @@
 
                case ZEND_ITER_PLAIN_ARRAY:
                        fe_ht = HASH_OF(array);
+                       zend_hash_set_pointer(fe_ht, 
&EX_T(opline->op1.u.var).fe.fe_pos);
                        if (zend_hash_get_current_data(fe_ht, (void **) 
&value)==FAILURE) {
                                /* reached end of iteration */
                                
ZEND_VM_JMP(EX(op_array)->opcodes+opline->op2.u.opline_num);
@@ -8000,6 +8006,7 @@
                                key_type = zend_hash_get_current_key_ex(fe_ht, 
&str_key, &str_key_len, &int_key, 1, NULL);
                        }
                        zend_hash_move_forward(fe_ht);
+                       zend_hash_get_pointer(fe_ht, 
&EX_T(opline->op1.u.var).fe.fe_pos);
                        break;
 
                case ZEND_ITER_OBJECT:
@@ -19982,6 +19989,7 @@
                        }
                }
                is_empty = zend_hash_has_more_elements(fe_ht) != SUCCESS;
+               zend_hash_get_pointer(fe_ht, 
&EX_T(opline->result.u.var).fe.fe_pos);
        } else {
                zend_error(E_WARNING, "Invalid argument supplied for 
foreach()");
                is_empty = 1;
http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug38146.phpt?r1=1.1.2.2&r2=1.1.2.3&diff_format=u
Index: ZendEngine2/tests/bug38146.phpt
diff -u ZendEngine2/tests/bug38146.phpt:1.1.2.2 
ZendEngine2/tests/bug38146.phpt:1.1.2.3
--- ZendEngine2/tests/bug38146.phpt:1.1.2.2     Fri Dec  8 15:55:30 2006
+++ ZendEngine2/tests/bug38146.phpt     Wed Jan 10 15:58:08 2007
@@ -14,7 +14,6 @@
     print "$key => $value\n";
 }
 ?>
---EXPECTF--
-Notice: Indirect modification of overloaded property foo::$bar has no effect 
in %sbug38146.php on line 10
+--EXPECT--
 foo => bar
 bar => foo

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug35106.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug35106.phpt
+++ ZendEngine2/tests/bug35106.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug36214.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug36214.phpt
+++ ZendEngine2/tests/bug36214.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug39449.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug39449.phpt
+++ ZendEngine2/tests/bug39449.phpt

http://cvs.php.net/viewvc.cgi/ZendEngine2/tests/bug39990.phpt?view=markup&rev=1.1
Index: ZendEngine2/tests/bug39990.phpt
+++ ZendEngine2/tests/bug39990.phpt

-- 
Zend Engine CVS Mailing List (http://cvs.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php
_______________________________________________
pkg-php-maint mailing list
[EMAIL PROTECTED]
http://lists.alioth.debian.org/mailman/listinfo/pkg-php-maint

--- End Message ---

Reply via email to