Procházet zdrojové kódy

Tests: Implement multi-value returns in test-wasm

Ali Mohammad Pur před 2 roky
rodič
revize
5bc1f135b7
1 změnil soubory, kde provedl 18 přidání a 11 odebrání
  1. 18 11
      Tests/LibWasm/test-wasm.cpp

+ 18 - 11
Tests/LibWasm/test-wasm.cpp

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