summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2015-05-22 21:05:47 +0200
committerNikita Popov <nikic@php.net>2015-05-23 10:51:33 +0200
commitd0e265392fdb41d34984fa9794e4aad65e44d86b (patch)
tree3e7db4c984e7f7a6b0b905528014983f16e9cddd /Zend/zend_execute.c
parent1bee093ecae1c0ca92375e6175cadb2f947f93b9 (diff)
downloadphp-git-d0e265392fdb41d34984fa9794e4aad65e44d86b.tar.gz
Drop FREE_ON_RETURN flag, check brk_cont->start instead
Start >= 0 already tells us whether or not the loop has a loop variable, no need to add extra flags to opcodes. Also added a test for a case where FREE_ON_RETURN is relevant, we didn't seem to have any coverage for this.
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c16
1 files changed, 6 insertions, 10 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 1be3de41a2..da91b40106 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1732,21 +1732,17 @@ static inline zend_brk_cont_element* zend_brk_cont(int nest_levels, int array_of
do {
ZEND_ASSERT(array_offset != -1);
jmp_to = &op_array->brk_cont_array[array_offset];
- if (nest_levels>1) {
+ if (nest_levels > 1 && jmp_to->start >= 0) {
zend_op *brk_opline = &op_array->opcodes[jmp_to->brk];
if (brk_opline->opcode == ZEND_FREE) {
- if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
- zval_ptr_dtor_nogc(EX_VAR(brk_opline->op1.var));
- }
+ zval_ptr_dtor_nogc(EX_VAR(brk_opline->op1.var));
} else if (brk_opline->opcode == ZEND_FE_FREE) {
- if (!(brk_opline->extended_value & EXT_TYPE_FREE_ON_RETURN)) {
- zval *var = EX_VAR(brk_opline->op1.var);
- if (Z_TYPE_P(var) != IS_ARRAY && Z_FE_ITER_P(var) != (uint32_t)-1) {
- zend_hash_iterator_del(Z_FE_ITER_P(var));
- }
- zval_ptr_dtor_nogc(var);
+ zval *var = EX_VAR(brk_opline->op1.var);
+ if (Z_TYPE_P(var) != IS_ARRAY && Z_FE_ITER_P(var) != (uint32_t)-1) {
+ zend_hash_iterator_del(Z_FE_ITER_P(var));
}
+ zval_ptr_dtor_nogc(var);
}
}
array_offset = jmp_to->parent;