summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAli Mohammad Pur <ali.mpfard@gmail.com>2022-11-20 06:51:24 +0330
committerAli Mohammad Pur <Ali.mpfard@gmail.com>2022-11-26 02:23:15 +0330
commitaf511a64cd9d9306f091f441fd0ba0f2c2a5365d (patch)
treee472774535aed78f142d1bff12dacf61db1f710b
parent0d1471e72f9b5869a76520921e6e7787dc4b7b3e (diff)
downloadserenity-af511a64cd9d9306f091f441fd0ba0f2c2a5365d.zip
LibWeb: Add support for accessing exported wasm table instances
-rw-r--r--Userland/Libraries/LibWeb/WebAssembly/WebAssemblyInstanceObject.cpp9
-rw-r--r--Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.cpp2
-rw-r--r--Userland/Libraries/LibWeb/WebAssembly/WebAssemblyObject.h2
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;