diff options
Diffstat (limited to 'deps/v8/test/mjsunit/wasm/type-reflection-with-mv.js')
-rw-r--r-- | deps/v8/test/mjsunit/wasm/type-reflection-with-mv.js | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/wasm/type-reflection-with-mv.js b/deps/v8/test/mjsunit/wasm/type-reflection-with-mv.js new file mode 100644 index 0000000000..0a7e98492f --- /dev/null +++ b/deps/v8/test/mjsunit/wasm/type-reflection-with-mv.js @@ -0,0 +1,80 @@ +// 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); + }) +})(); |