]> granicus.if.org Git - php/commitdiff
Allow unlinked classes when performing in_compilation variance check
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 3 Nov 2020 13:49:10 +0000 (14:49 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 3 Nov 2020 13:49:10 +0000 (14:49 +0100)
As preloading runs in in_compilation mode, we also need to allow
use of unlinked classes in lookup_class().

Zend/zend_inheritance.c
ext/opcache/tests/preload_variance.inc

index 34489938a92cb55cc5e5cda7a9b5b454efb42119..c3aad9f614c289c69ac1215e4b51626e9ee3e2dd 100644 (file)
@@ -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;
                }
index eae3cd7152614e463e43657a54a2a20553059aa5..85e569f3455c8f8f799266c552bef113da42b42a 100644 (file)
@@ -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.