Skip to content

Commit 752d64c

Browse files
committed
Review feedback
1 parent 0e41701 commit 752d64c

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

Zend/Optimizer/optimize_func_calls.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
typedef struct _optimizer_call_info {
3939
zend_function *func;
4040
zend_op *opline;
41-
zend_op *check_func_arg_opline;
41+
zend_op *last_check_func_arg_opline;
4242
bool is_prototype;
4343
bool try_inline;
4444
uint32_t func_arg_num;
@@ -255,9 +255,10 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
255255
if (ARG_SHOULD_BE_SENT_BY_REF(call_stack[call - 1].func, call_stack[call - 1].func_arg_num)) {
256256
/* There's no TMP specialization for FETCH_OBJ_W/FETCH_DIM_W. Avoid
257257
* converting it and error at runtime in the FUNC_ARG variant. */
258-
if ((opline->opcode == ZEND_FETCH_OBJ_FUNC_ARG || opline->opcode == ZEND_FETCH_DIM_FUNC_ARG) && opline->op1_type == IS_TMP_VAR) {
258+
if ((opline->opcode == ZEND_FETCH_OBJ_FUNC_ARG || opline->opcode == ZEND_FETCH_DIM_FUNC_ARG)
259+
&& (opline->op1_type == IS_TMP_VAR || call_stack[call - 1].last_check_func_arg_opline == NULL)) {
259260
/* Don't remove the associated CHECK_FUNC_ARG opcode. */
260-
call_stack[call - 1].check_func_arg_opline = NULL;
261+
call_stack[call - 1].last_check_func_arg_opline = NULL;
261262
break;
262263
}
263264
if (opline->opcode != ZEND_FETCH_STATIC_PROP_FUNC_ARG) {
@@ -280,7 +281,7 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
280281
opline->opcode = ZEND_FETCH_STATIC_PROP_R;
281282
}
282283
}
283-
MAKE_NOP(call_stack[call - 1].check_func_arg_opline);
284+
MAKE_NOP(call_stack[call - 1].last_check_func_arg_opline);
284285
}
285286
break;
286287
case ZEND_SEND_VAL_EX:
@@ -307,11 +308,17 @@ void zend_optimize_func_calls(zend_op_array *op_array, zend_optimizer_ctx *ctx)
307308

308309
if (has_known_send_mode(&call_stack[call - 1], opline->op2.num)) {
309310
call_stack[call - 1].func_arg_num = opline->op2.num;
310-
call_stack[call - 1].check_func_arg_opline = opline;
311+
call_stack[call - 1].last_check_func_arg_opline = opline;
311312
}
312313
break;
313-
case ZEND_SEND_VAR_EX:
314314
case ZEND_SEND_FUNC_ARG:
315+
/* Don't transform SEND_FUNC_ARG if any FETCH opcodes weren't transformed. */
316+
if (call_stack[call - 1].last_check_func_arg_opline == NULL) {
317+
break;
318+
}
319+
call_stack[call - 1].last_check_func_arg_opline = NULL;
320+
ZEND_FALLTHROUGH;
321+
case ZEND_SEND_VAR_EX:
315322
if (opline->op2_type == IS_CONST) {
316323
call_stack[call - 1].try_inline = 0;
317324
break;

0 commit comments

Comments
 (0)