hi ralph, andi, et al.

On Tuesday 06 May 2008 10:27:46 pm Ralph Schindler wrote:
> Just curious if you had time to follow up with this.  A patch was found and
> supplied, but I think at some point this thread died out.
>
> http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=440634#10

i've spent a bit of time looking at the patch, and unfortunately parts of it 
do not apply:

rangda[/home/sean/debian/build-area/php5-5.2.0] patch --dry-run -p1 < 
~/overloaded_array_properties.patch                :)
(Stripping trailing CRs from patch.)
patching file Zend/zend_compile.c
Hunk #1 succeeded at 3634 (offset -43 lines).
Hunk #2 succeeded at 3647 (offset -43 lines).
Hunk #3 succeeded at 3660 (offset -43 lines).
Hunk #4 succeeded at 3675 (offset -43 lines).
Hunk #5 succeeded at 3694 (offset -43 lines).
Hunk #6 succeeded at 3706 (offset -43 lines).
Hunk #7 succeeded at 3737 (offset -43 lines).
(Stripping trailing CRs from patch.)
patching file Zend/zend_compile.h
(Stripping trailing CRs from patch.)
patching file Zend/zend_execute.c
Hunk #1 FAILED at 1163.
1 out of 1 hunk FAILED -- saving rejects to file Zend/zend_execute.c.rej
(Stripping trailing CRs from patch.)
patching file Zend/zend_execute.h
(Stripping trailing CRs from patch.)
patching file Zend/zend_hash.c
Hunk #1 succeeded at 992 (offset -14 lines).
(Stripping trailing CRs from patch.)
patching file Zend/zend_hash.h
(Stripping trailing CRs from patch.)
patching file Zend/zend_language_parser.y
(Stripping trailing CRs from patch.)
patching file Zend/zend_object_handlers.c
Hunk #1 FAILED at 334.
1 out of 1 hunk FAILED -- saving rejects to file 
Zend/zend_object_handlers.c.rej
(Stripping trailing CRs from patch.)
patching file Zend/zend_vm_def.h
Hunk #1 succeeded at 3198 (offset -9 lines).
Hunk #2 succeeded at 3243 (offset -9 lines).
Hunk #3 FAILED at 3255.
Hunk #4 succeeded at 3265 (offset -11 lines).
Hunk #5 succeeded at 3274 (offset -11 lines).
1 out of 5 hunks FAILED -- saving rejects to file Zend/zend_vm_def.h.rej
(Stripping trailing CRs from patch.)
patching file Zend/zend_vm_execute.h
Hunk #1 succeeded at 2255 (offset -1 lines).
Hunk #2 succeeded at 4795 (offset -2 lines).
Hunk #3 succeeded at 7917 (offset -11 lines).
Hunk #4 succeeded at 7962 (offset -11 lines).
Hunk #5 FAILED at 7974.
Hunk #6 succeeded at 7984 (offset -13 lines).
Hunk #7 succeeded at 7993 (offset -13 lines).
Hunk #8 succeeded at 19967 (offset -22 lines).
1 out of 8 hunks FAILED -- saving rejects to file Zend/zend_vm_execute.h.rej
(Stripping trailing CRs from patch.)
patching file Zend/tests/bug38146.phpt
Hunk #1 FAILED at 14.
1 out of 1 hunk FAILED -- saving rejects to file Zend/tests/bug38146.phpt.rej
rangda[/home/sean/debian/build-area/php5-5.2.0]                         [1] :(



and the first failed hunk does indeed seem nontrivial (seems the surrounding 
logic hash changed enough that someone who knows the code should review the 
change).  i've stopped there, so i don't know if it's the same for the rest 
of the failures.

fwiw, i've reattached the patch in question, in which i've made the following 
modificaitons:

- removed NEWS changes
- removed cvs id related changes
- s,ZendEngine2,foo/Zend, in patch references, so the whole patch applies 
cleanly to an unpacked php5 tarball at -p1.


if someone wants to comment on what should be done (or beter, provide a patch 
that applies against 5.2.0), i can take the next step of providing updated 
packages for testing.

thanks,
        sean
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: foo/Zend/zend_compile.c
diff -u foo/Zend/zend_compile.c:1.647.2.27.2.25 foo/Zend/zend_compile.c:1.647.2.27.2.26
--- foo/Zend/zend_compile.c:1.647.2.27.2.25	Tue Jan  9 15:06:07 2007
+++ foo/Zend/zend_compile.c	Wed Jan 10 15:58:07 2007
@@ -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: foo/Zend/zend_compile.h
diff -u foo/Zend/zend_compile.h:1.316.2.8.2.8 foo/Zend/zend_compile.h:1.316.2.8.2.9
--- foo/Zend/zend_compile.h:1.316.2.8.2.8	Mon Jan  1 09:35:46 2007
+++ foo/Zend/zend_compile.h	Wed Jan 10 15:58:07 2007
@@ -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: foo/Zend/zend_execute.c
diff -u foo/Zend/zend_execute.c:1.716.2.12.2.16 foo/Zend/zend_execute.c:1.716.2.12.2.17
--- foo/Zend/zend_execute.c:1.716.2.12.2.16	Mon Jan  1 09:35:46 2007
+++ foo/Zend/zend_execute.c	Wed Jan 10 15:58:07 2007
@@ -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: foo/Zend/zend_execute.h
diff -u foo/Zend/zend_execute.h:1.84.2.4.2.5 foo/Zend/zend_execute.h:1.84.2.4.2.6
--- foo/Zend/zend_execute.h:1.84.2.4.2.5	Mon Jan  1 09:35:46 2007
+++ foo/Zend/zend_execute.h	Wed Jan 10 15:58:07 2007
@@ -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: foo/Zend/zend_hash.c
diff -u foo/Zend/zend_hash.c:1.121.2.4.2.4 foo/Zend/zend_hash.c:1.121.2.4.2.5
--- foo/Zend/zend_hash.c:1.121.2.4.2.4	Mon Jan  1 09:35:46 2007
+++ foo/Zend/zend_hash.c	Wed Jan 10 15:58:07 2007
@@ -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: foo/Zend/zend_hash.h
diff -u foo/Zend/zend_hash.h:1.78.2.2.2.1 foo/Zend/zend_hash.h:1.78.2.2.2.2
--- foo/Zend/zend_hash.h:1.78.2.2.2.1	Mon Jan  1 09:35:46 2007
+++ foo/Zend/zend_hash.h	Wed Jan 10 15:58:07 2007
@@ -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: foo/Zend/zend_language_parser.y
diff -u foo/Zend/zend_language_parser.y:1.160.2.4.2.2 foo/Zend/zend_language_parser.y:1.160.2.4.2.3
--- foo/Zend/zend_language_parser.y:1.160.2.4.2.2	Wed Dec 20 16:31:10 2006
+++ foo/Zend/zend_language_parser.y	Wed Jan 10 15:58:07 2007
@@ -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: foo/Zend/zend_object_handlers.c
diff -u foo/Zend/zend_object_handlers.c:1.135.2.6.2.18 foo/Zend/zend_object_handlers.c:1.135.2.6.2.19
--- foo/Zend/zend_object_handlers.c:1.135.2.6.2.18	Mon Jan  1 09:35:47 2007
+++ foo/Zend/zend_object_handlers.c	Wed Jan 10 15:58:07 2007
@@ -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: foo/Zend/zend_vm_def.h
diff -u foo/Zend/zend_vm_def.h:1.59.2.29.2.35 foo/Zend/zend_vm_def.h:1.59.2.29.2.36
--- foo/Zend/zend_vm_def.h:1.59.2.29.2.35	Mon Jan  1 09:35:47 2007
+++ foo/Zend/zend_vm_def.h	Wed Jan 10 15:58:07 2007
@@ -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: foo/Zend/zend_vm_execute.h
diff -u foo/Zend/zend_vm_execute.h:1.62.2.30.2.35 foo/Zend/zend_vm_execute.h:1.62.2.30.2.36
--- foo/Zend/zend_vm_execute.h:1.62.2.30.2.35	Mon Jan  1 09:35:47 2007
+++ foo/Zend/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: foo/Zend/tests/bug38146.phpt
diff -u foo/Zend/tests/bug38146.phpt:1.1.2.2 foo/Zend/tests/bug38146.phpt:1.1.2.3
--- foo/Zend/tests/bug38146.phpt:1.1.2.2	Fri Dec  8 15:55:30 2006
+++ foo/Zend/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: foo/Zend/tests/bug35106.phpt
+++ foo/Zend/tests/bug35106.phpt

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

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

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

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to