From 99edf5b25a6df0f2f9b4d809f5de7a8d73bd6556 Mon Sep 17 00:00:00 2001 From: davidot Date: Tue, 18 Jan 2022 18:55:19 +0100 Subject: [PATCH] LibJS: Track whether a program has a top level await statement --- Userland/Libraries/LibJS/AST.h | 4 ++++ Userland/Libraries/LibJS/Parser.cpp | 17 +++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/Userland/Libraries/LibJS/AST.h b/Userland/Libraries/LibJS/AST.h index b3285e04f8..028e8aa1d4 100644 --- a/Userland/Libraries/LibJS/AST.h +++ b/Userland/Libraries/LibJS/AST.h @@ -426,6 +426,9 @@ public: NonnullRefPtrVector const& imports() const { return m_imports; } NonnullRefPtrVector const& exports() const { return m_exports; } + bool has_top_level_await() const { return m_has_top_level_await; } + void set_has_top_level_await() { m_has_top_level_await = true; } + ThrowCompletionOr global_declaration_instantiation(Interpreter& interpreter, GlobalObject& global_object, GlobalEnvironment& global_environment) const; private: @@ -436,6 +439,7 @@ private: NonnullRefPtrVector m_imports; NonnullRefPtrVector m_exports; + bool m_has_top_level_await { false }; }; class BlockStatement final : public ScopeNode { diff --git a/Userland/Libraries/LibJS/Parser.cpp b/Userland/Libraries/LibJS/Parser.cpp index 31f085ed99..999dddbbb9 100644 --- a/Userland/Libraries/LibJS/Parser.cpp +++ b/Userland/Libraries/LibJS/Parser.cpp @@ -237,6 +237,16 @@ public: m_identifier_and_argument_index_associations.ensure(index).append(move(identifier)); } + void set_contains_await_expression() + { + m_contains_await_expression = true; + } + + bool contains_await_expression() const + { + return m_contains_await_expression; + } + private: void throw_identifier_declared(FlyString const& name, NonnullRefPtr const& declaration) { @@ -263,6 +273,7 @@ private: bool m_contains_access_to_arguments_object { false }; bool m_contains_direct_call_to_eval { false }; + bool m_contains_await_expression { false }; }; class OperatorPrecedenceTable { @@ -525,6 +536,10 @@ void Parser::parse_module(Program& program) } } + VERIFY(m_state.current_scope_pusher); + if (m_state.current_scope_pusher->contains_await_expression()) + program.set_has_top_level_await(); + for (auto& export_statement : program.exports()) { if (export_statement.has_statement()) continue; @@ -2342,6 +2357,8 @@ NonnullRefPtr Parser::parse_await_expression() auto associativity = operator_associativity(TokenType::Await); auto argument = parse_expression(precedence, associativity); + m_state.current_scope_pusher->set_contains_await_expression(); + return create_ast_node({ m_state.current_token.filename(), rule_start.position(), position() }, move(argument)); }