]> granicus.if.org Git - php/commitdiff
Preloading: Also handle trait methods outside main script
authorNikita Popov <nikita.ppv@gmail.com>
Thu, 4 Jul 2019 09:58:46 +0000 (11:58 +0200)
committerNikita Popov <nikita.ppv@gmail.com>
Thu, 4 Jul 2019 10:20:31 +0000 (12:20 +0200)
ext/opcache/ZendAccelerator.c

index c94c668c9a6413734e4f129a4ca4ec6a55f29624..41ea02b2c0a031f693266f83fe7af7606d0314d1 100644 (file)
@@ -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;
        }