mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
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:
@@ -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);
|
||||
|
||||
3
ext/opcache/tests/preload_early_binding.inc
Normal file
3
ext/opcache/tests/preload_early_binding.inc
Normal file
@@ -0,0 +1,3 @@
|
||||
<?php
|
||||
var_dump(new X);
|
||||
class X {}
|
||||
18
ext/opcache/tests/preload_early_binding.phpt
Normal file
18
ext/opcache/tests/preload_early_binding.phpt
Normal 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
|
||||
Reference in New Issue
Block a user