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