Skip to content

Commit 33b5c02

Browse files
committed
Extract zend_foreach_op_array()
Move this functionality from zend_call_graph into zend_optimizer, because we use this pattern in a number of places.
1 parent d377467 commit 33b5c02

File tree

3 files changed

+52
-103
lines changed

3 files changed

+52
-103
lines changed

ext/opcache/Optimizer/zend_call_graph.c

Lines changed: 7 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -27,18 +27,15 @@
2727
#include "zend_inference.h"
2828
#include "zend_call_graph.h"
2929

30-
typedef int (*zend_op_array_func_t)(zend_call_graph *call_graph, zend_op_array *op_array);
31-
32-
static int zend_op_array_calc(zend_call_graph *call_graph, zend_op_array *op_array)
30+
static void zend_op_array_calc(zend_op_array *op_array, void *context)
3331
{
34-
(void) op_array;
35-
32+
zend_call_graph *call_graph = context;
3633
call_graph->op_arrays_count++;
37-
return SUCCESS;
3834
}
3935

40-
static int zend_op_array_collect(zend_call_graph *call_graph, zend_op_array *op_array)
36+
static void zend_op_array_collect(zend_op_array *op_array, void *context)
4137
{
38+
zend_call_graph *call_graph = context;
4239
zend_func_info *func_info = call_graph->func_infos + call_graph->op_arrays_count;
4340

4441
ZEND_SET_FUNC_INFO(op_array, func_info);
@@ -47,41 +44,6 @@ static int zend_op_array_collect(zend_call_graph *call_graph, zend_op_array *op_
4744
func_info->num_args = -1;
4845
func_info->return_value_used = -1;
4946
call_graph->op_arrays_count++;
50-
return SUCCESS;
51-
}
52-
53-
static int zend_foreach_op_array(zend_call_graph *call_graph, zend_script *script, zend_op_array_func_t func)
54-
{
55-
zend_class_entry *ce;
56-
zend_string *key;
57-
zend_op_array *op_array;
58-
59-
if (func(call_graph, &script->main_op_array) != SUCCESS) {
60-
return FAILURE;
61-
}
62-
63-
ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
64-
if (func(call_graph, op_array) != SUCCESS) {
65-
return FAILURE;
66-
}
67-
} ZEND_HASH_FOREACH_END();
68-
69-
ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
70-
if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) {
71-
continue;
72-
}
73-
ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) {
74-
if (op_array->scope == ce
75-
&& op_array->type == ZEND_USER_FUNCTION
76-
&& !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
77-
if (func(call_graph, op_array) != SUCCESS) {
78-
return FAILURE;
79-
}
80-
}
81-
} ZEND_HASH_FOREACH_END();
82-
} ZEND_HASH_FOREACH_END();
83-
84-
return SUCCESS;
8547
}
8648

8749
int zend_analyze_calls(zend_arena **arena, zend_script *script, uint32_t build_flags, zend_op_array *op_array, zend_func_info *func_info)
@@ -259,15 +221,12 @@ static void zend_sort_op_arrays(zend_call_graph *call_graph)
259221
int zend_build_call_graph(zend_arena **arena, zend_script *script, zend_call_graph *call_graph) /* {{{ */
260222
{
261223
call_graph->op_arrays_count = 0;
262-
if (zend_foreach_op_array(call_graph, script, zend_op_array_calc) != SUCCESS) {
263-
return FAILURE;
264-
}
224+
zend_foreach_op_array(script, zend_op_array_calc, call_graph);
225+
265226
call_graph->op_arrays = (zend_op_array**)zend_arena_calloc(arena, call_graph->op_arrays_count, sizeof(zend_op_array*));
266227
call_graph->func_infos = (zend_func_info*)zend_arena_calloc(arena, call_graph->op_arrays_count, sizeof(zend_func_info));
267228
call_graph->op_arrays_count = 0;
268-
if (zend_foreach_op_array(call_graph, script, zend_op_array_collect) != SUCCESS) {
269-
return FAILURE;
270-
}
229+
zend_foreach_op_array(script, zend_op_array_collect, call_graph);
271230

272231
return SUCCESS;
273232
}

ext/opcache/Optimizer/zend_optimizer.c

Lines changed: 42 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,6 +1333,44 @@ static zend_bool needs_live_range(zend_op_array *op_array, zend_op *def_opline)
13331333
return 1;
13341334
}
13351335

1336+
void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context)
1337+
{
1338+
zend_class_entry *ce;
1339+
zend_string *key;
1340+
zend_op_array *op_array;
1341+
1342+
func(&script->main_op_array, context);
1343+
1344+
ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
1345+
func(op_array, context);
1346+
} ZEND_HASH_FOREACH_END();
1347+
1348+
ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
1349+
if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) {
1350+
continue;
1351+
}
1352+
ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) {
1353+
if (op_array->scope == ce
1354+
&& op_array->type == ZEND_USER_FUNCTION
1355+
&& !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
1356+
func(op_array, context);
1357+
}
1358+
} ZEND_HASH_FOREACH_END();
1359+
} ZEND_HASH_FOREACH_END();
1360+
}
1361+
1362+
static void step_optimize_op_array(zend_op_array *op_array, void *context) {
1363+
zend_optimize_op_array(op_array, (zend_optimizer_ctx *) context);
1364+
}
1365+
1366+
static void step_adjust_fcall_stack_size(zend_op_array *op_array, void *context) {
1367+
zend_adjust_fcall_stack_size(op_array, (zend_optimizer_ctx *) context);
1368+
}
1369+
1370+
static void step_dump_after_optimizer(zend_op_array *op_array, void *context) {
1371+
zend_dump_op_array(op_array, ZEND_DUMP_LIVE_RANGES, "after optimizer", NULL);
1372+
}
1373+
13361374
int zend_optimize_script(zend_script *script, zend_long optimization_level, zend_long debug_level)
13371375
{
13381376
zend_class_entry *ce;
@@ -1441,44 +1479,10 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
14411479
ZEND_SET_FUNC_INFO(call_graph.op_arrays[i], NULL);
14421480
}
14431481
} else {
1444-
zend_optimize_op_array(&script->main_op_array, &ctx);
1445-
1446-
ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
1447-
zend_optimize_op_array(op_array, &ctx);
1448-
} ZEND_HASH_FOREACH_END();
1449-
1450-
ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
1451-
if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) {
1452-
continue;
1453-
}
1454-
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
1455-
if (op_array->scope == ce
1456-
&& op_array->type == ZEND_USER_FUNCTION
1457-
&& !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
1458-
zend_optimize_op_array(op_array, &ctx);
1459-
}
1460-
} ZEND_HASH_FOREACH_END();
1461-
} ZEND_HASH_FOREACH_END();
1482+
zend_foreach_op_array(script, step_optimize_op_array, &ctx);
14621483

14631484
if (ZEND_OPTIMIZER_PASS_12 & optimization_level) {
1464-
zend_adjust_fcall_stack_size(&script->main_op_array, &ctx);
1465-
1466-
ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
1467-
zend_adjust_fcall_stack_size(op_array, &ctx);
1468-
} ZEND_HASH_FOREACH_END();
1469-
1470-
ZEND_HASH_FOREACH_STR_KEY_PTR(&script->class_table, key, ce) {
1471-
if (ce->refcount > 1 && !zend_string_equals_ci(key, ce->name)) {
1472-
continue;
1473-
}
1474-
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
1475-
if (op_array->scope == ce
1476-
&& op_array->type == ZEND_USER_FUNCTION
1477-
&& !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
1478-
zend_adjust_fcall_stack_size(op_array, &ctx);
1479-
}
1480-
} ZEND_HASH_FOREACH_END();
1481-
} ZEND_HASH_FOREACH_END();
1485+
zend_foreach_op_array(script, step_adjust_fcall_stack_size, &ctx);
14821486
}
14831487
}
14841488

@@ -1507,25 +1511,8 @@ int zend_optimize_script(zend_script *script, zend_long optimization_level, zend
15071511
} ZEND_HASH_FOREACH_END();
15081512

15091513
if ((debug_level & ZEND_DUMP_AFTER_OPTIMIZER) &&
1510-
(ZEND_OPTIMIZER_PASS_7 & optimization_level)) {
1511-
zend_dump_op_array(&script->main_op_array,
1512-
ZEND_DUMP_LIVE_RANGES, "after optimizer", NULL);
1513-
1514-
ZEND_HASH_FOREACH_PTR(&script->function_table, op_array) {
1515-
zend_dump_op_array(op_array,
1516-
ZEND_DUMP_LIVE_RANGES, "after optimizer", NULL);
1517-
} ZEND_HASH_FOREACH_END();
1518-
1519-
ZEND_HASH_FOREACH_PTR(&script->class_table, ce) {
1520-
ZEND_HASH_FOREACH_STR_KEY_PTR(&ce->function_table, name, op_array) {
1521-
if (op_array->scope == ce
1522-
&& op_array->type == ZEND_USER_FUNCTION
1523-
&& !(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
1524-
zend_dump_op_array(op_array,
1525-
ZEND_DUMP_LIVE_RANGES, "after optimizer", NULL);
1526-
}
1527-
} ZEND_HASH_FOREACH_END();
1528-
} ZEND_HASH_FOREACH_END();
1514+
(ZEND_OPTIMIZER_PASS_7 & optimization_level)) {
1515+
zend_foreach_op_array(script, step_dump_after_optimizer, NULL);
15291516
}
15301517

15311518
if (ctx.constants) {

ext/opcache/Optimizer/zend_optimizer_internal.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,4 +117,7 @@ int sccp_optimize_op_array(zend_optimizer_ctx *ctx, zend_op_array *op_arrya, zen
117117
int dce_optimize_op_array(zend_op_array *op_array, zend_ssa *ssa, zend_bool reorder_dtor_effects);
118118
int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa);
119119

120+
typedef void (*zend_op_array_func_t)(zend_op_array *, void *context);
121+
void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context);
122+
120123
#endif

0 commit comments

Comments
 (0)