From b1b0c81e397cbc7e6eb3521c5e27d09480ee08b0 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 30 Jul 2021 10:27:51 +0200 Subject: [PATCH] Don't print preload warning for non-top-level classes Dynamically declared classes categorically do not get linked during preloading, even if all their dependencies are known. The warning is misleading in this case, and there isn't anything the user can do to address it. --- ext/opcache/ZendAccelerator.c | 3 ++- ext/opcache/tests/bug78937_1.phpt | 2 -- ext/opcache/tests/bug78937_2.phpt | 2 -- ext/opcache/tests/bug78937_3.phpt | 2 -- ext/opcache/tests/bug78937_4.phpt | 2 -- ext/opcache/tests/bug78937_5.phpt | 2 -- ext/opcache/tests/bug78937_6.phpt | 2 -- ext/opcache/tests/preload_enum.phpt | 4 +--- 8 files changed, 3 insertions(+), 16 deletions(-) diff --git a/ext/opcache/ZendAccelerator.c b/ext/opcache/ZendAccelerator.c index e0e3e6e631e..f8e303a13da 100644 --- a/ext/opcache/ZendAccelerator.c +++ b/ext/opcache/ZendAccelerator.c @@ -4034,7 +4034,8 @@ static void preload_link(void) if (ce->type == ZEND_INTERNAL_CLASS) { break; } - if (!(ce->ce_flags & ZEND_ACC_LINKED)) { + if ((ce->ce_flags & (ZEND_ACC_TOP_LEVEL|ZEND_ACC_ANON_CLASS)) + && !(ce->ce_flags & ZEND_ACC_LINKED)) { zend_string *key = zend_string_tolower(ce->name); if (!(ce->ce_flags & ZEND_ACC_ANON_CLASS) && zend_hash_exists(EG(class_table), key)) { diff --git a/ext/opcache/tests/bug78937_1.phpt b/ext/opcache/tests/bug78937_1.phpt index 728efba88ca..657b306d68d 100644 --- a/ext/opcache/tests/bug78937_1.phpt +++ b/ext/opcache/tests/bug78937_1.phpt @@ -18,8 +18,6 @@ class Bar { var_dump(foo()); ?> --EXPECTF-- -Warning: Can't preload unlinked class Foo: Unknown parent Bar in %spreload_bug78937.inc on line 6 - Warning: Can't preload unlinked class Bar@anonymous: Unknown parent Bar in %spreload_bug78937.inc on line 3 object(Bar@anonymous)#%d (0) { } diff --git a/ext/opcache/tests/bug78937_2.phpt b/ext/opcache/tests/bug78937_2.phpt index 93b9908cce2..eb359cee96b 100644 --- a/ext/opcache/tests/bug78937_2.phpt +++ b/ext/opcache/tests/bug78937_2.phpt @@ -19,8 +19,6 @@ class Bar { var_dump(foo()); ?> --EXPECTF-- -Warning: Can't preload unlinked class Foo: Unknown parent Bar in %spreload_bug78937.inc on line 6 - Warning: Can't preload unlinked class Bar@anonymous: Unknown parent Bar in %spreload_bug78937.inc on line 3 object(Bar@anonymous)#%d (0) { } diff --git a/ext/opcache/tests/bug78937_3.phpt b/ext/opcache/tests/bug78937_3.phpt index ec83b347ebb..b17f8d0a08c 100644 --- a/ext/opcache/tests/bug78937_3.phpt +++ b/ext/opcache/tests/bug78937_3.phpt @@ -17,8 +17,6 @@ include(__DIR__ . "/preload_bug78937.inc"); var_dump(foo()); ?> --EXPECTF-- -Warning: Can't preload unlinked class Foo: Unknown parent Bar in %spreload_bug78937.inc on line 6 - Warning: Can't preload unlinked class Bar@anonymous: Unknown parent Bar in %spreload_bug78937.inc on line 3 Fatal error: Uncaught Error: Class "Bar" not found in %spreload_bug78937.inc:3 diff --git a/ext/opcache/tests/bug78937_4.phpt b/ext/opcache/tests/bug78937_4.phpt index be68271b9a3..2598b5db9c1 100644 --- a/ext/opcache/tests/bug78937_4.phpt +++ b/ext/opcache/tests/bug78937_4.phpt @@ -19,8 +19,6 @@ bar(); var_dump(new Foo); ?> --EXPECTF-- -Warning: Can't preload unlinked class Foo: Unknown parent Bar in %spreload_bug78937.inc on line 6 - Warning: Can't preload unlinked class Bar@anonymous: Unknown parent Bar in %spreload_bug78937.inc on line 3 object(Foo)#%d (0) { } diff --git a/ext/opcache/tests/bug78937_5.phpt b/ext/opcache/tests/bug78937_5.phpt index 865f1089ea6..dc67b904569 100644 --- a/ext/opcache/tests/bug78937_5.phpt +++ b/ext/opcache/tests/bug78937_5.phpt @@ -20,8 +20,6 @@ bar(); var_dump(new Foo); ?> --EXPECTF-- -Warning: Can't preload unlinked class Foo: Unknown parent Bar in %spreload_bug78937.inc on line 6 - Warning: Can't preload unlinked class Bar@anonymous: Unknown parent Bar in %spreload_bug78937.inc on line 3 object(Foo)#%d (0) { } diff --git a/ext/opcache/tests/bug78937_6.phpt b/ext/opcache/tests/bug78937_6.phpt index 48ed1f12503..fe9d5176aac 100644 --- a/ext/opcache/tests/bug78937_6.phpt +++ b/ext/opcache/tests/bug78937_6.phpt @@ -18,8 +18,6 @@ bar(); var_dump(new Foo); ?> --EXPECTF-- -Warning: Can't preload unlinked class Foo: Unknown parent Bar in %spreload_bug78937.inc on line 6 - Warning: Can't preload unlinked class Bar@anonymous: Unknown parent Bar in %spreload_bug78937.inc on line 3 Fatal error: Uncaught Error: Class "Bar" not found in %spreload_bug78937.inc:6 diff --git a/ext/opcache/tests/preload_enum.phpt b/ext/opcache/tests/preload_enum.phpt index b899692be96..30422fd5641 100644 --- a/ext/opcache/tests/preload_enum.phpt +++ b/ext/opcache/tests/preload_enum.phpt @@ -17,9 +17,7 @@ var_dump(MyEnum::Foo); var_dump(MyEnum::Bar); ?> ---EXPECTF-- +--EXPECT-- enum(MyEnum::Bar) - -Warning: Can't preload unlinked class MyEnum2: Unknown reason in %s on line %d enum(MyEnum::Foo) enum(MyEnum::Bar)