]> granicus.if.org Git - php/commitdiff
Don't disable early binding during preloading script
authorNikita Popov <nikita.ppv@gmail.com>
Tue, 3 Nov 2020 15:45:13 +0000 (16:45 +0100)
committerNikita Popov <nikita.ppv@gmail.com>
Tue, 3 Nov 2020 15:45:13 +0000 (16:45 +0100)
We should only disable early binding during the opcache_compile_file()
calls, not inside the preloading script or anything it includes.
The right condition to check for is whether we compile the file
without execution, as declaring classes is "execution".

Zend/zend_compile.c
ext/opcache/tests/preload_early_binding.inc [new file with mode: 0644]
ext/opcache/tests/preload_early_binding.phpt [new file with mode: 0644]

index 0fd9c04330ba1fe63815ecab6914168d609ae167..af137e424d26b0d2878f6615e0f8ca4f9146b0e7 100644 (file)
@@ -7385,7 +7385,7 @@ void zend_compile_class_decl(znode *result, zend_ast *ast, zend_bool toplevel) /
        if (toplevel
                /* We currently don't early-bind classes that implement interfaces or use traits */
         && !ce->num_interfaces && !ce->num_traits
-        && !(CG(compiler_options) & ZEND_COMPILE_PRELOAD)) {
+        && !(CG(compiler_options) & ZEND_COMPILE_WITHOUT_EXECUTION)) {
                if (extends_ast) {
                        zend_class_entry *parent_ce = zend_lookup_class_ex(
                                ce->parent_name, NULL, ZEND_FETCH_CLASS_NO_AUTOLOAD);
diff --git a/ext/opcache/tests/preload_early_binding.inc b/ext/opcache/tests/preload_early_binding.inc
new file mode 100644 (file)
index 0000000..0adcd6b
--- /dev/null
@@ -0,0 +1,3 @@
+<?php
+var_dump(new X);
+class X {}
diff --git a/ext/opcache/tests/preload_early_binding.phpt b/ext/opcache/tests/preload_early_binding.phpt
new file mode 100644 (file)
index 0000000..0db5ab1
--- /dev/null
@@ -0,0 +1,18 @@
+--TEST--
+Early binding should work fine inside the preload script
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.preload={PWD}/preload_early_binding.inc
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
+?>
+--FILE--
+OK
+--EXPECT--
+object(X)#1 (0) {
+}
+OK