From: Nikita Popov Date: Tue, 3 Nov 2020 13:49:10 +0000 (+0100) Subject: Allow unlinked classes when performing in_compilation variance check X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=7e5531755812a46841fc24ade5f71aefde69cf96;p=php Allow unlinked classes when performing in_compilation variance check As preloading runs in in_compilation mode, we also need to allow use of unlinked classes in lookup_class(). --- diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 34489938a9..c3aad9f614 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -239,10 +239,9 @@ static zend_bool class_visible(zend_class_entry *ce) { static zend_class_entry *lookup_class( zend_class_entry *scope, zend_string *name, zend_bool register_unresolved) { - zend_class_entry *ce; + uint32_t flags = ZEND_FETCH_CLASS_ALLOW_UNLINKED | ZEND_FETCH_CLASS_NO_AUTOLOAD; + zend_class_entry *ce = zend_lookup_class_ex(name, NULL, flags); if (!CG(in_compilation)) { - uint32_t flags = ZEND_FETCH_CLASS_ALLOW_UNLINKED | ZEND_FETCH_CLASS_NO_AUTOLOAD; - ce = zend_lookup_class_ex(name, NULL, flags); if (ce) { return ce; } @@ -256,7 +255,6 @@ static zend_class_entry *lookup_class( zend_hash_add_empty_element(CG(delayed_autoloads), name); } } else { - ce = zend_lookup_class_ex(name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD); if (ce && class_visible(ce)) { return ce; } diff --git a/ext/opcache/tests/preload_variance.inc b/ext/opcache/tests/preload_variance.inc index eae3cd7152..85e569f345 100644 --- a/ext/opcache/tests/preload_variance.inc +++ b/ext/opcache/tests/preload_variance.inc @@ -14,11 +14,13 @@ class C extends Z { public function method($a): self {} public function method2($a): C {} public function method3($a): object {} + public function method4(D $a) {} } class D extends C { public function method($a): self {} public function method2($a): D {} public function method3($a): stdClass {} + public function method4(C $a) {} } // Works.