From: Nikita Popov Date: Thu, 5 Nov 2020 12:15:32 +0000 (+0100) Subject: Fixup trait methods even if no traits are used X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2effbfd8713936742ef46e6e85ce193b320ac005;p=php Fixup trait methods even if no traits are used Trait methods might be non-trivially inherited, in which case we may have to perform fixup in classes that do not directly use any traits. --- diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index a3c079d0f0..7eee9819ce 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -4190,16 +4190,12 @@ static int preload_optimize(zend_persistent_script *script) } ZEND_HASH_FOREACH_PTR(&script->script.class_table, ce) { - if (ce->num_traits) { - preload_fix_trait_methods(ce); - } + preload_fix_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->num_traits) { - preload_fix_trait_methods(ce); - } + preload_fix_trait_methods(ce); } ZEND_HASH_FOREACH_END(); } ZEND_HASH_FOREACH_END(); diff --git a/ext/opcache/tests/preload_trait_multiple_fixup.inc b/ext/opcache/tests/preload_trait_multiple_fixup.inc index 5ccb1237a3..c6c2023725 100644 --- a/ext/opcache/tests/preload_trait_multiple_fixup.inc +++ b/ext/opcache/tests/preload_trait_multiple_fixup.inc @@ -17,3 +17,17 @@ class C1 { class C2 extends C1 { use T2; } + +trait T3 { + public function method() { + // Prevent trivial inheritance. + static $x; + // Needs to be optimized somehow. + $str = "Foo"; + echo "$str\n"; + } +} +class C3 { + use T3; +} +class C4 extends C3 {} diff --git a/ext/opcache/tests/preload_trait_multiple_fixup.phpt b/ext/opcache/tests/preload_trait_multiple_fixup.phpt index a63458ecc9..dbee2595c2 100644 --- a/ext/opcache/tests/preload_trait_multiple_fixup.phpt +++ b/ext/opcache/tests/preload_trait_multiple_fixup.phpt @@ -13,6 +13,8 @@ if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows --FILE-- method(); +(new C4)->method(); ?> --EXPECT-- Foo +Foo