CyclicModule.h 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. /*
  2. * Copyright (c) 2022, David Tuin <davidot@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <LibJS/AST.h>
  8. #include <LibJS/Forward.h>
  9. #include <LibJS/Module.h>
  10. #include <LibJS/Parser.h>
  11. #include <LibJS/Runtime/PromiseCapability.h>
  12. namespace JS {
  13. enum class ModuleStatus {
  14. Unlinked,
  15. Linking,
  16. Linked,
  17. Evaluating,
  18. EvaluatingAsync,
  19. Evaluated
  20. };
  21. // 16.2.1.5 Cyclic Module Records, https://tc39.es/ecma262/#sec-cyclic-module-records
  22. class CyclicModule : public Module {
  23. JS_CELL(CyclicModule, Module);
  24. public:
  25. // Note: Do not call these methods directly unless you are HostResolveImportedModule.
  26. // Badges cannot be used because other hosts must be able to call this (and it is called recursively)
  27. virtual ThrowCompletionOr<void> link(VM& vm) override;
  28. virtual ThrowCompletionOr<Promise*> evaluate(VM& vm) override;
  29. Vector<ModuleRequest> const& requested_modules() const { return m_requested_modules; }
  30. protected:
  31. CyclicModule(Realm& realm, StringView filename, bool has_top_level_await, Vector<ModuleRequest> requested_modules, Script::HostDefined* host_defined);
  32. virtual void visit_edges(Cell::Visitor&) override;
  33. virtual ThrowCompletionOr<u32> inner_module_linking(VM& vm, Vector<Module*>& stack, u32 index) override;
  34. virtual ThrowCompletionOr<u32> inner_module_evaluation(VM& vm, Vector<Module*>& stack, u32 index) override;
  35. virtual ThrowCompletionOr<void> initialize_environment(VM& vm);
  36. virtual ThrowCompletionOr<void> execute_module(VM& vm, GCPtr<PromiseCapability> capability = {});
  37. void execute_async_module(VM& vm);
  38. void gather_available_ancestors(Vector<CyclicModule*>& exec_list);
  39. void async_module_execution_fulfilled(VM& vm);
  40. void async_module_execution_rejected(VM& vm, Value error);
  41. ModuleStatus m_status { ModuleStatus::Unlinked }; // [[Status]]
  42. ThrowCompletionOr<void> m_evaluation_error; // [[EvaluationError]]
  43. Optional<u32> m_dfs_index; // [[DFSIndex]]
  44. Optional<u32> m_dfs_ancestor_index; // [[DFSAncestorIndex]]
  45. Vector<ModuleRequest> m_requested_modules; // [[RequestedModules]]
  46. CyclicModule* m_cycle_root { nullptr }; // [[CycleRoot]]
  47. bool m_has_top_level_await { false }; // [[HasTLA]]
  48. bool m_async_evaluation { false }; // [[AsyncEvaluation]]
  49. GCPtr<PromiseCapability> m_top_level_capability; // [[TopLevelCapability]]
  50. Vector<CyclicModule*> m_async_parent_modules; // [[AsyncParentModules]]
  51. Optional<u32> m_pending_async_dependencies; // [[PendingAsyncDependencies]]
  52. };
  53. }