ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
{
zend_execute_data *old_execute_data;
- zend_call_kind call_kind = EX_CALL_KIND();
+ uint32_t call_info = EX_CALL_INFO();
- if (call_kind == ZEND_CALL_NESTED_FUNCTION) {
+ if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_FUNCTION) {
zend_object *object;
i_free_compiled_variables(execute_data);
zend_vm_stack_free_extra_args(execute_data);
old_execute_data = execute_data;
execute_data = EG(current_execute_data) = EX(prev_execute_data);
- if (UNEXPECTED(old_execute_data->func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
+ if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE((zend_object*)old_execute_data->func->op_array.prototype);
}
object = Z_OBJ(old_execute_data->This);
LOAD_OPLINE();
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
- } else if (call_kind == ZEND_CALL_NESTED_CODE) {
+ } else if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_CODE) {
zend_detach_symbol_table(execute_data);
destroy_op_array(&EX(func)->op_array);
efree_size(EX(func), sizeof(zend_op_array));
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
} else {
- if (call_kind == ZEND_CALL_TOP_FUNCTION) {
+ if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_TOP_FUNCTION) {
i_free_compiled_variables(execute_data);
if (UNEXPECTED(EX(symbol_table) != NULL)) {
zend_clean_and_cache_symbol_table(EX(symbol_table));
}
zend_vm_stack_free_extra_args(execute_data);
EG(current_execute_data) = EX(prev_execute_data);
- if (EX(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) {
+ if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
}
} else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
zend_class_entry *called_scope;
zend_object *object;
zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
GC_REFCOUNT(fbc->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
FREE_OP2();
} else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
FREE_OP2();
HANDLE_EXCEPTION();
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, object);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *object;
zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = GET_OP2_ZVAL_PTR(BP_VAR_R);
}
ZEND_ASSERT(GC_TYPE(func->common.prototype) == IS_OBJECT);
GC_REFCOUNT(func->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
called_scope = fcc.called_scope;
object = fcc.object;
object = NULL;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
func, opline->extended_value, called_scope, object);
call->prev_execute_data = EX(call);
EX(call) = call;
}
}
zend_internal_type_error(EX_USES_STRICT_TYPES(), "call_user_func_array() expects parameter 2 to be array, %s given", zend_get_type_by_const(Z_TYPE_P(args)));
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
EX(call)->func->common.scope ? "::" : "",
EX(call)->func->common.function_name->val);
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
EX(call)->func->common.scope ? "::" : "",
EX(call)->func->common.function_name->val);
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
{
zend_execute_data *old_execute_data;
- zend_call_kind call_kind = EX_CALL_KIND();
+ uint32_t call_info = EX_CALL_INFO();
- if (call_kind == ZEND_CALL_NESTED_FUNCTION) {
+ if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_FUNCTION) {
zend_object *object;
i_free_compiled_variables(execute_data);
zend_vm_stack_free_extra_args(execute_data);
old_execute_data = execute_data;
execute_data = EG(current_execute_data) = EX(prev_execute_data);
- if (UNEXPECTED(old_execute_data->func->op_array.fn_flags & ZEND_ACC_CLOSURE)) {
+ if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE((zend_object*)old_execute_data->func->op_array.prototype);
}
object = Z_OBJ(old_execute_data->This);
LOAD_OPLINE();
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
- } else if (call_kind == ZEND_CALL_NESTED_CODE) {
+ } else if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_NESTED_CODE) {
zend_detach_symbol_table(execute_data);
destroy_op_array(&EX(func)->op_array);
efree_size(EX(func), sizeof(zend_op_array));
ZEND_VM_INC_OPCODE();
ZEND_VM_LEAVE();
} else {
- if (call_kind == ZEND_CALL_TOP_FUNCTION) {
+ if (ZEND_CALL_KIND_EX(call_info) == ZEND_CALL_TOP_FUNCTION) {
i_free_compiled_variables(execute_data);
if (UNEXPECTED(EX(symbol_table) != NULL)) {
zend_clean_and_cache_symbol_table(EX(symbol_table));
}
zend_vm_stack_free_extra_args(execute_data);
EG(current_execute_data) = EX(prev_execute_data);
- if (EX(func)->op_array.fn_flags & ZEND_ACC_CLOSURE) {
+ if (UNEXPECTED(call_info & ZEND_CALL_CLOSURE)) {
OBJ_RELEASE((zend_object*)EX(func)->op_array.prototype);
}
} else /* if (call_kind == ZEND_CALL_TOP_CODE) */ {
}
}
zend_internal_type_error(EX_USES_STRICT_TYPES(), "call_user_func_array() expects parameter 2 to be array, %s given", zend_get_type_by_const(Z_TYPE_P(args)));
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
EX(call)->func->common.scope ? "::" : "",
EX(call)->func->common.function_name->val);
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
zend_class_entry *called_scope;
zend_object *object;
zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = EX_CONSTANT(opline->op2);
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
GC_REFCOUNT(fbc->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
} else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
HANDLE_EXCEPTION();
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, object);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *object;
zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
GC_REFCOUNT(fbc->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
} else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
HANDLE_EXCEPTION();
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, object);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *object;
zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
/* Delay closure destruction until its invocation */
ZEND_ASSERT(GC_TYPE(fbc->common.prototype) == IS_OBJECT);
GC_REFCOUNT(fbc->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
zval_ptr_dtor_nogc(free_op2);
} else if (EXPECTED(Z_TYPE_P(function_name) == IS_ARRAY) &&
zval_ptr_dtor_nogc(free_op2);
HANDLE_EXCEPTION();
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
fbc, opline->extended_value, called_scope, object);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *object;
zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = EX_CONSTANT(opline->op2);
}
ZEND_ASSERT(GC_TYPE(func->common.prototype) == IS_OBJECT);
GC_REFCOUNT(func->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
called_scope = fcc.called_scope;
object = fcc.object;
object = NULL;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
func, opline->extended_value, called_scope, object);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *object;
zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var);
}
ZEND_ASSERT(GC_TYPE(func->common.prototype) == IS_OBJECT);
GC_REFCOUNT(func->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
called_scope = fcc.called_scope;
object = fcc.object;
object = NULL;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
func, opline->extended_value, called_scope, object);
call->prev_execute_data = EX(call);
EX(call) = call;
zend_class_entry *called_scope;
zend_object *object;
zend_execute_data *call;
+ uint32_t call_info = ZEND_CALL_NESTED_FUNCTION;
SAVE_OPLINE();
function_name = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2);
}
ZEND_ASSERT(GC_TYPE(func->common.prototype) == IS_OBJECT);
GC_REFCOUNT(func->common.prototype)++;
+ call_info |= ZEND_CALL_CLOSURE;
}
called_scope = fcc.called_scope;
object = fcc.object;
object = NULL;
}
- call = zend_vm_stack_push_call_frame(ZEND_CALL_NESTED_FUNCTION,
+ call = zend_vm_stack_push_call_frame(call_info,
func, opline->extended_value, called_scope, object);
call->prev_execute_data = EX(call);
EX(call) = call;
EX(call)->func->common.scope ? "::" : "",
EX(call)->func->common.function_name->val);
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {
EX(call)->func->common.scope ? "::" : "",
EX(call)->func->common.function_name->val);
- if (EX(call)->func->common.fn_flags & ZEND_ACC_CLOSURE) {
+ if (ZEND_CALL_INFO(EX(call)) & ZEND_CALL_CLOSURE) {
OBJ_RELEASE((zend_object*)EX(call)->func->common.prototype);
}
if (Z_OBJ(EX(call)->This)) {