Procházet zdrojové kódy

LibJS: Update import referrer's [[LoadedModules]] in place

We were previously updating a copy of the list, which meant loading
could not proceed even after a module was loaded.
Andreas Kling před 1 rokem
rodič
revize
99106df834

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

@@ -38,6 +38,7 @@ public:
 
 
     Vector<ModuleRequest> const& requested_modules() const { return m_requested_modules; }
     Vector<ModuleRequest> const& requested_modules() const { return m_requested_modules; }
     Vector<ModuleWithSpecifier> const& loaded_modules() const { return m_loaded_modules; }
     Vector<ModuleWithSpecifier> const& loaded_modules() const { return m_loaded_modules; }
+    Vector<ModuleWithSpecifier>& loaded_modules() { return m_loaded_modules; }
 
 
 protected:
 protected:
     CyclicModule(Realm& realm, StringView filename, bool has_top_level_await, Vector<ModuleRequest> requested_modules, Script::HostDefined* host_defined);
     CyclicModule(Realm& realm, StringView filename, bool has_top_level_await, Vector<ModuleRequest> requested_modules, Script::HostDefined* host_defined);

+ 6 - 5
Userland/Libraries/LibJS/Module.cpp

@@ -73,12 +73,13 @@ void finish_loading_imported_module(ImportedModuleReferrer referrer, ModuleReque
     if (!result.is_error()) {
     if (!result.is_error()) {
         // NOTE: Only Script and CyclicModule referrers have the [[LoadedModules]] internal slot.
         // NOTE: Only Script and CyclicModule referrers have the [[LoadedModules]] internal slot.
         if (referrer.has<NonnullGCPtr<Script>>() || referrer.has<NonnullGCPtr<CyclicModule>>()) {
         if (referrer.has<NonnullGCPtr<Script>>() || referrer.has<NonnullGCPtr<CyclicModule>>()) {
-            auto loaded_modules = referrer.visit(
-                [](JS::NonnullGCPtr<JS::Script> script) -> Vector<ModuleWithSpecifier> { return script->loaded_modules(); },
-                [](JS::NonnullGCPtr<JS::CyclicModule> module) -> Vector<ModuleWithSpecifier> { return module->loaded_modules(); },
-                [](auto&) {
+            auto& loaded_modules = referrer.visit(
+                [](JS::NonnullGCPtr<JS::Realm>&) -> Vector<ModuleWithSpecifier>& {
                     VERIFY_NOT_REACHED();
                     VERIFY_NOT_REACHED();
-                    return Vector<ModuleWithSpecifier> {};
+                    __builtin_unreachable();
+                },
+                [](auto& script_or_module) -> Vector<ModuleWithSpecifier>& {
+                    return script_or_module->loaded_modules();
                 });
                 });
 
 
             bool found_record = false;
             bool found_record = false;

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

@@ -31,6 +31,7 @@ public:
 
 
     Realm& realm() { return *m_realm; }
     Realm& realm() { return *m_realm; }
     Program const& parse_node() const { return *m_parse_node; }
     Program const& parse_node() const { return *m_parse_node; }
+    Vector<ModuleWithSpecifier>& loaded_modules() { return m_loaded_modules; }
     Vector<ModuleWithSpecifier> const& loaded_modules() const { return m_loaded_modules; }
     Vector<ModuleWithSpecifier> const& loaded_modules() const { return m_loaded_modules; }
 
 
     HostDefined* host_defined() const { return m_host_defined; }
     HostDefined* host_defined() const { return m_host_defined; }