summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2019-10-08 17:34:25 +0200
committerNikita Popov <nikita.ppv@gmail.com>2019-10-08 17:34:25 +0200
commita32f130f9420a876381b7f9042855dad9445bbef (patch)
treecd7d5ed4e2450e6e0bc34ccf035316ef55f6923b
parent7c1bc91e527cc64341ff581703be35b2391139ad (diff)
parentbea832cbf6b7a06ee65b93902233864c1ac9ec98 (diff)
downloadphp-git-a32f130f9420a876381b7f9042855dad9445bbef.tar.gz
Merge branch 'PHP-7.4'
-rw-r--r--Zend/zend_compile.c12
-rw-r--r--Zend/zend_vm_def.h14
-rw-r--r--Zend/zend_vm_execute.h14
3 files changed, 23 insertions, 17 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index b169093de5..57ec932310 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -5456,10 +5456,6 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
op_array->required_num_args = i + 1;
}
- opline = zend_emit_op(NULL, opcode, NULL, &default_node);
- SET_NODE(opline->result, &var_node);
- opline->op1.num = i + 1;
-
arg_info = &arg_infos[i];
arg_info->name = zend_string_copy(name);
arg_info->pass_by_reference = is_ref;
@@ -5490,9 +5486,15 @@ void zend_compile_params(zend_ast *ast, zend_ast *return_type_ast) /* {{{ */
zend_get_type_by_const(default_type),
ZSTR_VAL(name), ZSTR_VAL(type_str));
}
+ }
+ opline = zend_emit_op(NULL, opcode, NULL, &default_node);
+ SET_NODE(opline->result, &var_node);
+ opline->op1.num = i + 1;
+
+ if (type_ast) {
/* Allocate cache slot to speed-up run-time class resolution */
- if (is_class) {
+ if (ZEND_TYPE_IS_CLASS(arg_info->type)) {
opline->extended_value = zend_alloc_cache_slot();
}
}
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index b1927d280c..b2ea3fefd5 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -5114,15 +5114,17 @@ ZEND_VM_HOT_HANDLER(64, ZEND_RECV_INIT, NUM, CONST, CACHE_SLOT)
ZVAL_COPY_VALUE(cache_val, param);
}
}
+ ZEND_VM_C_GOTO(recv_init_check_type);
} else {
ZVAL_COPY(param, default_value);
}
- }
-
- if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
- HANDLE_EXCEPTION();
+ } else {
+ZEND_VM_C_LABEL(recv_init_check_type):
+ if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
+ HANDLE_EXCEPTION();
+ }
}
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 3e01ae36b3..ffd3ede581 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -2970,15 +2970,17 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_RECV_INIT_SPEC_CON
ZVAL_COPY_VALUE(cache_val, param);
}
}
+ goto recv_init_check_type;
} else {
ZVAL_COPY(param, default_value);
}
- }
-
- if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
- SAVE_OPLINE();
- if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
- HANDLE_EXCEPTION();
+ } else {
+recv_init_check_type:
+ if (UNEXPECTED((EX(func)->op_array.fn_flags & ZEND_ACC_HAS_TYPE_HINTS) != 0)) {
+ SAVE_OPLINE();
+ if (UNEXPECTED(!zend_verify_recv_arg_type(EX(func), arg_num, param, CACHE_ADDR(opline->extended_value)))) {
+ HANDLE_EXCEPTION();
+ }
}
}