59 while (opline !=
end) {
67 script, op_array, opline, &is_prototype);
75 call_info->next_callee = func_info->callee_info;
87 if (callee_func_info) {
119 call_info->next_callee = func_info->callee_info;
153 uint32_t num = opline->
op2.
num;
157 call_info->arg_info[num].opline = opline;
178 if (op_array == root) {
183 if (zend_bitset_in(visited, func_info->num)) {
186 zend_bitset_incl(visited, func_info->num);
189 if (zend_is_indirectly_recursive(root,
call_info->caller_op_array, visited)) {
218 if (
call_info->caller_op_array == op_array) {
223 if (zend_is_indirectly_recursive(op_array,
call_info->caller_op_array, visited)) {
260 zend_analyze_recursion(call_graph);
261 zend_sort_op_arrays(call_graph);
277 if (
call->caller_call_opline) {
280 if (!
call->is_frameless) {
281 for (i = 0; i <
call->num_args; i++) {
282 if (
call->arg_info[i].opline) {
memset(ptr, 0, type->size)
unsigned const char * end
zend_func_info * func_infos
zend_op_array ** op_arrays
zend_call_info * callee_info
zend_call_info * caller_info
struct _zend_arena zend_arena
#define ZEND_BITSET_ALLOCA(n, use_heap)
ZEND_API zend_call_info ** zend_build_call_map(zend_arena **arena, zend_func_info *info, const zend_op_array *op_array)
ZEND_API void zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info)
ZEND_API void zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph)
ZEND_API void zend_analyze_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph)
struct _zend_call_graph zend_call_graph
struct _zend_send_arg_info zend_send_arg_info
#define ZEND_INTERNAL_FUNCTION
struct _zend_op_array zend_op_array
ZEND_API void(ZEND_FASTCALL *zend_touch_vm_stack_data)(void *vm_stack_data)
union _zend_function zend_function
#define ZEND_FLF_NUM_ARGS(opcode)
#define ZEND_FLF_FUNC(opline)
#define ZEND_FUNC_HAS_CALLS
#define ZEND_FUNC_RECURSIVE_INDIRECTLY
#define ZEND_FUNC_RECURSIVE_DIRECTLY
struct _zend_call_info zend_call_info
#define ZEND_FUNC_INFO(op_array)
#define ZEND_FUNC_RECURSIVE
struct _zend_func_info zend_func_info
#define ZEND_SET_FUNC_INFO(op_array, info)
void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context)
zend_function * zend_optimizer_get_called_func(zend_script *script, zend_op_array *op_array, zend_op *opline, bool *is_prototype)
struct _zend_script zend_script
#define ALLOCA_FLAG(name)
#define do_alloca(p, use_heap)
#define free_alloca(p, use_heap)
#define ZEND_INIT_USER_CALL
#define ZEND_FRAMELESS_ICALL_0
#define ZEND_CALLABLE_CONVERT
#define ZEND_FRAMELESS_ICALL_1
#define ZEND_FRAMELESS_ICALL_3
#define ZEND_INIT_NS_FCALL_BY_NAME
#define ZEND_INIT_FCALL_BY_NAME
#define ZEND_FRAMELESS_ICALL_2
#define ZEND_SEND_VAR_NO_REF_EX
#define ZEND_SEND_FUNC_ARG
#define ZEND_INIT_DYNAMIC_CALL
#define ZEND_INIT_PARENT_PROPERTY_HOOK_CALL
#define ZEND_SEND_VAR_NO_REF
#define ZEND_DO_FCALL_BY_NAME
#define ZEND_INIT_METHOD_CALL
#define ZEND_INIT_STATIC_METHOD_CALL