Sfoglia il codice sorgente

LibWasm: Give names to functions exported to JS via `ref.func`

https://webassembly.github.io/spec/js-api/index.html#name-of-the-webassembly-function
Diego 1 anno fa
parent
commit
e8fd8982f8

+ 2 - 1
Tests/LibWasm/test-wasm.cpp

@@ -142,7 +142,8 @@ private:
                 // Noop, this just needs to exist.
                 // Noop, this just needs to exist.
                 return Wasm::Result { Vector<Wasm::Value> {} };
                 return Wasm::Result { Vector<Wasm::Value> {} };
             },
             },
-            type });
+            type,
+            "__TEST" });
     }
     }
 
 
     static HashMap<Wasm::Linker::Name, Wasm::ExternValue> s_spec_test_namespace;
     static HashMap<Wasm::Linker::Name, Wasm::ExternValue> s_spec_test_namespace;

+ 4 - 1
Userland/Libraries/LibWasm/AbstractMachine/AbstractMachine.h

@@ -348,18 +348,21 @@ private:
 
 
 class HostFunction {
 class HostFunction {
 public:
 public:
-    explicit HostFunction(AK::Function<Result(Configuration&, Vector<Value>&)> function, FunctionType const& type)
+    explicit HostFunction(AK::Function<Result(Configuration&, Vector<Value>&)> function, FunctionType const& type, ByteString name)
         : m_function(move(function))
         : m_function(move(function))
         , m_type(type)
         , m_type(type)
+        , m_name(move(name))
     {
     {
     }
     }
 
 
     auto& function() { return m_function; }
     auto& function() { return m_function; }
     auto& type() const { return m_type; }
     auto& type() const { return m_type; }
+    auto& name() const { return m_name; }
 
 
 private:
 private:
     AK::Function<Result(Configuration&, Vector<Value>&)> m_function;
     AK::Function<Result(Configuration&, Vector<Value>&)> m_function;
     FunctionType m_type;
     FunctionType m_type;
+    ByteString m_name;
 };
 };
 
 
 using FunctionInstance = Variant<WasmFunction, HostFunction>;
 using FunctionInstance = Variant<WasmFunction, HostFunction>;

+ 2 - 1
Userland/Libraries/LibWasm/WASI/Wasi.cpp

@@ -971,7 +971,8 @@ struct InvocationOf<impl> {
             FunctionType {
             FunctionType {
                 move(arguments_types),
                 move(arguments_types),
                 { ValueType(ValueType::I32) },
                 { ValueType(ValueType::I32) },
-            });
+            },
+            function_name);
     }
     }
 };
 };
 
 

+ 16 - 4
Userland/Libraries/LibWeb/WebAssembly/WebAssembly.cpp

@@ -219,7 +219,8 @@ JS::ThrowCompletionOr<NonnullOwnPtr<Wasm::ModuleInstance>> instantiate_module(JS
 
 
                             return Wasm::Result { move(wasm_values) };
                             return Wasm::Result { move(wasm_values) };
                         },
                         },
-                        type
+                        type,
+                        ByteString::formatted("func{}", resolved_imports.size()),
                     };
                     };
                     auto address = cache.abstract_machine().store().allocate(move(host_function));
                     auto address = cache.abstract_machine().store().allocate(move(host_function));
                     dbgln("Resolved to {}", address->value());
                     dbgln("Resolved to {}", address->value());
@@ -448,9 +449,20 @@ JS::Value to_js_value(JS::VM& vm, Wasm::Value& wasm_value)
         return JS::Value(wasm_value.to<double>().value());
         return JS::Value(wasm_value.to<double>().value());
     case Wasm::ValueType::F32:
     case Wasm::ValueType::F32:
         return JS::Value(static_cast<double>(wasm_value.to<float>().value()));
         return JS::Value(static_cast<double>(wasm_value.to<float>().value()));
-    case Wasm::ValueType::FunctionReference:
-        // FIXME: What's the name of a function reference that isn't exported?
-        return create_native_function(vm, wasm_value.to<Wasm::Reference::Func>().value().address, "FIXME_IHaveNoIdeaWhatThisShouldBeCalled");
+    case Wasm::ValueType::FunctionReference: {
+        auto address = wasm_value.to<Wasm::Reference::Func>().value().address;
+        auto& cache = get_cache(realm);
+        auto* function = cache.abstract_machine().store().get(address);
+        auto name = function->visit(
+            [&](Wasm::WasmFunction& wasm_function) {
+                auto index = *wasm_function.module().functions().find_first_index(address);
+                return ByteString::formatted("func{}", index);
+            },
+            [](Wasm::HostFunction& host_function) {
+                return host_function.name();
+            });
+        return create_native_function(vm, address, name);
+    }
     case Wasm::ValueType::V128:
     case Wasm::ValueType::V128:
     case Wasm::ValueType::ExternReference:
     case Wasm::ValueType::ExternReference:
         TODO();
         TODO();

+ 2 - 1
Userland/Utilities/wasm.cpp

@@ -695,7 +695,8 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
                             result.append(Wasm::Value { result_type, 0ull });
                             result.append(Wasm::Value { result_type, 0ull });
                         return Wasm::Result { move(result) };
                         return Wasm::Result { move(result) };
                     },
                     },
-                    type));
+                    type,
+                    entry.name));
                 exports.set(entry, *address);
                 exports.set(entry, *address);
             }
             }