diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2019-10-08 17:34:25 +0200 |
|---|---|---|
| committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-10-08 17:34:25 +0200 |
| commit | a32f130f9420a876381b7f9042855dad9445bbef (patch) | |
| tree | cd7d5ed4e2450e6e0bc34ccf035316ef55f6923b | |
| parent | 7c1bc91e527cc64341ff581703be35b2391139ad (diff) | |
| parent | bea832cbf6b7a06ee65b93902233864c1ac9ec98 (diff) | |
| download | php-git-a32f130f9420a876381b7f9042855dad9445bbef.tar.gz | |
Merge branch 'PHP-7.4'
| -rw-r--r-- | Zend/zend_compile.c | 12 | ||||
| -rw-r--r-- | Zend/zend_vm_def.h | 14 | ||||
| -rw-r--r-- | Zend/zend_vm_execute.h | 14 |
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(); + } } } |
