@@ -727,6 +727,38 @@ ZEND_EXT_API void zend_jit_status(zval *ret)
727
727
add_assoc_zval (ret , "jit" , & stats );
728
728
}
729
729
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
+
730
762
static zend_string * zend_jit_func_name (const zend_op_array * op_array )
731
763
{
732
764
smart_str buf = {0 };
@@ -1463,17 +1495,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
1463
1495
for (i = ssa -> cfg .blocks [b ].start ; i <= end ; i ++ ) {
1464
1496
zend_ssa_op * ssa_op = ssa -> ops ? & ssa -> ops [i ] : NULL ;
1465
1497
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 ++ ;
1477
1500
}
1478
1501
1479
1502
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
2582
2605
i ++ ;
2583
2606
for (; i < end ; i ++ ) {
2584
2607
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 -- ;
2604
2612
}
2605
2613
}
2606
2614
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
2715
2723
}
2716
2724
}
2717
2725
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 -- ;
2725
2728
}
2726
2729
}
2727
2730
zend_jit_bb_end (& ctx , b );
0 commit comments