Realm.h 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. /*
  2. * Copyright (c) 2021-2022, Linus Groh <linusg@serenityos.org>
  3. * Copyright (c) 2022, Andreas Kling <kling@serenityos.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 <LibJS/Bytecode/Builtins.h>
  13. #include <LibJS/Heap/Cell.h>
  14. #include <LibJS/Heap/CellAllocator.h>
  15. #include <LibJS/Runtime/Intrinsics.h>
  16. #include <LibJS/Runtime/Value.h>
  17. namespace JS {
  18. // 9.3 Realms, https://tc39.es/ecma262/#realm-record
  19. class Realm final
  20. : public Cell
  21. , public Weakable<Realm> {
  22. JS_CELL(Realm, Cell);
  23. JS_DECLARE_ALLOCATOR(Realm);
  24. public:
  25. struct HostDefined {
  26. virtual ~HostDefined() = default;
  27. virtual void visit_edges(Cell::Visitor&) { }
  28. };
  29. static ThrowCompletionOr<NonnullGCPtr<Realm>> create(VM&);
  30. static ThrowCompletionOr<NonnullOwnPtr<ExecutionContext>> initialize_host_defined_realm(VM&, Function<Object*(Realm&)> create_global_object, Function<Object*(Realm&)> create_global_this_value);
  31. void set_global_object(Object* global_object, Object* this_value);
  32. [[nodiscard]] Object& global_object() const { return *m_global_object; }
  33. [[nodiscard]] GlobalEnvironment& global_environment() const { return *m_global_environment; }
  34. [[nodiscard]] Intrinsics const& intrinsics() const { return *m_intrinsics; }
  35. [[nodiscard]] Intrinsics& intrinsics() { return *m_intrinsics; }
  36. void set_intrinsics(Badge<Intrinsics>, Intrinsics& intrinsics)
  37. {
  38. VERIFY(!m_intrinsics);
  39. m_intrinsics = &intrinsics;
  40. }
  41. HostDefined* host_defined() { return m_host_defined; }
  42. void set_host_defined(OwnPtr<HostDefined> host_defined) { m_host_defined = move(host_defined); }
  43. void define_builtin(Bytecode::Builtin builtin, Value value)
  44. {
  45. m_builtins[to_underlying(builtin)] = value;
  46. }
  47. Value get_builtin_value(Bytecode::Builtin builtin)
  48. {
  49. return m_builtins[to_underlying(builtin)];
  50. }
  51. static FlatPtr global_environment_offset() { return OFFSET_OF(Realm, m_global_environment); }
  52. static FlatPtr builtins_offset() { return OFFSET_OF(Realm, m_builtins); }
  53. private:
  54. Realm() = default;
  55. virtual void visit_edges(Visitor&) override;
  56. GCPtr<Intrinsics> m_intrinsics; // [[Intrinsics]]
  57. GCPtr<Object> m_global_object; // [[GlobalObject]]
  58. GCPtr<GlobalEnvironment> m_global_environment; // [[GlobalEnv]]
  59. OwnPtr<HostDefined> m_host_defined; // [[HostDefined]]
  60. AK::Array<Value, to_underlying(Bytecode::Builtin::__Count)> m_builtins;
  61. };
  62. }