Realm.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org>
  3. * Copyright (c) 2022, Andreas Kling <andreas@ladybird.org>
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include <AK/Badge.h>
  9. #include <AK/OwnPtr.h>
  10. #include <AK/StringView.h>
  11. #include <AK/Weakable.h>
  12. #include <LibGC/CellAllocator.h>
  13. #include <LibGC/Heap.h>
  14. #include <LibJS/Bytecode/Builtins.h>
  15. #include <LibJS/Heap/Cell.h>
  16. #include <LibJS/Runtime/Intrinsics.h>
  17. #include <LibJS/Runtime/Value.h>
  18. namespace JS {
  19. // 9.3 Realms, https://tc39.es/ecma262/#realm-record
  20. class Realm final : public Cell {
  21. GC_CELL(Realm, Cell);
  22. GC_DECLARE_ALLOCATOR(Realm);
  23. public:
  24. struct HostDefined {
  25. virtual ~HostDefined() = default;
  26. virtual void visit_edges(Cell::Visitor&) { }
  27. };
  28. template<typename T, typename... Args>
  29. GC::Ref<T> create(Args&&... args)
  30. {
  31. auto object = heap().allocate<T>(forward<Args>(args)...);
  32. static_cast<Cell*>(object)->initialize(*this);
  33. return *object;
  34. }
  35. static ThrowCompletionOr<NonnullOwnPtr<ExecutionContext>> initialize_host_defined_realm(VM&, Function<Object*(Realm&)> create_global_object, Function<Object*(Realm&)> create_global_this_value);
  36. [[nodiscard]] Object& global_object() const { return *m_global_object; }
  37. void set_global_object(GC::Ref<Object> global) { m_global_object = global; }
  38. [[nodiscard]] GlobalEnvironment& global_environment() const { return *m_global_environment; }
  39. void set_global_environment(GC::Ref<GlobalEnvironment> environment) { m_global_environment = environment; }
  40. [[nodiscard]] Intrinsics const& intrinsics() const { return *m_intrinsics; }
  41. [[nodiscard]] Intrinsics& intrinsics() { return *m_intrinsics; }
  42. void set_intrinsics(Badge<Intrinsics>, Intrinsics& intrinsics)
  43. {
  44. VERIFY(!m_intrinsics);
  45. m_intrinsics = &intrinsics;
  46. }
  47. HostDefined* host_defined() { return m_host_defined; }
  48. HostDefined const* host_defined() const { return m_host_defined; }
  49. void set_host_defined(OwnPtr<HostDefined> host_defined) { m_host_defined = move(host_defined); }
  50. void define_builtin(Bytecode::Builtin builtin, GC::Ref<NativeFunction> value)
  51. {
  52. m_builtins[to_underlying(builtin)] = value;
  53. }
  54. GC::Ref<NativeFunction> get_builtin_value(Bytecode::Builtin builtin)
  55. {
  56. return *m_builtins[to_underlying(builtin)];
  57. }
  58. private:
  59. Realm() = default;
  60. virtual void visit_edges(Visitor&) override;
  61. GC::Ptr<Intrinsics> m_intrinsics; // [[Intrinsics]]
  62. GC::Ptr<Object> m_global_object; // [[GlobalObject]]
  63. GC::Ptr<GlobalEnvironment> m_global_environment; // [[GlobalEnv]]
  64. OwnPtr<HostDefined> m_host_defined; // [[HostDefined]]
  65. AK::Array<GC::Ptr<NativeFunction>, to_underlying(Bytecode::Builtin::__Count)> m_builtins;
  66. };
  67. }