mirror of
https://github.com/php/php-src.git
synced 2024-11-30 21:35:36 +08: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:
parent
b009573f4e
commit
54668a449e
@ -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
|
Loading…
Reference in New Issue
Block a user