From 18b4e36df15747c6cbb8c119e50fcab2bf0e7cee Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 18 Apr 2022 18:20:38 +0200 Subject: [PATCH] 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. --- Zend/Optimizer/optimize_func_calls.c | 46 ++++++++++++++-------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/Zend/Optimizer/optimize_func_calls.c b/Zend/Optimizer/optimize_func_calls.c index 91ed11a4106..154baddc654 100644 --- a/Zend/Optimizer/optimize_func_calls.c +++ b/Zend/Optimizer/optimize_func_calls.c @@ -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)) {