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
signature.asc
Description: This is a digitally signed message part.