@@ -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+
730762static 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 }
27172725done :
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 );
0 commit comments