Browse Source

- If a function's return value is unused then don't create a ZEND_FREE

opcode but free it after the function call in zend_execute.
experimetnal/RETURN_REF_PATCH
Andi Gutmans 27 years ago
parent
commit
52045afb08
  1. 11
      Zend/zend_compile.c
  2. 3
      Zend/zend_execute.c

11
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];

3
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;

Loading…
Cancel
Save