2022-01-18 18:29:17 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2022, David Tuin <davidot@serenityos.org>
|
2023-10-28 21:41:47 +00:00
|
|
|
* Copyright (c) 2023, networkException <networkexception@serenityos.org>
|
2022-01-18 18:29:17 +00:00
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: BSD-2-Clause
|
|
|
|
*/
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <LibJS/Forward.h>
|
|
|
|
#include <LibJS/Module.h>
|
|
|
|
|
|
|
|
namespace JS {
|
|
|
|
|
|
|
|
enum class ModuleStatus {
|
2023-10-28 21:41:47 +00:00
|
|
|
New,
|
2022-01-18 18:29:17 +00:00
|
|
|
Unlinked,
|
|
|
|
Linking,
|
|
|
|
Linked,
|
|
|
|
Evaluating,
|
|
|
|
EvaluatingAsync,
|
|
|
|
Evaluated
|
|
|
|
};
|
|
|
|
|
|
|
|
// 16.2.1.5 Cyclic Module Records, https://tc39.es/ecma262/#sec-cyclic-module-records
|
|
|
|
class CyclicModule : public Module {
|
2022-09-05 12:31:25 +00:00
|
|
|
JS_CELL(CyclicModule, Module);
|
|
|
|
|
2022-01-18 18:29:17 +00:00
|
|
|
public:
|
|
|
|
// Note: Do not call these methods directly unless you are HostResolveImportedModule.
|
|
|
|
// Badges cannot be used because other hosts must be able to call this (and it is called recursively)
|
2023-08-13 10:53:46 +00:00
|
|
|
virtual ThrowCompletionOr<void> link(VM& vm) override final;
|
|
|
|
virtual ThrowCompletionOr<Promise*> evaluate(VM& vm) override final;
|
2022-01-18 18:29:17 +00:00
|
|
|
|
2022-10-03 19:03:33 +00:00
|
|
|
Vector<ModuleRequest> const& requested_modules() const { return m_requested_modules; }
|
|
|
|
|
2022-01-18 18:29:17 +00:00
|
|
|
protected:
|
2022-10-02 19:18:33 +00:00
|
|
|
CyclicModule(Realm& realm, StringView filename, bool has_top_level_await, Vector<ModuleRequest> requested_modules, Script::HostDefined* host_defined);
|
2022-01-18 18:29:17 +00:00
|
|
|
|
2022-09-05 12:31:25 +00:00
|
|
|
virtual void visit_edges(Cell::Visitor&) override;
|
|
|
|
|
2023-08-13 10:53:46 +00:00
|
|
|
virtual ThrowCompletionOr<u32> inner_module_linking(VM& vm, Vector<Module*>& stack, u32 index) override final;
|
|
|
|
virtual ThrowCompletionOr<u32> inner_module_evaluation(VM& vm, Vector<Module*>& stack, u32 index) override final;
|
2022-01-18 18:29:17 +00:00
|
|
|
|
2022-05-02 18:54:39 +00:00
|
|
|
virtual ThrowCompletionOr<void> initialize_environment(VM& vm);
|
2022-10-02 11:11:30 +00:00
|
|
|
virtual ThrowCompletionOr<void> execute_module(VM& vm, GCPtr<PromiseCapability> capability = {});
|
2022-01-18 18:29:17 +00:00
|
|
|
|
2022-05-02 18:54:39 +00:00
|
|
|
void execute_async_module(VM& vm);
|
|
|
|
void gather_available_ancestors(Vector<CyclicModule*>& exec_list);
|
|
|
|
void async_module_execution_fulfilled(VM& vm);
|
|
|
|
void async_module_execution_rejected(VM& vm, Value error);
|
2022-01-18 18:29:17 +00:00
|
|
|
|
2023-02-26 23:09:02 +00:00
|
|
|
ModuleStatus m_status { ModuleStatus::Unlinked }; // [[Status]]
|
|
|
|
ThrowCompletionOr<void> m_evaluation_error; // [[EvaluationError]]
|
|
|
|
Optional<u32> m_dfs_index; // [[DFSIndex]]
|
|
|
|
Optional<u32> m_dfs_ancestor_index; // [[DFSAncestorIndex]]
|
|
|
|
Vector<ModuleRequest> m_requested_modules; // [[RequestedModules]]
|
|
|
|
GCPtr<CyclicModule> m_cycle_root; // [[CycleRoot]]
|
|
|
|
bool m_has_top_level_await { false }; // [[HasTLA]]
|
|
|
|
bool m_async_evaluation { false }; // [[AsyncEvaluation]]
|
|
|
|
GCPtr<PromiseCapability> m_top_level_capability; // [[TopLevelCapability]]
|
|
|
|
Vector<GCPtr<CyclicModule>> m_async_parent_modules; // [[AsyncParentModules]]
|
|
|
|
Optional<u32> m_pending_async_dependencies; // [[PendingAsyncDependencies]]
|
2022-01-18 18:29:17 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|