diff --git a/Libraries/LibWeb/WebAssembly/WebAssembly.cpp b/Libraries/LibWeb/WebAssembly/WebAssembly.cpp index 4e633a9908b..8825f09b35d 100644 --- a/Libraries/LibWeb/WebAssembly/WebAssembly.cpp +++ b/Libraries/LibWeb/WebAssembly/WebAssembly.cpp @@ -560,10 +560,8 @@ JS::ThrowCompletionOr to_webassembly_value(JS::VM& vm, JS::Value va if (value.is_null()) return Wasm::Value(Wasm::ValueType { Wasm::ValueType::Kind::ExternReference }); auto& cache = get_cache(*vm.current_realm()); - for (auto& entry : cache.extern_values()) { - if (entry.value == value) - return Wasm::Value { Wasm::Reference { Wasm::Reference::Extern { entry.key } } }; - } + if (auto entry = cache.inverse_extern_values().get(value); entry.has_value()) + return Wasm::Value { Wasm::Reference { Wasm::Reference::Extern { *entry } } }; Wasm::ExternAddress extern_addr = cache.extern_values().size(); cache.add_extern_value(extern_addr, value); return Wasm::Value { Wasm::Reference { Wasm::Reference::Extern { extern_addr } } }; diff --git a/Libraries/LibWeb/WebAssembly/WebAssembly.h b/Libraries/LibWeb/WebAssembly/WebAssembly.h index dfc81a80fa2..27d776162b7 100644 --- a/Libraries/LibWeb/WebAssembly/WebAssembly.h +++ b/Libraries/LibWeb/WebAssembly/WebAssembly.h @@ -47,7 +47,13 @@ public: void add_compiled_module(NonnullRefPtr module) { m_compiled_modules.append(module); } void add_function_instance(Wasm::FunctionAddress address, GC::Ptr function) { m_function_instances.set(address, function); } void add_imported_object(GC::Ptr object) { m_imported_objects.set(object); } - void add_extern_value(Wasm::ExternAddress address, JS::Value value) { m_extern_values.set(address, value); } + void add_extern_value(Wasm::ExternAddress address, JS::Value value) + { + if (auto entry = m_extern_values.get(address); entry.has_value()) + m_inverse_extern_values.remove(entry.value()); + m_extern_values.set(address, value); + m_inverse_extern_values.set(value, address); + } void add_global_instance(Wasm::GlobalAddress address, GC::Ptr global) { m_global_instances.set(address, global); } Optional> get_function_instance(Wasm::FunctionAddress address) { return m_function_instances.get(address); } @@ -56,6 +62,7 @@ public: HashMap> function_instances() const { return m_function_instances; } HashMap extern_values() const { return m_extern_values; } + HashMap inverse_extern_values() const { return m_inverse_extern_values; } HashMap> global_instances() const { return m_global_instances; } HashTable> imported_objects() const { return m_imported_objects; } Wasm::AbstractMachine& abstract_machine() { return m_abstract_machine; } @@ -63,6 +70,7 @@ public: private: HashMap> m_function_instances; HashMap m_extern_values; + HashMap m_inverse_extern_values; HashMap> m_global_instances; Vector> m_compiled_modules; HashTable> m_imported_objects;