/* * Copyright (c) 2021-2022, Linus Groh * Copyright (c) 2022, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include #include #include #include namespace JS { // 9.3 Realms, https://tc39.es/ecma262/#realm-record class Realm final : public Cell { GC_CELL(Realm, Cell); GC_DECLARE_ALLOCATOR(Realm); public: struct HostDefined { virtual ~HostDefined() = default; virtual void visit_edges(Cell::Visitor&) { } template bool fast_is() const = delete; virtual bool is_principal_host_defined() const { return false; } virtual bool is_synthetic_host_defined() const { return false; } }; template GC::Ref create(Args&&... args) { auto object = heap().allocate(forward(args)...); static_cast(object)->initialize(*this); return *object; } static ThrowCompletionOr> initialize_host_defined_realm(VM&, Function create_global_object, Function create_global_this_value); [[nodiscard]] Object& global_object() const { return *m_global_object; } void set_global_object(GC::Ref global) { m_global_object = global; } [[nodiscard]] GlobalEnvironment& global_environment() const { return *m_global_environment; } void set_global_environment(GC::Ref environment) { m_global_environment = environment; } [[nodiscard]] Intrinsics const& intrinsics() const { return *m_intrinsics; } [[nodiscard]] Intrinsics& intrinsics() { return *m_intrinsics; } void set_intrinsics(Badge, Intrinsics& intrinsics) { VERIFY(!m_intrinsics); m_intrinsics = &intrinsics; } HostDefined* host_defined() { return m_host_defined; } HostDefined const* host_defined() const { return m_host_defined; } void set_host_defined(OwnPtr host_defined) { m_host_defined = move(host_defined); } void define_builtin(Bytecode::Builtin builtin, GC::Ref value) { m_builtins[to_underlying(builtin)] = value; } GC::Ref get_builtin_value(Bytecode::Builtin builtin) { return *m_builtins[to_underlying(builtin)]; } private: Realm() = default; virtual void visit_edges(Visitor&) override; GC::Ptr m_intrinsics; // [[Intrinsics]] GC::Ptr m_global_object; // [[GlobalObject]] GC::Ptr m_global_environment; // [[GlobalEnv]] OwnPtr m_host_defined; // [[HostDefined]] AK::Array, to_underlying(Bytecode::Builtin::__Count)> m_builtins; }; }