From: Nikita Popov Date: Thu, 4 Jul 2019 09:58:46 +0000 (+0200) Subject: Preloading: Also handle trait methods outside main script X-Git-Tag: php-7.4.0alpha3~47 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4a2646cf45982bc46208e0ec17b4e23f323b1dbc;p=php Preloading: Also handle trait methods outside main script --- diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index c94c668c9a..41ea02b2c0 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -3893,6 +3893,15 @@ static void preload_remove_empty_includes(void) } ZEND_HASH_FOREACH_END(); } +static void preload_register_trait_methods(zend_class_entry *ce) { + zend_op_array *op_array; + ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { + if (!(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) { + zend_shared_alloc_register_xlat_entry(op_array->opcodes, op_array); + } + } ZEND_HASH_FOREACH_END(); +} + static void preload_fix_trait_methods(zend_class_entry *ce) { zend_op_array *op_array; @@ -3918,20 +3927,23 @@ static void preload_fix_trait_methods(zend_class_entry *ce) static int preload_optimize(zend_persistent_script *script) { zend_class_entry *ce; - zend_op_array *op_array; zend_shared_alloc_init_xlat_table(); ZEND_HASH_FOREACH_PTR(&script->script.class_table, ce) { if (ce->ce_flags & ZEND_ACC_TRAIT) { - ZEND_HASH_FOREACH_PTR(&ce->function_table, op_array) { - if (!(op_array->fn_flags & ZEND_ACC_TRAIT_CLONE)) { - zend_shared_alloc_register_xlat_entry(op_array->opcodes, op_array); - } - } ZEND_HASH_FOREACH_END(); + preload_register_trait_methods(ce); } } ZEND_HASH_FOREACH_END(); + ZEND_HASH_FOREACH_PTR(preload_scripts, script) { + ZEND_HASH_FOREACH_PTR(&script->script.class_table, ce) { + if (ce->ce_flags & ZEND_ACC_TRAIT) { + preload_register_trait_methods(ce); + } + } ZEND_HASH_FOREACH_END(); + } ZEND_HASH_FOREACH_END(); + if (!zend_optimize_script(&script->script, ZCG(accel_directives).optimization_level, ZCG(accel_directives).opt_debug_level)) { return FAILURE; }