summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcus Boerger <helly@php.net>2003-11-18 07:19:55 +0000
committerMarcus Boerger <helly@php.net>2003-11-18 07:19:55 +0000
commit1eaf126a7a76124586c29ce978500d1fd22e8988 (patch)
tree077cdae13bbe8bedb566df07fad73ef37469c5a4
parent45a07a546f3f94d1a881695042323007c85db5e6 (diff)
downloadphp-git-1eaf126a7a76124586c29ce978500d1fd22e8988.tar.gz
Backpatch the correct opcode for list(), property overloading needs more
opcodes (Bugfix #26257).
-rw-r--r--Zend/zend_compile.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index 8f037171d4..bccf78cae1 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -2838,6 +2838,9 @@ void zend_do_list_end(znode *result, znode *expr TSRMLS_DC)
zend_llist_element *dimension;
zend_op *opline;
znode last_container;
+ int opcode_index;
+ int last_op_number;
+ zend_op *last_op;
le = CG(list_llist).head;
while (le) {
@@ -2877,8 +2880,14 @@ void zend_do_list_end(znode *result, znode *expr TSRMLS_DC)
((list_llist_element *) le->data)->value = last_container;
zend_llist_destroy(&((list_llist_element *) le->data)->dimensions);
zend_do_end_variable_parse(BP_VAR_W, 0 TSRMLS_CC);
+ opcode_index = - 1;
+ last_op_number = get_next_op_number(CG(active_op_array))-1;
+ last_op = &CG(active_op_array)->opcodes[last_op_number];
+ if (last_op->opcode == ZEND_FETCH_OBJ_W) {
+ opcode_index = - 2;
+ }
zend_do_assign(result, &((list_llist_element *) le->data)->var, &((list_llist_element *) le->data)->value TSRMLS_CC);
- CG(active_op_array)->opcodes[CG(active_op_array)->last-1].result.u.EA.type |= EXT_TYPE_UNUSED;
+ CG(active_op_array)->opcodes[CG(active_op_array)->last + opcode_index].result.u.EA.type |= EXT_TYPE_UNUSED;
le = le->next;
}
zend_llist_destroy(&CG(dimension_llist));