diff options
author | Ali Mohammad Pur <ali.mpfard@gmail.com> | 2022-11-20 06:51:24 +0330 |
---|---|---|
committer | Ali Mohammad Pur <Ali.mpfard@gmail.com> | 2022-11-26 02:23:15 +0330 |
commit | af511a64cd9d9306f091f441fd0ba0f2c2a5365d (patch) | |
tree | e472774535aed78f142d1bff12dacf61db1f710b | |
parent | 0d1471e72f9b5869a76520921e6e7787dc4b7b3e (diff) | |
download | serenity-af511a64cd9d9306f091f441fd0ba0f2c2a5365d.zip |
LibWeb: Add support for accessing exported wasm table instances
3 files changed, 13 insertions, 0 deletions
diff --git a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyInstanceObject.cpp b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyInstanceObject.cpp index 7d937fe963..8fa738a005 100644 --- a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyInstanceObject.cpp +++ b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyInstanceObject.cpp @@ -14,6 +14,7 @@ #include <LibWeb/WebAssembly/WebAssemblyInstanceObject.h> #include <LibWeb/WebAssembly/WebAssemblyMemoryPrototype.h> #include <LibWeb/WebAssembly/WebAssemblyObject.h> +#include <LibWeb/WebAssembly/WebAssemblyTableObject.h> namespace Web::Bindings { @@ -51,6 +52,14 @@ void WebAssemblyInstanceObject::initialize(JS::Realm& realm) } m_exports_object->define_direct_property(export_.name(), *object, JS::default_attributes); }, + [&](Wasm::TableAddress const& address) { + Optional<WebAssemblyTableObject*> object = cache.table_instances.get(address); + if (!object.has_value()) { + object = heap().allocate<Web::Bindings::WebAssemblyTableObject>(realm, realm, address); + cache.table_instances.set(address, *object); + } + m_exports_object->define_direct_property(export_.name(), *object, JS::default_attributes); + }, [&](auto const&) { // FIXME: Implement other exports! }); diff --git a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp index b19f2e104e..4ce746fbe9 100644 --- a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp +++ b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp @@ -84,6 +84,8 @@ void WebAssemblyObject::visit_edges(Visitor& visitor) visitor.visit(entry.value); for (auto& entry : module_cache.memory_instances) visitor.visit(entry.value); + for (auto& entry : module_cache.table_instances) + visitor.visit(entry.value); } } diff --git a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.h b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.h index cb4f5fae1c..1641fefb1f 100644 --- a/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.h +++ b/Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.h @@ -14,6 +14,7 @@ namespace Web::Bindings { class WebAssemblyMemoryObject; +class WebAssemblyTableObject; JS::ThrowCompletionOr<size_t> parse_module(JS::VM&, JS::Object* buffer); JS::NativeFunction* create_native_function(JS::VM&, Wasm::FunctionAddress address, String const& name); JS::Value to_js_value(JS::VM&, Wasm::Value& wasm_value); @@ -47,6 +48,7 @@ public: struct ModuleCache { HashMap<Wasm::FunctionAddress, JS::FunctionObject*> function_instances; HashMap<Wasm::MemoryAddress, WebAssemblyMemoryObject*> memory_instances; + HashMap<Wasm::TableAddress, WebAssemblyTableObject*> table_instances; }; struct GlobalModuleCache { HashMap<Wasm::FunctionAddress, JS::NativeFunction*> function_instances; |