Jelajahi Sumber

LibJS: Start adding a JS::Realm class (spec's "Realm Record")

Linus Groh 3 tahun lalu
induk
melakukan
d9c3bafcd9

+ 1 - 0
Userland/Libraries/LibJS/CMakeLists.txt

@@ -116,6 +116,7 @@ set(SOURCES
     Runtime/PropertyDescriptor.cpp
     Runtime/ProxyConstructor.cpp
     Runtime/ProxyObject.cpp
+    Runtime/Realm.cpp
     Runtime/Reference.cpp
     Runtime/ReflectObject.cpp
     Runtime/RegExpConstructor.cpp

+ 1 - 0
Userland/Libraries/LibJS/Forward.h

@@ -167,6 +167,7 @@ class PromiseResolveThenableJob;
 class PropertyAttributes;
 class PropertyDescriptor;
 class PropertyName;
+class Realm;
 class Reference;
 class ScopeNode;
 class Shape;

+ 17 - 0
Userland/Libraries/LibJS/Runtime/Realm.cpp

@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2021, Linus Groh <linusg@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibJS/Runtime/Realm.h>
+
+namespace JS {
+
+void Realm::visit_edges(Visitor& visitor)
+{
+    visitor.visit(m_global_object);
+    visitor.visit(m_global_environment);
+}
+
+}

+ 37 - 0
Userland/Libraries/LibJS/Runtime/Realm.h

@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2021, Linus Groh <linusg@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibJS/Heap/Cell.h>
+#include <LibJS/Runtime/GlobalEnvironment.h>
+#include <LibJS/Runtime/GlobalObject.h>
+
+namespace JS {
+
+// 9.3 Realms, https://tc39.es/ecma262/#realm-record
+class Realm final : public Cell {
+public:
+    Realm() = default;
+
+    // 9.3.1 CreateRealm ( ), https://tc39.es/ecma262/#sec-createrealm
+    static Realm* create(VM& vm)
+    {
+        return vm.heap().allocate_without_global_object<Realm>();
+    }
+
+    [[nodiscard]] GlobalObject& global_object() const { return *m_global_object; }
+    [[nodiscard]] GlobalEnvironment& global_environment() const { return *m_global_environment; }
+
+private:
+    virtual char const* class_name() const override { return "Realm"; }
+    virtual void visit_edges(Visitor&) override;
+
+    GlobalObject* m_global_object { nullptr };           // [[GlobalObject]]
+    GlobalEnvironment* m_global_environment { nullptr }; // [[GlobalEnv]]
+};
+
+}