1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 00:07:36 +00:00

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

View file

@ -252,15 +252,22 @@ JS_DEFINE_NATIVE_FUNCTION(WebAssemblyModule::wasm_invoke)
if (result.values().is_empty()) if (result.values().is_empty())
return JS::js_null(); return JS::js_null();
JS::Value return_value; auto to_js_value = [&](Wasm::Value const& value) {
result.values().first().value().visit( return value.value().visit(
[&](auto const& value) { return_value = JS::Value(static_cast<double>(value)); }, [](auto const& value) { return JS::Value(static_cast<double>(value)); },
[&](i32 value) { return_value = JS::Value(static_cast<double>(value)); }, [](i32 value) { return JS::Value(static_cast<double>(value)); },
[&](i64 value) { return_value = JS::Value(JS::BigInt::create(vm, Crypto::SignedBigInteger { value })); }, [&](i64 value) { return JS::Value(JS::BigInt::create(vm, Crypto::SignedBigInteger { value })); },
[&](Wasm::Reference const& reference) { [](Wasm::Reference const& reference) {
reference.ref().visit( return reference.ref().visit(
[&](const Wasm::Reference::Null&) { return_value = JS::js_null(); }, [](const Wasm::Reference::Null&) { return JS::js_null(); },
[&](const auto& ref) { return_value = JS::Value(static_cast<double>(ref.address.value())); }); [](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);
}); });
return return_value;
} }