// Copyright 2019 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Flags: --experimental-wasm-type-reflection --expose-gc --experimental-wasm-mv (function TestFunctionConstructedCoercions() { let obj1 = { valueOf: _ => 123.45 }; let obj2 = { toString: _ => "456" }; let gcer = { valueOf: _ => gc() }; let testcases = [ { params: { sig: [], val: [], exp: [], }, result: { sig: ["i32", "f32"], val: [42.7, "xyz"], exp: [42, NaN] }, }, { params: { sig: [], val: [], exp: [], }, result: { sig: ["i32", "f32", "f64"], val: (function* () { yield obj1; yield obj2; yield "789" })(), exp: [123, 456, 789], }, }, { params: { sig: [], val: [], exp: [], }, result: { sig: ["i32", "f32", "f64"], val: new Proxy([gcer, {}, "xyz"], { get: function(obj, prop) { return Reflect.get(obj, prop); } }), exp: [0, NaN, NaN], }, }, ]; testcases.forEach(function({params, result}) { let p = params.sig; let r = result.sig; var params_after; function testFun() { params_after = arguments; return result.val; } let fun = new WebAssembly.Function({parameters:p, results:r}, testFun); let result_after = fun.apply(undefined, params.val); assertArrayEquals(params.exp, params_after); assertEquals(result.exp, result_after); }); })(); (function TestFunctionConstructedCoercionsThrow() { let proxy_throw = new Proxy([1, 2], { get: function(obj, prop) { if (prop == 1) { throw new Error("abc"); } return Reflect.get(obj, prop); }, }); function* generator_throw() { yield 1; throw new Error("def"); } let testcases = [ { val: 0, error: Error, msg: /not iterable/ }, { val: [1], error: TypeError, msg: /multi-return length mismatch/ }, { val: [1, 2, 3], error: TypeError, msg: /multi-return length mismatch/ }, { val: proxy_throw, error: Error, msg: /abc/ }, { val: generator_throw(), error: Error, msg: /def/ }, ]; testcases.forEach(function({val, error, msg}) { fun = new WebAssembly.Function({parameters:[], results:["i32", "i32"]}, () => val); assertThrows(fun, error, msg); }) })();