瀏覽代碼

LibJS: Add filename tracking to Script and Module

This will allow us to resolve modules dynamically loaded from a script.
davidot 3 年之前
父節點
當前提交
12c2f30c54

+ 2 - 1
Userland/Libraries/LibJS/Module.cpp

@@ -8,9 +8,10 @@
 
 namespace JS {
 
-Module::Module(Realm& realm)
+Module::Module(Realm& realm, StringView filename)
     : m_vm(realm.vm())
     , m_realm(make_handle(&realm))
+    , m_filename(filename)
 {
 }
 

+ 6 - 1
Userland/Libraries/LibJS/Module.h

@@ -19,11 +19,13 @@ public:
     Realm& realm() { return *m_realm.cell(); }
     Realm const& realm() const { return *m_realm.cell(); }
 
+    StringView filename() const { return m_filename; }
+
     Environment* environment() { return m_environment.cell(); }
     Object* namespace_() { return m_namespace.cell(); }
 
 protected:
-    explicit Module(Realm&);
+    explicit Module(Realm&, StringView filename);
 
 private:
     // Handles are not safe unless we keep the VM alive.
@@ -32,6 +34,9 @@ private:
     Handle<Realm> m_realm;             // [[Realm]]
     Handle<Environment> m_environment; // [[Environment]]
     Handle<Object> m_namespace;        // [[Namespace]]
+
+    // Needed for potential lookups of modules.
+    String m_filename;
 };
 
 }

+ 3 - 2
Userland/Libraries/LibJS/Script.cpp

@@ -23,13 +23,14 @@ Result<NonnullRefPtr<Script>, Vector<Parser::Error>> Script::parse(StringView so
         return parser.errors();
 
     // 3. Return Script Record { [[Realm]]: realm, [[ECMAScriptCode]]: body, [[HostDefined]]: hostDefined }.
-    return adopt_ref(*new Script(realm, move(body)));
+    return adopt_ref(*new Script(realm, filename, move(body)));
 }
 
-Script::Script(Realm& realm, NonnullRefPtr<Program> parse_node)
+Script::Script(Realm& realm, StringView filename, NonnullRefPtr<Program> parse_node)
     : m_vm(realm.vm())
     , m_realm(make_handle(&realm))
     , m_parse_node(move(parse_node))
+    , m_filename(filename)
 {
 }
 

+ 6 - 1
Userland/Libraries/LibJS/Script.h

@@ -24,14 +24,19 @@ public:
     Realm& realm() { return *m_realm.cell(); }
     Program const& parse_node() const { return *m_parse_node; }
 
+    StringView filename() const { return m_filename; }
+
 private:
-    Script(Realm&, NonnullRefPtr<Program>);
+    Script(Realm&, StringView filename, NonnullRefPtr<Program>);
 
     // Handles are not safe unless we keep the VM alive.
     NonnullRefPtr<VM> m_vm;
 
     Handle<Realm> m_realm;               // [[Realm]]
     NonnullRefPtr<Program> m_parse_node; // [[ECMAScriptCode]]
+
+    // Needed for potential lookups of modules.
+    String m_filename;
 };
 
 }

+ 4 - 4
Userland/Libraries/LibJS/SourceTextModule.cpp

@@ -9,7 +9,7 @@
 namespace JS {
 
 // 16.2.1.6.1 ParseModule ( sourceText, realm, hostDefined ), https://tc39.es/ecma262/#sec-parsemodule
-Result<NonnullRefPtr<SourceTextModule>, Vector<Parser::Error>> SourceTextModule::parse(StringView source_text, Realm& realm, [[maybe_unused]] StringView filename)
+Result<NonnullRefPtr<SourceTextModule>, Vector<Parser::Error>> SourceTextModule::parse(StringView source_text, Realm& realm, StringView filename)
 {
     // 1. Let body be ParseText(sourceText, Module).
     auto parser = Parser(Lexer(source_text, filename), Program::Type::Module);
@@ -20,11 +20,11 @@ Result<NonnullRefPtr<SourceTextModule>, Vector<Parser::Error>> SourceTextModule:
         return parser.errors();
 
     // FIXME: Implement the rest of ParseModule.
-    return adopt_ref(*new SourceTextModule(realm, move(body)));
+    return adopt_ref(*new SourceTextModule(realm, filename, move(body)));
 }
 
-SourceTextModule::SourceTextModule(Realm& realm, NonnullRefPtr<Program> program)
-    : Module(realm)
+SourceTextModule::SourceTextModule(Realm& realm, StringView filename, NonnullRefPtr<Program> program)
+    : Module(realm, filename)
     , m_ecmascript_code(move(program))
 {
 }

+ 1 - 1
Userland/Libraries/LibJS/SourceTextModule.h

@@ -22,7 +22,7 @@ public:
     Program const& parse_node() const { return *m_ecmascript_code; }
 
 private:
-    explicit SourceTextModule(Realm&, NonnullRefPtr<Program>);
+    explicit SourceTextModule(Realm&, StringView filename, NonnullRefPtr<Program>);
 
     NonnullRefPtr<Program> m_ecmascript_code; // [[ECMAScriptCode]]
 };