diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 9955453190a..c5483d19ee2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -623,15 +623,16 @@ void do_free(znode *op1 CLS_DC) { if (op1->op_type==IS_TMP_VAR) { zend_op *last_opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1]; - zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); if ((last_opline->opcode == ZEND_DO_FCALL) || (last_opline->opcode == ZEND_DO_FCALL_BY_NAME)) { last_opline->result.u.EA.type |= EXT_TYPE_UNUSED; - } + } else { + zend_op *opline = get_next_op(CG(active_op_array) CLS_CC); - opline->opcode = ZEND_FREE; - opline->op1 = *op1; - SET_UNUSED(opline->op2); + opline->opcode = ZEND_FREE; + opline->op1 = *op1; + SET_UNUSED(opline->op2); + } } else if (op1->op_type==IS_VAR) { zend_op *opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last-1]; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index a580c76c13d..b4baddcb7cc 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1472,6 +1472,9 @@ do_fcall_common: if (object.ptr) { object.ptr->refcount--; } + if (opline->result.u.EA.type & EXT_TYPE_UNUSED) { + zendi_zval_dtor(Ts[opline->result.u.var].tmp_var); + } } else if (function_state.function->type==ZEND_USER_FUNCTION) { HashTable *calling_symbol_table;