Tests: Implement multi-value returns in test-wasm

This commit is contained in:
Ali Mohammad Pur 2023-02-25 11:44:43 +03:30 committed by Ali Mohammad Pur
parent 8a36d8826f
commit 5bc1f135b7
Notes: sideshowbarker 2024-07-17 07:48:42 +09:00

View file

@ -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);
});
}