blob: 0a7e98492fcf41fd1ed9eae0735eacc50f9953f7 [file] [log] [blame]
// 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);
})
})();