1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-14 07:54:58 +00:00

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.
This commit is contained in:
Andreas Kling 2023-12-03 14:21:21 +01:00
parent 5e67853b49
commit 99106df834
3 changed files with 8 additions and 5 deletions

View file

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

View file

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

View file

@ -31,6 +31,7 @@ public:
Realm& realm() { return *m_realm; }
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; }
HostDefined* host_defined() const { return m_host_defined; }