@@ -836,6 +836,38 @@ ZEND_EXT_API void zend_jit_status(zval *ret)
836836 add_assoc_zval (ret , "jit" , & stats );
837837}
838838
839+ static bool zend_jit_inc_call_level (uint8_t opcode )
840+ {
841+ switch (opcode ) {
842+ case ZEND_INIT_FCALL :
843+ case ZEND_INIT_FCALL_BY_NAME :
844+ case ZEND_INIT_NS_FCALL_BY_NAME :
845+ case ZEND_INIT_METHOD_CALL :
846+ case ZEND_INIT_DYNAMIC_CALL :
847+ case ZEND_INIT_STATIC_METHOD_CALL :
848+ case ZEND_INIT_PARENT_PROPERTY_HOOK_CALL :
849+ case ZEND_INIT_USER_CALL :
850+ case ZEND_NEW :
851+ return true;
852+ default :
853+ return false;
854+ }
855+ }
856+
857+ static bool zend_jit_dec_call_level (uint8_t opcode )
858+ {
859+ switch (opcode ) {
860+ case ZEND_DO_FCALL :
861+ case ZEND_DO_ICALL :
862+ case ZEND_DO_UCALL :
863+ case ZEND_DO_FCALL_BY_NAME :
864+ case ZEND_CALLABLE_CONVERT :
865+ return true;
866+ default :
867+ return false;
868+ }
869+ }
870+
839871static zend_string * zend_jit_func_name (const zend_op_array * op_array )
840872{
841873 smart_str buf = {0 };
@@ -1572,17 +1604,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
15721604 for (i = ssa -> cfg .blocks [b ].start ; i <= end ; i ++ ) {
15731605 zend_ssa_op * ssa_op = ssa -> ops ? & ssa -> ops [i ] : NULL ;
15741606 opline = op_array -> opcodes + i ;
1575- switch (opline -> opcode ) {
1576- case ZEND_INIT_FCALL :
1577- case ZEND_INIT_FCALL_BY_NAME :
1578- case ZEND_INIT_NS_FCALL_BY_NAME :
1579- case ZEND_INIT_METHOD_CALL :
1580- case ZEND_INIT_DYNAMIC_CALL :
1581- case ZEND_INIT_STATIC_METHOD_CALL :
1582- case ZEND_INIT_PARENT_PROPERTY_HOOK_CALL :
1583- case ZEND_INIT_USER_CALL :
1584- case ZEND_NEW :
1585- call_level ++ ;
1607+ if (zend_jit_inc_call_level (opline -> opcode )) {
1608+ call_level ++ ;
15861609 }
15871610
15881611 if (JIT_G (opt_level ) >= ZEND_JIT_LEVEL_INLINE ) {
@@ -2720,25 +2743,10 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
27202743 i ++ ;
27212744 for (; i < end ; i ++ ) {
27222745 opline = op_array -> opcodes + i ;
2723- switch (opline -> opcode ) {
2724- case ZEND_INIT_FCALL :
2725- case ZEND_INIT_FCALL_BY_NAME :
2726- case ZEND_INIT_NS_FCALL_BY_NAME :
2727- case ZEND_INIT_METHOD_CALL :
2728- case ZEND_INIT_DYNAMIC_CALL :
2729- case ZEND_INIT_STATIC_METHOD_CALL :
2730- case ZEND_INIT_PARENT_PROPERTY_HOOK_CALL :
2731- case ZEND_INIT_USER_CALL :
2732- case ZEND_NEW :
2733- call_level ++ ;
2734- break ;
2735- case ZEND_DO_FCALL :
2736- case ZEND_DO_ICALL :
2737- case ZEND_DO_UCALL :
2738- case ZEND_DO_FCALL_BY_NAME :
2739- case ZEND_CALLABLE_CONVERT :
2740- call_level -- ;
2741- break ;
2746+ if (zend_jit_inc_call_level (opline -> opcode )) {
2747+ call_level ++ ;
2748+ } else if (zend_jit_dec_call_level (opline -> opcode )) {
2749+ call_level -- ;
27422750 }
27432751 }
27442752 opline = op_array -> opcodes + i ;
@@ -2853,13 +2861,8 @@ static int zend_jit(const zend_op_array *op_array, zend_ssa *ssa, const zend_op
28532861 }
28542862 }
28552863done :
2856- switch (opline -> opcode ) {
2857- case ZEND_DO_FCALL :
2858- case ZEND_DO_ICALL :
2859- case ZEND_DO_UCALL :
2860- case ZEND_DO_FCALL_BY_NAME :
2861- case ZEND_CALLABLE_CONVERT :
2862- call_level -- ;
2864+ if (zend_jit_dec_call_level (opline -> opcode )) {
2865+ call_level -- ;
28632866 }
28642867 }
28652868 zend_jit_bb_end (& ctx , b );
0 commit comments