diff --git a/Userland/Libraries/LibJS/CyclicModule.cpp b/Userland/Libraries/LibJS/CyclicModule.cpp index 1848b4d0b9..cc8e3f80b9 100644 --- a/Userland/Libraries/LibJS/CyclicModule.cpp +++ b/Userland/Libraries/LibJS/CyclicModule.cpp @@ -848,7 +848,7 @@ void continue_dynamic_import(NonnullGCPtr promise_capability, auto& module = *module_completion.value(); // 3. Let loadPromise be module.LoadRequestedModules(). - auto& load_promise = verify_cast(module).load_requested_modules({}); + auto& load_promise = module.load_requested_modules({}); // 4. Let rejectedClosure be a new Abstract Closure with parameters (reason) that captures promiseCapability and performs the // following steps when called: diff --git a/Userland/Libraries/LibJS/CyclicModule.h b/Userland/Libraries/LibJS/CyclicModule.h index ab14e9f5a2..f82a278610 100644 --- a/Userland/Libraries/LibJS/CyclicModule.h +++ b/Userland/Libraries/LibJS/CyclicModule.h @@ -22,38 +22,6 @@ enum class ModuleStatus { Evaluated }; -class CyclicModule; - -// https://tc39.es/ecma262/#graphloadingstate-record -struct GraphLoadingState : public Cell { - JS_CELL(GraphLoadingState, Cell); - -public: - struct HostDefined : Cell { - JS_CELL(HostDefined, Cell); - - public: - virtual ~HostDefined() = default; - }; - - GCPtr promise_capability; // [[PromiseCapability]] - bool is_loading { false }; // [[IsLoading]] - size_t pending_module_count { 0 }; // [[PendingModulesCount]] - HashTable visited; // [[Visited]] - GCPtr host_defined; // [[HostDefined]] - -private: - GraphLoadingState(GCPtr promise_capability, bool is_loading, size_t pending_module_count, HashTable visited, GCPtr host_defined) - : promise_capability(move(promise_capability)) - , is_loading(is_loading) - , pending_module_count(pending_module_count) - , visited(move(visited)) - , host_defined(move(host_defined)) - { - } - virtual void visit_edges(Cell::Visitor&) override; -}; - // 16.2.1.5 Cyclic Module Records, https://tc39.es/ecma262/#cyclic-module-record class CyclicModule : public Module { JS_CELL(CyclicModule, Module); @@ -65,7 +33,7 @@ public: virtual ThrowCompletionOr link(VM& vm) override final; virtual ThrowCompletionOr evaluate(VM& vm) override final; - virtual PromiseCapability& load_requested_modules(GCPtr); + virtual PromiseCapability& load_requested_modules(GCPtr) override; virtual void inner_module_loading(GraphLoadingState& state); Vector const& requested_modules() const { return m_requested_modules; } diff --git a/Userland/Libraries/LibJS/Module.h b/Userland/Libraries/LibJS/Module.h index 521e43c285..0b802dc0cf 100644 --- a/Userland/Libraries/LibJS/Module.h +++ b/Userland/Libraries/LibJS/Module.h @@ -56,6 +56,36 @@ struct ResolvedBinding { } }; +// https://tc39.es/ecma262/#graphloadingstate-record +struct GraphLoadingState : public Cell { + JS_CELL(GraphLoadingState, Cell); + +public: + struct HostDefined : Cell { + JS_CELL(HostDefined, Cell); + + public: + virtual ~HostDefined() = default; + }; + + GCPtr promise_capability; // [[PromiseCapability]] + bool is_loading { false }; // [[IsLoading]] + size_t pending_module_count { 0 }; // [[PendingModulesCount]] + HashTable visited; // [[Visited]] + GCPtr host_defined; // [[HostDefined]] + +private: + GraphLoadingState(GCPtr promise_capability, bool is_loading, size_t pending_module_count, HashTable visited, GCPtr host_defined) + : promise_capability(move(promise_capability)) + , is_loading(is_loading) + , pending_module_count(pending_module_count) + , visited(move(visited)) + , host_defined(move(host_defined)) + { + } + virtual void visit_edges(Cell::Visitor&) override; +}; + // 16.2.1.4 Abstract Module Records, https://tc39.es/ecma262/#sec-abstract-module-records class Module : public Cell { JS_CELL(Module, Cell); @@ -84,6 +114,8 @@ public: virtual ThrowCompletionOr inner_module_linking(VM& vm, Vector& stack, u32 index); virtual ThrowCompletionOr inner_module_evaluation(VM& vm, Vector& stack, u32 index); + virtual PromiseCapability& load_requested_modules(GCPtr) = 0; + protected: Module(Realm&, DeprecatedString filename, Script::HostDefined* host_defined = nullptr); diff --git a/Userland/Libraries/LibJS/SyntheticModule.cpp b/Userland/Libraries/LibJS/SyntheticModule.cpp index a807a1fc53..a1689eef2a 100644 --- a/Userland/Libraries/LibJS/SyntheticModule.cpp +++ b/Userland/Libraries/LibJS/SyntheticModule.cpp @@ -8,6 +8,8 @@ #include #include #include +#include +#include #include #include @@ -159,4 +161,14 @@ ThrowCompletionOr> parse_json_module(StringView source_text return SyntheticModule::create_default_export_synthetic_module(json, realm, filename); } +// 1.2.3.1 LoadRequestedModules ( ), https://tc39.es/proposal-json-modules/#sec-smr-LoadRequestedModules +PromiseCapability& SyntheticModule::load_requested_modules(GCPtr) +{ + // 1. Return ! PromiseResolve(%Promise%, undefined). + auto& constructor = *vm().current_realm()->intrinsics().promise_constructor(); + auto promise_capability = MUST(new_promise_capability(vm(), &constructor)); + MUST(call(vm(), *promise_capability->resolve(), js_undefined(), js_undefined())); + return promise_capability; +} + } diff --git a/Userland/Libraries/LibJS/SyntheticModule.h b/Userland/Libraries/LibJS/SyntheticModule.h index bc428fdd9c..c99f018683 100644 --- a/Userland/Libraries/LibJS/SyntheticModule.h +++ b/Userland/Libraries/LibJS/SyntheticModule.h @@ -26,6 +26,7 @@ public: virtual ThrowCompletionOr evaluate(VM& vm) override; virtual ThrowCompletionOr> get_exported_names(VM& vm, Vector export_star_set) override; virtual ThrowCompletionOr resolve_export(VM& vm, DeprecatedFlyString const& export_name, Vector resolve_set) override; + virtual PromiseCapability& load_requested_modules(GCPtr) override; private: SyntheticModule(Vector export_names, EvaluationFunction evaluation_steps, Realm& realm, StringView filename);