瀏覽代碼

LibJS: Add a barebones Module class

This corresponds to the "Abstract Module Record" from the spec.
Andreas Kling 3 年之前
父節點
當前提交
d553fd7f4f
共有 3 個文件被更改,包括 59 次插入0 次删除
  1. 1 0
      Userland/Libraries/LibJS/CMakeLists.txt
  2. 21 0
      Userland/Libraries/LibJS/Module.cpp
  3. 37 0
      Userland/Libraries/LibJS/Module.h

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

@@ -21,6 +21,7 @@ set(SOURCES
     Interpreter.cpp
     Interpreter.cpp
     Lexer.cpp
     Lexer.cpp
     MarkupGenerator.cpp
     MarkupGenerator.cpp
+    Module.cpp
     Parser.cpp
     Parser.cpp
     Runtime/AbstractOperations.cpp
     Runtime/AbstractOperations.cpp
     Runtime/AggregateError.cpp
     Runtime/AggregateError.cpp

+ 21 - 0
Userland/Libraries/LibJS/Module.cpp

@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibJS/Module.h>
+
+namespace JS {
+
+Module::Module(Realm& realm)
+    : m_vm(realm.vm())
+    , m_realm(make_handle(&realm))
+{
+}
+
+Module::~Module()
+{
+}
+
+}

+ 37 - 0
Userland/Libraries/LibJS/Module.h

@@ -0,0 +1,37 @@
+/*
+ * Copyright (c) 2021, Andreas Kling <kling@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibJS/Heap/Handle.h>
+#include <LibJS/Runtime/Realm.h>
+
+namespace JS {
+
+// 16.2.1.4 Abstract Module Records, https://tc39.es/ecma262/#sec-abstract-module-records
+class Module : public RefCounted<Module> {
+public:
+    virtual ~Module();
+
+    Realm& realm() { return *m_realm.cell(); }
+    Realm const& realm() const { return *m_realm.cell(); }
+
+    Environment* environment() { return m_environment.cell(); }
+    Object* namespace_() { return m_namespace.cell(); }
+
+protected:
+    explicit Module(Realm&);
+
+private:
+    // Handles are not safe unless we keep the VM alive.
+    NonnullRefPtr<VM> m_vm;
+
+    Handle<Realm> m_realm;             // [[Realm]]
+    Handle<Environment> m_environment; // [[Environment]]
+    Handle<Object> m_namespace;        // [[Namespace]]
+};
+
+}