zend_hash_str_update(closure->debug_info, "this", sizeof("this")-1, &closure->this_ptr);
}
- if (arg_info) {
- if (arg_info && closure->func.common.num_args) {
++ if (arg_info &&
++ (closure->func.common.num_args ||
++ (closure->func.common.fn_flags & ZEND_ACC_VARIADIC))) {
uint32_t i, num_args, required = closure->func.common.required_num_args;
array_init(&val);
opline->op1.var = CG(context).fast_call_var;
}
+ if (CG(active_op_array)->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
+ zend_emit_return_type_check(&expr_node, CG(active_op_array)->arg_info - 1);
++ if (expr_node.op_type == IS_CONST) {
++ zval_copy_ctor(&expr_node.u.constant);
++ }
+ }
opline = zend_emit_op(NULL, by_ref ? ZEND_RETURN_BY_REF : ZEND_RETURN,
&expr_node, NULL);
zend_llist_apply_with_argument(&zend_extensions, (llist_apply_with_arg_func_t) zend_extension_op_array_dtor_handler, op_array);
}
if (op_array->arg_info) {
- uint32_t num_args = op_array->num_args;
+ int32_t num_args = op_array->num_args;
- int32_t i = op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE ? -1 : 0;
++ zend_arg_info *arg_info = op_array->arg_info;
++ int32_t i;
++ if (op_array->fn_flags & ZEND_ACC_HAS_RETURN_TYPE) {
++ arg_info--;
++ num_args++;
++ }
if (op_array->fn_flags & ZEND_ACC_VARIADIC) {
num_args++;
}
- for (i = 0; i < num_args; i++) {
- for ( ; i < num_args; i++) {
-- zend_string_release(op_array->arg_info[i].name);
-- if (op_array->arg_info[i].class_name) {
-- zend_string_release(op_array->arg_info[i].class_name);
++ for (i = 0 ; i < num_args; i++) {
++ if (arg_info[i].name) {
++ zend_string_release(arg_info[i].name);
++ }
++ if (arg_info[i].class_name) {
++ zend_string_release(arg_info[i].class_name);
}
}
-- efree(op_array->arg_info);
++ efree(arg_info);
}
}