diff options
author | Nikita Popov <nikic@php.net> | 2015-05-22 21:05:47 +0200 |
---|---|---|
committer | Nikita Popov <nikic@php.net> | 2015-05-23 10:51:33 +0200 |
commit | d0e265392fdb41d34984fa9794e4aad65e44d86b (patch) | |
tree | 3e7db4c984e7f7a6b0b905528014983f16e9cddd /Zend/zend_execute.c | |
parent | 1bee093ecae1c0ca92375e6175cadb2f947f93b9 (diff) | |
download | php-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.c | 16 |
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; |