From 10064d0e1a89a4f48dc1e896de35a65f2ab946f4 Mon Sep 17 00:00:00 2001 From: Aliaksandr Kalenik Date: Sun, 8 Sep 2024 14:04:25 +0200 Subject: [PATCH] LibJS: Reset in_formal_parameter_context after entering a new function Fixes a bug when "'Await' expression is not allowed in formal parameters of an async function" is thrown for "await" encountered in a function definition assigned to a default function parameter. Fixes loading of https://excalidraw.com/ --- Userland/Libraries/LibJS/Parser.cpp | 3 +++ ...in-a-func-def-assigned-to-default-param.js | 23 +++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 Userland/Libraries/LibJS/Tests/regress/allow-await-in-a-func-def-assigned-to-default-param.js diff --git a/Userland/Libraries/LibJS/Parser.cpp b/Userland/Libraries/LibJS/Parser.cpp index fb82be40893..d72e2f634ff 100644 --- a/Userland/Libraries/LibJS/Parser.cpp +++ b/Userland/Libraries/LibJS/Parser.cpp @@ -982,6 +982,8 @@ static bool is_simple_parameter_list(Vector const& parameters RefPtr Parser::try_parse_arrow_function_expression(bool expect_parens, bool is_async) { + TemporaryChange in_formal_parameter_context_rollback(m_state.in_formal_parameter_context, false); + if (is_async) VERIFY(match(TokenType::Async)); @@ -2888,6 +2890,7 @@ NonnullRefPtr Parser::parse_function_node(u16 parse_options, O TemporaryChange continue_context_rollback(m_state.in_continue_context, false); TemporaryChange class_field_initializer_rollback(m_state.in_class_field_initializer, false); TemporaryChange might_need_arguments_object_rollback(m_state.function_might_need_arguments_object, false); + TemporaryChange in_formal_parameter_context_rollback(m_state.in_formal_parameter_context, false); constexpr auto is_function_expression = IsSame; FunctionKind function_kind; diff --git a/Userland/Libraries/LibJS/Tests/regress/allow-await-in-a-func-def-assigned-to-default-param.js b/Userland/Libraries/LibJS/Tests/regress/allow-await-in-a-func-def-assigned-to-default-param.js new file mode 100644 index 00000000000..288c98ca8ce --- /dev/null +++ b/Userland/Libraries/LibJS/Tests/regress/allow-await-in-a-func-def-assigned-to-default-param.js @@ -0,0 +1,23 @@ +test('Do not throw syntax error when "await" is used in an arrow function definition assigned to a default function parameter', async () => { + async function f( + g = async () => { + await 1; + } + ) { + return await g(); + } + + expect(await f()).toBe(1); +}); + +test('Do not throw syntax error when "await" is used in a function definition assigned to a default function parameter', async () => { + async function f( + g = async function () { + await 1; + } + ) { + return await g(); + } + + expect(await f()).toBe(1); +});