From ee63c9bbc3de9fcbb54c57f7a2cd9a994ea5e968 Mon Sep 17 00:00:00 2001 From: George Peter Banyard Date: Mon, 28 Nov 2022 03:12:22 +0000 Subject: [PATCH] Do not run autoloader when resolving unqualified call --- .../exceptions_during_autoloading004.phpt | 23 ++++++++++++++++--- ...ces_basic.phpt => global_fallback001.phpt} | 0 .../function/global_fallback002.phpt | 18 +++++++++++++++ Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 4 ++-- 5 files changed, 42 insertions(+), 7 deletions(-) rename Zend/tests/autoloading/function/{namespaces_basic.phpt => global_fallback001.phpt} (100%) create mode 100644 Zend/tests/autoloading/function/global_fallback002.phpt diff --git a/Zend/tests/autoloading/function/exceptions_during_autoloading004.phpt b/Zend/tests/autoloading/function/exceptions_during_autoloading004.phpt index fc3d2a374c0e8..b3149ea08dc99 100644 --- a/Zend/tests/autoloading/function/exceptions_during_autoloading004.phpt +++ b/Zend/tests/autoloading/function/exceptions_during_autoloading004.phpt @@ -17,6 +17,7 @@ namespace { autoload_register_function('autoload_second'); } namespace bar { + echo "Try-catch around function_exists()\n"; try { \function_exists('foo'); } catch (\Exception $e) { @@ -24,22 +25,38 @@ namespace bar { echo $e->getMessage()."\n"; } while ($e = $e->getPrevious()); } + echo "Try-catch around unqualified function call\n"; try { foo(); - } catch (\Exception $e) { + } catch (\Throwable $e) { + /* No autoloading for unqualified function names */ do { - echo $e->getMessage()."\n"; + echo $e::class, ': ', $e->getMessage(), "\n"; + } while ($e = $e->getPrevious()); + } + echo "Try-catch around qualified function call\n"; + try { + \foo(); + } catch (\Throwable $e) { + do { + echo $e::class, ': ', $e->getMessage(), "\n"; } while ($e = $e->getPrevious()); } + echo "function_exists() without try-catch\n"; \function_exists('foo'); } ?> --EXPECTF-- +Try-catch around function_exists() autoload_first first +Try-catch around unqualified function call +Error: Call to undefined function bar\foo() +Try-catch around qualified function call autoload_first -first +Exception: first +function_exists() without try-catch autoload_first Fatal error: Uncaught Exception: first in %s:%d diff --git a/Zend/tests/autoloading/function/namespaces_basic.phpt b/Zend/tests/autoloading/function/global_fallback001.phpt similarity index 100% rename from Zend/tests/autoloading/function/namespaces_basic.phpt rename to Zend/tests/autoloading/function/global_fallback001.phpt diff --git a/Zend/tests/autoloading/function/global_fallback002.phpt b/Zend/tests/autoloading/function/global_fallback002.phpt new file mode 100644 index 0000000000000..5af856c4c5319 --- /dev/null +++ b/Zend/tests/autoloading/function/global_fallback002.phpt @@ -0,0 +1,18 @@ +--TEST-- +Fallback to global function should not trigger autoloading. +--FILE-- + +--EXPECT-- +string(5) "Hello" diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 35cc70d820f28..e6059d0ca553d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -3859,13 +3859,13 @@ ZEND_VM_HOT_HANDLER(69, ZEND_INIT_NS_FCALL_BY_NAME, ANY, CONST, NUM|CACHE_SLOT) if (UNEXPECTED(fbc == NULL)) { zval *function_name = (zval *)RT_CONSTANT(opline, opline->op2); /* Fetch lowercase name stored in the next literal slot */ - fbc = zend_lookup_function_ex(Z_STR_P(function_name), Z_STR_P(function_name+1), /* use_autoload */ true); + fbc = zend_lookup_function_ex(Z_STR_P(function_name), Z_STR_P(function_name+1), /* use_autoload */ false); if (UNEXPECTED(fbc == NULL)) { if (UNEXPECTED(EG(exception))) { HANDLE_EXCEPTION(); } /* Fallback onto global namespace, by fetching the unqualified lowercase name stored in the second literal slot */ - fbc = zend_lookup_function_ex(Z_STR_P(function_name+2), Z_STR_P(function_name+2), /* use_autoload */ true); + fbc = zend_lookup_function_ex(Z_STR_P(function_name+2), Z_STR_P(function_name+2), /* use_autoload */ false); if (fbc == NULL) { if (UNEXPECTED(EG(exception))) { HANDLE_EXCEPTION(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 0753dd8100878..daf4ca024d6ea 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3764,13 +3764,13 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_NS_FCALL_BY_N if (UNEXPECTED(fbc == NULL)) { zval *function_name = (zval *)RT_CONSTANT(opline, opline->op2); /* Fetch lowercase name stored in the next literal slot */ - fbc = zend_lookup_function_ex(Z_STR_P(function_name), Z_STR_P(function_name+1), /* use_autoload */ true); + fbc = zend_lookup_function_ex(Z_STR_P(function_name), Z_STR_P(function_name+1), /* use_autoload */ false); if (UNEXPECTED(fbc == NULL)) { if (UNEXPECTED(EG(exception))) { HANDLE_EXCEPTION(); } /* Fallback onto global namespace, by fetching the unqualified lowercase name stored in the second literal slot */ - fbc = zend_lookup_function_ex(Z_STR_P(function_name+2), Z_STR_P(function_name+2), /* use_autoload */ true); + fbc = zend_lookup_function_ex(Z_STR_P(function_name+2), Z_STR_P(function_name+2), /* use_autoload */ false); if (fbc == NULL) { if (UNEXPECTED(EG(exception))) { HANDLE_EXCEPTION();