@@ -73,6 +73,7 @@ ZEND_API void zend_analyze_calls(zend_arena **arena, zend_script *script, uint32
7373 call_info -> num_args = opline -> extended_value ;
7474 call_info -> next_callee = func_info -> callee_info ;
7575 call_info -> is_prototype = is_prototype ;
76+ call_info -> is_frameless = false;
7677 func_info -> callee_info = call_info ;
7778
7879 if (build_flags & ZEND_CALL_TREE ) {
@@ -102,6 +103,24 @@ ZEND_API void zend_analyze_calls(zend_arena **arena, zend_script *script, uint32
102103 call_info = NULL ;
103104 call ++ ;
104105 break ;
106+ case ZEND_FRAMELESS_ICALL_0 :
107+ case ZEND_FRAMELESS_ICALL_1 :
108+ case ZEND_FRAMELESS_ICALL_2 :
109+ case ZEND_FRAMELESS_ICALL_3 : {
110+ func = ZEND_FLF_FUNC (opline );
111+ zend_call_info * call_info = zend_arena_calloc (arena , 1 , sizeof (zend_call_info ));
112+ call_info -> caller_op_array = op_array ;
113+ call_info -> caller_init_opline = opline ;
114+ call_info -> caller_call_opline = NULL ;
115+ call_info -> callee_func = func ;
116+ call_info -> num_args = ZEND_FLF_NUM_ARGS (opline -> opcode );
117+ call_info -> next_callee = func_info -> callee_info ;
118+ call_info -> is_prototype = false;
119+ call_info -> is_frameless = true;
120+ call_info -> next_caller = NULL ;
121+ func_info -> callee_info = call_info ;
122+ break ;
123+ }
105124 case ZEND_DO_FCALL :
106125 case ZEND_DO_ICALL :
107126 case ZEND_DO_UCALL :
@@ -260,9 +279,11 @@ ZEND_API zend_call_info **zend_build_call_map(zend_arena **arena, zend_func_info
260279 if (call -> caller_call_opline ) {
261280 map [call -> caller_call_opline - op_array -> opcodes ] = call ;
262281 }
263- for (i = 0 ; i < call -> num_args ; i ++ ) {
264- if (call -> arg_info [i ].opline ) {
265- map [call -> arg_info [i ].opline - op_array -> opcodes ] = call ;
282+ if (!call -> is_frameless ) {
283+ for (i = 0 ; i < call -> num_args ; i ++ ) {
284+ if (call -> arg_info [i ].opline ) {
285+ map [call -> arg_info [i ].opline - op_array -> opcodes ] = call ;
286+ }
266287 }
267288 }
268289 }
0 commit comments