From 54668a449e2e535f638b6b0bc22c8c3956e534a2 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 3 Nov 2020 16:45:13 +0100 Subject: [PATCH] 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". --- Zend/zend_compile.c | 2 +- ext/opcache/tests/preload_early_binding.inc | 3 +++ ext/opcache/tests/preload_early_binding.phpt | 18 ++++++++++++++++++ 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 ext/opcache/tests/preload_early_binding.inc create mode 100644 ext/opcache/tests/preload_early_binding.phpt diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 0fd9c04330..af137e424d 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -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 index 0000000000..0adcd6b6d7 --- /dev/null +++ b/ext/opcache/tests/preload_early_binding.inc @@ -0,0 +1,3 @@ + +--FILE-- +OK +--EXPECT-- +object(X)#1 (0) { +} +OK -- 2.50.1