mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-07-28 19:59:17 +00:00
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
This commit is contained in:
parent
d890be6e0f
commit
e8fd8982f8
Notes:
sideshowbarker
2024-07-17 04:41:05 +09:00
Author: https://github.com/dzfrias
Commit: e8fd8982f8
Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/521
Reviewed-by: https://github.com/alimpfard ✅
5 changed files with 26 additions and 8 deletions
|
@ -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;
|
||||||
|
|
|
@ -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>;
|
||||||
|
|
|
@ -971,7 +971,8 @@ struct InvocationOf<impl> {
|
||||||
FunctionType {
|
FunctionType {
|
||||||
move(arguments_types),
|
move(arguments_types),
|
||||||
{ ValueType(ValueType::I32) },
|
{ ValueType(ValueType::I32) },
|
||||||
});
|
},
|
||||||
|
function_name);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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:
|
case Wasm::ValueType::FunctionReference: {
|
||||||
// FIXME: What's the name of a function reference that isn't exported?
|
auto address = wasm_value.to<Wasm::Reference::Func>().value().address;
|
||||||
return create_native_function(vm, wasm_value.to<Wasm::Reference::Func>().value().address, "FIXME_IHaveNoIdeaWhatThisShouldBeCalled");
|
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();
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue