Skip to content

Commit 15990de

Browse files
authored
Refactor op array loops in JIT (#19335)
Reuse the helper zend_foreach_op_array() that we move to the zend_optimizer.h header to be usable in opcache. Note that applying this to other op_array loops is not easy because they either: - start from EG(persistent_classes_count) - or only apply to classes
1 parent 0afa04a commit 15990de

File tree

3 files changed

+8
-43
lines changed

3 files changed

+8
-43
lines changed

Zend/Optimizer/zend_optimizer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ ZEND_API int zend_optimizer_register_pass(zend_optimizer_pass_t pass);
9898
ZEND_API void zend_optimizer_unregister_pass(int idx);
9999
zend_result zend_optimizer_startup(void);
100100
zend_result zend_optimizer_shutdown(void);
101+
102+
typedef void (*zend_op_array_func_t)(zend_op_array *, void *context);
103+
void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context);
104+
101105
END_EXTERN_C()
102106

103107
#endif

Zend/Optimizer/zend_optimizer_internal.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,4 @@ int sccp_optimize_op_array(zend_optimizer_ctx *ctx, zend_op_array *op_array, zen
128128
int dce_optimize_op_array(zend_op_array *op_array, zend_optimizer_ctx *optimizer_ctx, zend_ssa *ssa, bool reorder_dtor_effects);
129129
zend_result zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, zend_ssa *ssa);
130130

131-
typedef void (*zend_op_array_func_t)(zend_op_array *, void *context);
132-
void zend_foreach_op_array(zend_script *script, zend_op_array_func_t func, void *context);
133-
134131
#endif

ext/opcache/jit/zend_jit.c

Lines changed: 4 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -3928,8 +3928,10 @@ void zend_jit_deactivate(void)
39283928
zend_jit_profile_counter = 0;
39293929
}
39303930

3931-
static void zend_jit_restart_preloaded_op_array(zend_op_array *op_array)
3931+
static void zend_jit_restart_preloaded_op_array(zend_op_array *op_array, void *context)
39323932
{
3933+
ZEND_IGNORE_VALUE(context);
3934+
39333935
zend_func_info *func_info = ZEND_FUNC_INFO(op_array);
39343936

39353937
if (!func_info) {
@@ -3959,49 +3961,11 @@ static void zend_jit_restart_preloaded_op_array(zend_op_array *op_array)
39593961
}
39603962
#endif
39613963
}
3962-
if (op_array->num_dynamic_func_defs) {
3963-
for (uint32_t i = 0; i < op_array->num_dynamic_func_defs; i++) {
3964-
zend_jit_restart_preloaded_op_array(op_array->dynamic_func_defs[i]);
3965-
}
3966-
}
39673964
}
39683965

39693966
static void zend_jit_restart_preloaded_script(zend_persistent_script *script)
39703967
{
3971-
zend_class_entry *ce;
3972-
zend_op_array *op_array;
3973-
3974-
zend_jit_restart_preloaded_op_array(&script->script.main_op_array);
3975-
3976-
ZEND_HASH_MAP_FOREACH_PTR(&script->script.function_table, op_array) {
3977-
zend_jit_restart_preloaded_op_array(op_array);
3978-
} ZEND_HASH_FOREACH_END();
3979-
3980-
ZEND_HASH_MAP_FOREACH_PTR(&script->script.class_table, ce) {
3981-
ZEND_HASH_MAP_FOREACH_PTR(&ce->function_table, op_array) {
3982-
if (op_array->type == ZEND_USER_FUNCTION) {
3983-
zend_jit_restart_preloaded_op_array(op_array);
3984-
}
3985-
} ZEND_HASH_FOREACH_END();
3986-
3987-
if (ce->num_hooked_props > 0) {
3988-
zend_property_info *prop;
3989-
3990-
ZEND_HASH_MAP_FOREACH_PTR(&ce->properties_info, prop) {
3991-
if (prop->hooks) {
3992-
for (uint32_t i = 0; i < ZEND_PROPERTY_HOOK_COUNT; i++) {
3993-
if (prop->hooks[i]) {
3994-
op_array = &prop->hooks[i]->op_array;
3995-
ZEND_ASSERT(op_array->type == ZEND_USER_FUNCTION);
3996-
if (!(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) {
3997-
zend_jit_restart_preloaded_op_array(op_array);
3998-
}
3999-
}
4000-
}
4001-
}
4002-
} ZEND_HASH_FOREACH_END();
4003-
}
4004-
} ZEND_HASH_FOREACH_END();
3968+
zend_foreach_op_array(&script->script, zend_jit_restart_preloaded_op_array, NULL);
40053969
}
40063970

40073971
void zend_jit_restart(void)

0 commit comments

Comments
 (0)