summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/wasm/type-reflection-with-mv.js
diff options
context:
space:
mode:
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.js80
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);
+ })
+})();