summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2020-11-04 10:55:59 +0100
committerNikita Popov <nikita.ppv@gmail.com>2020-11-04 10:55:59 +0100
commitc6563dddacb39be6d0716738c2538d0aa8622da3 (patch)
treefe5e18e00561d71e8bc3d28bdd90af15d22b03ba
parent54668a449e2e535f638b6b0bc22c8c3956e534a2 (diff)
parente0d6c3f7bae2644802f13bd1ae1f49c3d08a8e07 (diff)
downloadphp-git-c6563dddacb39be6d0716738c2538d0aa8622da3.tar.gz
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fix dynamic function definition in preload script
-rw-r--r--Zend/zend_compile.c3
-rw-r--r--ext/opcache/tests/preload_dynamic_function.inc4
-rw-r--r--ext/opcache/tests/preload_dynamic_function.phpt18
3 files changed, 24 insertions, 1 deletions
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index af137e424d..396cfd91c0 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -1082,7 +1082,8 @@ ZEND_API zend_result do_bind_function(zval *lcname) /* {{{ */
return FAILURE;
}
function = (zend_function*)Z_PTR_P(zv);
- if (UNEXPECTED(function->common.fn_flags & ZEND_ACC_PRELOADED)) {
+ if (UNEXPECTED(function->common.fn_flags & ZEND_ACC_PRELOADED)
+ && !(CG(compiler_options) & ZEND_COMPILE_PRELOAD)) {
zv = zend_hash_add(EG(function_table), Z_STR_P(lcname), zv);
} else {
zv = zend_hash_set_bucket_key(EG(function_table), (Bucket*)zv, Z_STR_P(lcname));
diff --git a/ext/opcache/tests/preload_dynamic_function.inc b/ext/opcache/tests/preload_dynamic_function.inc
new file mode 100644
index 0000000000..3caa9592b8
--- /dev/null
+++ b/ext/opcache/tests/preload_dynamic_function.inc
@@ -0,0 +1,4 @@
+<?php
+if (1) {
+ function f() {}
+}
diff --git a/ext/opcache/tests/preload_dynamic_function.phpt b/ext/opcache/tests/preload_dynamic_function.phpt
new file mode 100644
index 0000000000..451a58eb34
--- /dev/null
+++ b/ext/opcache/tests/preload_dynamic_function.phpt
@@ -0,0 +1,18 @@
+--TEST--
+Defining a dynamic function inside the preload script
+--INI--
+opcache.enable=1
+opcache.enable_cli=1
+opcache.optimization_level=-1
+opcache.preload={PWD}/preload_dynamic_function.inc
+--SKIPIF--
+<?php
+require_once('skipif.inc');
+if (PHP_OS_FAMILY == 'Windows') die('skip Preloading is not supported on Windows');
+?>
+--FILE--
+<?php
+var_dump(function_exists("f"));
+?>
+--EXPECT--
+bool(true)