mirror of
https://github.com/php/php-src.git
synced 2024-09-22 02:17:32 +00:00
Move check for named params in fcall optimization earlier
I don't think this is strictly necessary, but I think it makes sense to check this before interpreting opline->op2.num as an argument number. This also adds one more has_known_send_mode() check that I had missed before.
This commit is contained in:
parent
11f950e77e
commit
18b4e36df1
@ -249,8 +249,8 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
||||
case ZEND_FETCH_STATIC_PROP_FUNC_ARG:
|
||||
case ZEND_FETCH_OBJ_FUNC_ARG:
|
||||
case ZEND_FETCH_DIM_FUNC_ARG:
|
||||
if (call_stack[call - 1].func
|
||||
&& call_stack[call - 1].func_arg_num != (uint32_t)-1) {
|
||||
if (call_stack[call - 1].func_arg_num != (uint32_t)-1
|
||||
&& has_known_send_mode(&call_stack[call - 1], call_stack[call - 1].func_arg_num)) {
|
||||
if (ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, call_stack[call - 1].func_arg_num)) {
|
||||
if (opline->opcode != ZEND_FETCH_STATIC_PROP_FUNC_ARG) {
|
||||
opline->opcode -= 9;
|
||||
@ -275,12 +275,12 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
||||
}
|
||||
break;
|
||||
case ZEND_SEND_VAL_EX:
|
||||
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
|
||||
if (opline->op2_type == IS_CONST) {
|
||||
call_stack[call - 1].try_inline = 0;
|
||||
break;
|
||||
}
|
||||
if (opline->op2_type == IS_CONST) {
|
||||
call_stack[call - 1].try_inline = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
|
||||
if (ARG_MUST_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
|
||||
/* We won't convert it into_DO_FCALL to emit error at run-time */
|
||||
call_stack[call - 1].opline = NULL;
|
||||
@ -290,25 +290,25 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
||||
}
|
||||
break;
|
||||
case ZEND_CHECK_FUNC_ARG:
|
||||
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
|
||||
if (opline->op2_type == IS_CONST) {
|
||||
call_stack[call - 1].try_inline = 0;
|
||||
call_stack[call - 1].func_arg_num = (uint32_t)-1;
|
||||
break;
|
||||
}
|
||||
if (opline->op2_type == IS_CONST) {
|
||||
call_stack[call - 1].try_inline = 0;
|
||||
call_stack[call - 1].func_arg_num = (uint32_t)-1;
|
||||
break;
|
||||
}
|
||||
|
||||
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
|
||||
call_stack[call - 1].func_arg_num = opline->op2.num;
|
||||
MAKE_NOP(opline);
|
||||
}
|
||||
break;
|
||||
case ZEND_SEND_VAR_EX:
|
||||
case ZEND_SEND_FUNC_ARG:
|
||||
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
|
||||
if (opline->op2_type == IS_CONST) {
|
||||
call_stack[call - 1].try_inline = 0;
|
||||
break;
|
||||
}
|
||||
if (opline->op2_type == IS_CONST) {
|
||||
call_stack[call - 1].try_inline = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
|
||||
call_stack[call - 1].func_arg_num = (uint32_t)-1;
|
||||
if (ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
|
||||
opline->opcode = ZEND_SEND_REF;
|
||||
@ -318,12 +318,12 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
|
||||
}
|
||||
break;
|
||||
case ZEND_SEND_VAR_NO_REF_EX:
|
||||
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
|
||||
if (opline->op2_type == IS_CONST) {
|
||||
call_stack[call - 1].try_inline = 0;
|
||||
break;
|
||||
}
|
||||
if (opline->op2_type == IS_CONST) {
|
||||
call_stack[call - 1].try_inline = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
|
||||
if (ARG_MUST_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
|
||||
opline->opcode = ZEND_SEND_VAR_NO_REF;
|
||||
} else if (ARG_MAY_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
|
||||
|
Loading…
Reference in New Issue
Block a user