diff --git a/Userland/Libraries/LibJS/CyclicModule.cpp b/Userland/Libraries/LibJS/CyclicModule.cpp index f5146e9095..fc62789e96 100644 --- a/Userland/Libraries/LibJS/CyclicModule.cpp +++ b/Userland/Libraries/LibJS/CyclicModule.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2022, David Tuin + * Copyright (c) 2023, networkException * * SPDX-License-Identifier: BSD-2-Clause */ @@ -28,6 +29,8 @@ void CyclicModule::visit_edges(Cell::Visitor& visitor) visitor.visit(m_top_level_capability); for (auto const& module : m_async_parent_modules) visitor.visit(module); + for (auto const& loaded_module : m_loaded_modules) + visitor.visit(loaded_module.module); } // 16.2.1.5.1 Link ( ), https://tc39.es/ecma262/#sec-moduledeclarationlinking diff --git a/Userland/Libraries/LibJS/CyclicModule.h b/Userland/Libraries/LibJS/CyclicModule.h index 813b8c16dc..22c3881758 100644 --- a/Userland/Libraries/LibJS/CyclicModule.h +++ b/Userland/Libraries/LibJS/CyclicModule.h @@ -33,6 +33,7 @@ public: virtual ThrowCompletionOr evaluate(VM& vm) override final; Vector const& requested_modules() const { return m_requested_modules; } + Vector const& loaded_modules() const { return m_loaded_modules; } protected: CyclicModule(Realm& realm, StringView filename, bool has_top_level_await, Vector requested_modules, Script::HostDefined* host_defined); @@ -55,6 +56,7 @@ protected: Optional m_dfs_index; // [[DFSIndex]] Optional m_dfs_ancestor_index; // [[DFSAncestorIndex]] Vector m_requested_modules; // [[RequestedModules]] + Vector m_loaded_modules; // [[LoadedModules]] GCPtr m_cycle_root; // [[CycleRoot]] bool m_has_top_level_await { false }; // [[HasTLA]] bool m_async_evaluation { false }; // [[AsyncEvaluation]] diff --git a/Userland/Libraries/LibJS/Script.cpp b/Userland/Libraries/LibJS/Script.cpp index 56fa37807f..9373c0d113 100644 --- a/Userland/Libraries/LibJS/Script.cpp +++ b/Userland/Libraries/LibJS/Script.cpp @@ -45,6 +45,8 @@ void Script::visit_edges(Cell::Visitor& visitor) visitor.visit(m_realm); if (m_host_defined) m_host_defined->visit_host_defined_self(visitor); + for (auto const& loaded_module : m_loaded_modules) + visitor.visit(loaded_module.module); } } diff --git a/Userland/Libraries/LibJS/Script.h b/Userland/Libraries/LibJS/Script.h index 555e4d4e06..c3921ae5c0 100644 --- a/Userland/Libraries/LibJS/Script.h +++ b/Userland/Libraries/LibJS/Script.h @@ -30,6 +30,7 @@ public: Realm& realm() { return *m_realm; } Program const& parse_node() const { return *m_parse_node; } + Vector const& loaded_modules() const { return m_loaded_modules; } HostDefined* host_defined() const { return m_host_defined; } StringView filename() const { return m_filename; } @@ -39,8 +40,9 @@ private: virtual void visit_edges(Cell::Visitor&) override; - GCPtr m_realm; // [[Realm]] - NonnullRefPtr m_parse_node; // [[ECMAScriptCode]] + GCPtr m_realm; // [[Realm]] + NonnullRefPtr m_parse_node; // [[ECMAScriptCode]] + Vector m_loaded_modules; // [[LoadedModules]] // Needed for potential lookups of modules. DeprecatedString m_filename;