mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 01:17:34 +00:00
Tests: Implement multi-value returns in test-wasm
This commit is contained in:
parent
8a36d8826f
commit
5bc1f135b7
1 changed files with 18 additions and 11 deletions
|
@ -252,15 +252,22 @@ JS_DEFINE_NATIVE_FUNCTION(WebAssemblyModule::wasm_invoke)
|
|||
if (result.values().is_empty())
|
||||
return JS::js_null();
|
||||
|
||||
JS::Value return_value;
|
||||
result.values().first().value().visit(
|
||||
[&](auto const& value) { return_value = JS::Value(static_cast<double>(value)); },
|
||||
[&](i32 value) { return_value = JS::Value(static_cast<double>(value)); },
|
||||
[&](i64 value) { return_value = JS::Value(JS::BigInt::create(vm, Crypto::SignedBigInteger { value })); },
|
||||
[&](Wasm::Reference const& reference) {
|
||||
reference.ref().visit(
|
||||
[&](const Wasm::Reference::Null&) { return_value = JS::js_null(); },
|
||||
[&](const auto& ref) { return_value = JS::Value(static_cast<double>(ref.address.value())); });
|
||||
});
|
||||
return return_value;
|
||||
auto to_js_value = [&](Wasm::Value const& value) {
|
||||
return value.value().visit(
|
||||
[](auto const& value) { return JS::Value(static_cast<double>(value)); },
|
||||
[](i32 value) { return JS::Value(static_cast<double>(value)); },
|
||||
[&](i64 value) { return JS::Value(JS::BigInt::create(vm, Crypto::SignedBigInteger { value })); },
|
||||
[](Wasm::Reference const& reference) {
|
||||
return reference.ref().visit(
|
||||
[](const Wasm::Reference::Null&) { return JS::js_null(); },
|
||||
[](const auto& ref) { return JS::Value(static_cast<double>(ref.address.value())); });
|
||||
});
|
||||
};
|
||||
|
||||
if (result.values().size() == 1)
|
||||
return to_js_value(result.values().first());
|
||||
|
||||
return JS::Array::create_from<Wasm::Value>(*vm.current_realm(), result.values(), [&](Wasm::Value value) {
|
||||
return to_js_value(value);
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue