Skip to content

Commit ed55693

Browse files
authored
Extract call_level conditions out to separate functions (#16949)
These are repeated a couple of times, so centralise it in 2 functions to reduce repetition and make updating this less error-prone.
1 parent 8206de6 commit ed55693

File tree

2 files changed

+51
-77
lines changed

2 files changed

+51
-77
lines changed

ext/opcache/jit/zend_jit.c

Lines changed: 40 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -727,6 +727,38 @@ ZEND_EXT_API void zend_jit_status(zval *ret)
727727
add_assoc_zval(ret, "jit", &stats);
728728
}
729729

730+
static bool zend_jit_inc_call_level(uint8_t opcode)
731+
{
732+
switch (opcode) {
733+
case ZEND_INIT_FCALL:
734+
case ZEND_INIT_FCALL_BY_NAME:
735+
case ZEND_INIT_NS_FCALL_BY_NAME:
736+
case ZEND_INIT_METHOD_CALL:
737+
case ZEND_INIT_DYNAMIC_CALL:
738+
case ZEND_INIT_STATIC_METHOD_CALL:
739+
case ZEND_INIT_PARENT_PROPERTY_HOOK_CALL:
740+
case ZEND_INIT_USER_CALL:
741+
case ZEND_NEW:
742+
return true;
743+
default:
744+
return false;
745+
}
746+
}
747+
748+
static bool zend_jit_dec_call_level(uint8_t opcode)
749+
{
750+
switch (opcode) {
751+
case ZEND_DO_FCALL:
752+
case ZEND_DO_ICALL:
753+
case ZEND_DO_UCALL:
754+
case ZEND_DO_FCALL_BY_NAME:
755+
case ZEND_CALLABLE_CONVERT:
756+
return true;
757+
default:
758+
return false;
759+
}
760+
}
761+
730762
static zend_string *zend_jit_func_name(const zend_op_array *op_array)
731763
{
732764
smart_str buf = {0};
@@ -1463,17 +1495,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
14631495
for (i = ssa->cfg.blocks[b].start; i <= end; i++) {
14641496
zend_ssa_op *ssa_op = ssa->ops ? &ssa->ops[i] : NULL;
14651497
opline = op_array->opcodes + i;
1466-
switch (opline->opcode) {
1467-
case ZEND_INIT_FCALL:
1468-
case ZEND_INIT_FCALL_BY_NAME:
1469-
case ZEND_INIT_NS_FCALL_BY_NAME:
1470-
case ZEND_INIT_METHOD_CALL:
1471-
case ZEND_INIT_DYNAMIC_CALL:
1472-
case ZEND_INIT_STATIC_METHOD_CALL:
1473-
case ZEND_INIT_PARENT_PROPERTY_HOOK_CALL:
1474-
case ZEND_INIT_USER_CALL:
1475-
case ZEND_NEW:
1476-
call_level++;
1498+
if (zend_jit_inc_call_level(opline->opcode)) {
1499+
call_level++;
14771500
}
14781501

14791502
if (JIT_G(opt_level) >= ZEND_JIT_LEVEL_INLINE) {
@@ -2582,25 +2605,10 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
25822605
i++;
25832606
for (; i < end; i++) {
25842607
opline = op_array->opcodes + i;
2585-
switch (opline->opcode) {
2586-
case ZEND_INIT_FCALL:
2587-
case ZEND_INIT_FCALL_BY_NAME:
2588-
case ZEND_INIT_NS_FCALL_BY_NAME:
2589-
case ZEND_INIT_METHOD_CALL:
2590-
case ZEND_INIT_DYNAMIC_CALL:
2591-
case ZEND_INIT_STATIC_METHOD_CALL:
2592-
case ZEND_INIT_PARENT_PROPERTY_HOOK_CALL:
2593-
case ZEND_INIT_USER_CALL:
2594-
case ZEND_NEW:
2595-
call_level++;
2596-
break;
2597-
case ZEND_DO_FCALL:
2598-
case ZEND_DO_ICALL:
2599-
case ZEND_DO_UCALL:
2600-
case ZEND_DO_FCALL_BY_NAME:
2601-
case ZEND_CALLABLE_CONVERT:
2602-
call_level--;
2603-
break;
2608+
if (zend_jit_inc_call_level(opline->opcode)) {
2609+
call_level++;
2610+
} else if (zend_jit_dec_call_level(opline->opcode)) {
2611+
call_level--;
26042612
}
26052613
}
26062614
opline = op_array->opcodes + i;
@@ -2715,13 +2723,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
27152723
}
27162724
}
27172725
done:
2718-
switch (opline->opcode) {
2719-
case ZEND_DO_FCALL:
2720-
case ZEND_DO_ICALL:
2721-
case ZEND_DO_UCALL:
2722-
case ZEND_DO_FCALL_BY_NAME:
2723-
case ZEND_CALLABLE_CONVERT:
2724-
call_level--;
2726+
if (zend_jit_dec_call_level(opline->opcode)) {
2727+
call_level--;
27252728
}
27262729
}
27272730
zend_jit_bb_end(&ctx, b);

ext/opcache/jit/zend_jit_trace.c

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1164,28 +1164,13 @@ static const zend_op *zend_jit_trace_find_init_fcall_op(zend_jit_trace_rec *p, c
11641164
if (opline) {
11651165
while (opline > op_array->opcodes) {
11661166
opline--;
1167-
switch (opline->opcode) {
1168-
case ZEND_INIT_FCALL:
1169-
case ZEND_INIT_FCALL_BY_NAME:
1170-
case ZEND_INIT_NS_FCALL_BY_NAME:
1171-
case ZEND_INIT_METHOD_CALL:
1172-
case ZEND_INIT_DYNAMIC_CALL:
1173-
case ZEND_INIT_STATIC_METHOD_CALL:
1174-
case ZEND_INIT_PARENT_PROPERTY_HOOK_CALL:
1175-
case ZEND_INIT_USER_CALL:
1176-
case ZEND_NEW:
1177-
if (call_level == 0) {
1178-
return opline;
1179-
}
1180-
call_level--;
1181-
break;
1182-
case ZEND_DO_FCALL:
1183-
case ZEND_DO_ICALL:
1184-
case ZEND_DO_UCALL:
1185-
case ZEND_DO_FCALL_BY_NAME:
1186-
case ZEND_CALLABLE_CONVERT:
1187-
call_level++;
1188-
break;
1167+
if (zend_jit_inc_call_level(opline->opcode)) {
1168+
if (call_level == 0) {
1169+
return opline;
1170+
}
1171+
call_level--;
1172+
} else if (zend_jit_dec_call_level(opline->opcode)) {
1173+
call_level++;
11891174
}
11901175
}
11911176
}
@@ -4394,17 +4379,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
43944379

43954380
frame_flags = 0;
43964381

4397-
switch (opline->opcode) {
4398-
case ZEND_INIT_FCALL:
4399-
case ZEND_INIT_FCALL_BY_NAME:
4400-
case ZEND_INIT_NS_FCALL_BY_NAME:
4401-
case ZEND_INIT_METHOD_CALL:
4402-
case ZEND_INIT_DYNAMIC_CALL:
4403-
case ZEND_INIT_STATIC_METHOD_CALL:
4404-
case ZEND_INIT_PARENT_PROPERTY_HOOK_CALL:
4405-
case ZEND_INIT_USER_CALL:
4406-
case ZEND_NEW:
4407-
frame->call_level++;
4382+
if (zend_jit_inc_call_level(opline->opcode)) {
4383+
frame->call_level++;
44084384
}
44094385

44104386
if (JIT_G(opt_level) >= ZEND_JIT_LEVEL_INLINE) {
@@ -6426,13 +6402,8 @@ static const void *zend_jit_trace(zend_jit_trace_rec *trace_buffer, uint32_t par
64266402

64276403
done:
64286404
polymorphic_side_trace = 0;
6429-
switch (opline->opcode) {
6430-
case ZEND_DO_FCALL:
6431-
case ZEND_DO_ICALL:
6432-
case ZEND_DO_UCALL:
6433-
case ZEND_DO_FCALL_BY_NAME:
6434-
case ZEND_CALLABLE_CONVERT:
6435-
frame->call_level--;
6405+
if (zend_jit_dec_call_level(opline->opcode)) {
6406+
frame->call_level--;
64366407
}
64376408

64386409
if (ra) {

0 commit comments

Comments
 (0)