summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_execute.c15
1 files changed, 7 insertions, 8 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index d26181a7d2..0acb5f157e 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -75,8 +75,8 @@ static void zend_extension_fcall_end_handler(zend_extension *extension, zend_op_
&& offset<=function_being_called->common.arg_types[0] \
&& function_being_called->common.arg_types[offset]==BYREF_FORCE)
-#define SEPARATE_ON_READ_OBJECT(obj) \
-if ((obj) && (type == BP_VAR_R) && ((*(obj))->type == IS_OBJECT) && (!(*(obj))->is_ref)) { \
+#define SEPARATE_ON_READ_OBJECT(obj, _type) \
+if ((obj) && ((_type) == BP_VAR_R) && ((*(obj))->type == IS_OBJECT) && (!(*(obj))->is_ref)) { \
SEPARATE_ZVAL((obj)); \
(*(obj))->is_ref = 1; \
}
@@ -500,7 +500,7 @@ static inline void zend_fetch_var_address(znode *result, znode *op1, znode *op2,
zval_dtor(varname);
}
Ts[result->u.var].var.ptr_ptr = retval;
- SEPARATE_ON_READ_OBJECT(retval);
+ SEPARATE_ON_READ_OBJECT(retval, type);
SELECTIVE_PZVAL_LOCK(*retval, result);
}
@@ -667,7 +667,7 @@ static inline void zend_fetch_dimension_address(znode *result, znode *op1, znode
} else {
*retval = zend_fetch_dimension_address_inner(container->value.ht, op2, Ts, type ELS_CC);
}
- SEPARATE_ON_READ_OBJECT(*retval);
+ SEPARATE_ON_READ_OBJECT(*retval, type);
SELECTIVE_PZVAL_LOCK(**retval, result);
break;
case IS_STRING: {
@@ -844,7 +844,7 @@ static inline void zend_fetch_property_address(znode *result, znode *op1, znode
zendi_zval_copy_ctor(*container);
}
*retval = zend_fetch_property_address_inner(container->value.obj.properties, op2, Ts, type ELS_CC);
- SEPARATE_ON_READ_OBJECT(*retval);
+ SEPARATE_ON_READ_OBJECT(*retval, type);
SELECTIVE_PZVAL_LOCK(**retval, result);
}
@@ -1514,10 +1514,9 @@ do_fcall_common:
call_overloaded_function(opline->extended_value, &Ts[opline->result.u.var].tmp_var, &EG(regular_list), &EG(persistent_list) ELS_CC);
efree(function_being_called);
}
+ object.ptr = zend_ptr_stack_pop(&EG(arg_types_stack));
if (opline->opcode == ZEND_DO_FCALL_BY_NAME) {
- zend_ptr_stack_n_pop(&EG(arg_types_stack), 2, &object.ptr, &function_being_called);
- } else if (opline->opcode == ZEND_DO_FCALL) {
- object.ptr = zend_ptr_stack_pop(&EG(arg_types_stack));
+ function_being_called = zend_ptr_stack_pop(&EG(arg_types_stack));
}
function_state.function = (zend_function *) op_array;
EG(function_state_ptr) = &function_state;