summaryrefslogtreecommitdiff
path: root/ext/opcache/Optimizer/zend_call_graph.c
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2016-04-27 17:04:25 +0200
committerNikita Popov <nikic@php.net>2016-04-27 17:10:45 +0200
commitd94b9545d639dfddfacdd7fec75c7580dddda676 (patch)
tree4f2ab11ce3a55a99d1ffe674f15a2214d9fb94e8 /ext/opcache/Optimizer/zend_call_graph.c
parent4f54c15cb10dfd668538ae225fef59c82c66e96e (diff)
downloadphp-git-d94b9545d639dfddfacdd7fec75c7580dddda676.tar.gz
Support known static/method calls in call graph
For this purpose extract the function lookup call into a helper zend_optimizer_get_called_func().
Diffstat (limited to 'ext/opcache/Optimizer/zend_call_graph.c')
-rw-r--r--ext/opcache/Optimizer/zend_call_graph.c33
1 files changed, 14 insertions, 19 deletions
diff --git a/ext/opcache/Optimizer/zend_call_graph.c b/ext/opcache/Optimizer/zend_call_graph.c
index ef586e12a7..f245d14eaa 100644
--- a/ext/opcache/Optimizer/zend_call_graph.c
+++ b/ext/opcache/Optimizer/zend_call_graph.c
@@ -21,6 +21,8 @@
#include "php.h"
#include "zend_compile.h"
#include "zend_extensions.h"
+#include "Optimizer/zend_optimizer.h"
+#include "zend_optimizer_internal.h"
#include "zend_inference.h"
#include "zend_call_graph.h"
#include "zend_func_info.h"
@@ -150,39 +152,32 @@ static int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t
call_info = NULL;
switch (opline->opcode) {
case ZEND_INIT_FCALL:
- if ((func = zend_hash_find_ptr(&script->function_table, Z_STR_P(CRT_CONSTANT(opline->op2)))) != NULL) {
- zend_func_info *callee_func_info = ZEND_FUNC_INFO(&func->op_array);
- if (callee_func_info) {
- call_info = zend_arena_calloc(arena, 1, sizeof(zend_call_info) + (sizeof(zend_send_arg_info) * ((int)opline->extended_value - 1)));
- call_info->caller_op_array = op_array;
- call_info->caller_init_opline = opline;
- call_info->caller_call_opline = NULL;
- call_info->callee_func = func;
- call_info->num_args = opline->extended_value;
- call_info->next_caller = callee_func_info->caller_info;
- callee_func_info->caller_info = call_info;
- call_info->next_callee = func_info->callee_info;
- func_info->callee_info = call_info;
- }
- } else if ((func = zend_hash_find_ptr(EG(function_table), Z_STR_P(CRT_CONSTANT(opline->op2)))) != NULL &&
- func->type == ZEND_INTERNAL_FUNCTION) {
+ case ZEND_INIT_METHOD_CALL:
+ case ZEND_INIT_STATIC_METHOD_CALL:
+ func = zend_optimizer_get_called_func(
+ script, op_array, opline, (build_flags & ZEND_RT_CONSTANTS) != 0);
+ if (func) {
call_info = zend_arena_calloc(arena, 1, sizeof(zend_call_info) + (sizeof(zend_send_arg_info) * ((int)opline->extended_value - 1)));
call_info->caller_op_array = op_array;
call_info->caller_init_opline = opline;
call_info->caller_call_opline = NULL;
call_info->callee_func = func;
call_info->num_args = opline->extended_value;
- call_info->next_caller = NULL;
call_info->next_callee = func_info->callee_info;
func_info->callee_info = call_info;
+
+ if (func->type == ZEND_INTERNAL_FUNCTION) {
+ call_info->next_caller = NULL;
+ } else {
+ zend_func_info *callee_func_info = ZEND_FUNC_INFO(&func->op_array);
+ call_info->next_caller = callee_func_info->caller_info;
+ }
}
/* break missing intentionally */
case ZEND_INIT_FCALL_BY_NAME:
case ZEND_INIT_NS_FCALL_BY_NAME:
case ZEND_INIT_DYNAMIC_CALL:
case ZEND_NEW:
- case ZEND_INIT_METHOD_CALL:
- case ZEND_INIT_STATIC_METHOD_CALL:
case ZEND_INIT_USER_CALL:
call_stack[call] = call_info;
call++;