From 7f48989be63a98ecbc3140db0643d3da74c774db Mon Sep 17 00:00:00 2001 From: Andi Gutmans Date: Sat, 5 Feb 2000 20:19:46 +0000 Subject: [PATCH] - This hopefully fixes the list($a, $a) = array(1,2) crash, i.e. when list by mistake contains the same variable twice. - BTW, there is no defined order of assignment. The value of $a after the previous example is undefined, and should not be assumed to be either 1 nor 2. --- Zend/zend-parser.y | 2 +- Zend/zend_compile.c | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/Zend/zend-parser.y b/Zend/zend-parser.y index a930bdfab0..d5f851e1b7 100644 --- a/Zend/zend-parser.y +++ b/Zend/zend-parser.y @@ -644,7 +644,7 @@ assignment_list: assignment_list_element: - w_cvar { do_add_list_element(&$1 CLS_CC); } + cvar { do_add_list_element(&$1 CLS_CC); } | T_LIST '(' { do_new_list_begin(CLS_C); } assignment_list ')' { do_new_list_end(CLS_C); } | /* empty */ { do_add_list_element(NULL CLS_CC); } ; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 1e9af037b3..0ba66fa1f5 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1758,7 +1758,7 @@ void do_add_list_element(znode *element CLS_DC) if (element) { lle.var = *element; zend_llist_copy(&lle.dimensions, &CG(dimension_llist)); - zend_llist_add_element(&CG(list_llist), &lle); + zend_llist_prepend_element(&CG(list_llist), &lle); } (*((int *)CG(dimension_llist).tail->data))++; } @@ -1827,11 +1827,7 @@ void do_list_end(znode *result, znode *expr CLS_DC) } ((list_llist_element *) le->data)->value = last_container; zend_llist_destroy(&((list_llist_element *) le->data)->dimensions); - le = le->next; - } - - le = CG(list_llist).head; - while (le) { + do_end_variable_parse(BP_VAR_W, 0 CLS_CC); do_assign(result, &((list_llist_element *) le->data)->var, &((list_llist_element *) le->data)->value CLS_CC); CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED; le = le->next; -- 2.50.1