Skip to content

Commit 18b4e36

Browse files
committed
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.
1 parent 11f950e commit 18b4e36

File tree

1 file changed

+23
-23
lines changed

1 file changed

+23
-23
lines changed

Zend/Optimizer/optimize_func_calls.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,8 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
249249
case ZEND_FETCH_STATIC_PROP_FUNC_ARG:
250250
case ZEND_FETCH_OBJ_FUNC_ARG:
251251
case ZEND_FETCH_DIM_FUNC_ARG:
252-
if (call_stack[call - 1].func
253-
&& call_stack[call - 1].func_arg_num != (uint32_t)-1) {
252+
if (call_stack[call - 1].func_arg_num != (uint32_t)-1
253+
&& has_known_send_mode(&call_stack[call - 1], call_stack[call - 1].func_arg_num)) {
254254
if (ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, call_stack[call - 1].func_arg_num)) {
255255
if (opline->opcode != ZEND_FETCH_STATIC_PROP_FUNC_ARG) {
256256
opline->opcode -= 9;
@@ -275,12 +275,12 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
275275
}
276276
break;
277277
case ZEND_SEND_VAL_EX:
278-
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
279-
if (opline->op2_type == IS_CONST) {
280-
call_stack[call - 1].try_inline = 0;
281-
break;
282-
}
278+
if (opline->op2_type == IS_CONST) {
279+
call_stack[call - 1].try_inline = 0;
280+
break;
281+
}
283282

283+
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
284284
if (ARG_MUST_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
285285
/* We won't convert it into_DO_FCALL to emit error at run-time */
286286
call_stack[call - 1].opline = NULL;
@@ -290,25 +290,25 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
290290
}
291291
break;
292292
case ZEND_CHECK_FUNC_ARG:
293-
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
294-
if (opline->op2_type == IS_CONST) {
295-
call_stack[call - 1].try_inline = 0;
296-
call_stack[call - 1].func_arg_num = (uint32_t)-1;
297-
break;
298-
}
293+
if (opline->op2_type == IS_CONST) {
294+
call_stack[call - 1].try_inline = 0;
295+
call_stack[call - 1].func_arg_num = (uint32_t)-1;
296+
break;
297+
}
299298

299+
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
300300
call_stack[call - 1].func_arg_num = opline->op2.num;
301301
MAKE_NOP(opline);
302302
}
303303
break;
304304
case ZEND_SEND_VAR_EX:
305305
case ZEND_SEND_FUNC_ARG:
306-
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
307-
if (opline->op2_type == IS_CONST) {
308-
call_stack[call - 1].try_inline = 0;
309-
break;
310-
}
306+
if (opline->op2_type == IS_CONST) {
307+
call_stack[call - 1].try_inline = 0;
308+
break;
309+
}
311310

311+
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
312312
call_stack[call - 1].func_arg_num = (uint32_t)-1;
313313
if (ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
314314
opline->opcode = ZEND_SEND_REF;
@@ -318,12 +318,12 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
318318
}
319319
break;
320320
case ZEND_SEND_VAR_NO_REF_EX:
321-
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
322-
if (opline->op2_type == IS_CONST) {
323-
call_stack[call - 1].try_inline = 0;
324-
break;
325-
}
321+
if (opline->op2_type == IS_CONST) {
322+
call_stack[call - 1].try_inline = 0;
323+
break;
324+
}
326325

326+
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
327327
if (ARG_MUST_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {
328328
opline->opcode = ZEND_SEND_VAR_NO_REF;
329329
} else if (ARG_MAY_BE_SENT_BY_REF(call_stack[call - 1].func, opline->op2.num)) {

0 commit comments

Comments
 (0)