Don't disable early binding during preloading script

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".
This commit is contained in:
Nikita Popov 2020-11-03 16:45:13 +01:00
parent b009573f4e
commit 54668a449e
3 changed files with 22 additions and 1 deletions

View 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);

View File

@ -0,0 +1,3 @@
<?php
var_dump(new X);
class X {}

View File

@ -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