Переглянути джерело

LibWeb: Add support for accessing exported wasm table instances

Ali Mohammad Pur 2 роки тому
батько
коміт
af511a64cd

+ 9 - 0
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!
             });

+ 2 - 0
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);
     }
 }
 

+ 2 - 0
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;