mirror of
https://github.com/tc39/test262.git
synced 2025-05-04 06:50:32 +02:00
* [javascriptcore-test262-automation] changes from git@github.com:WebKit/webkit.git at sha 949e26452cfa153a7f4afe593da97e2fe9e1b706 on Tue Jul 03 2018 14:35:15 GMT-0400 (Eastern Daylight Time)
106 lines
4.9 KiB
JavaScript
106 lines
4.9 KiB
JavaScript
import * as assert from '../assert.js';
|
|
import Builder from '../Builder.js';
|
|
|
|
const importName = "pierOne";
|
|
const types = ["i32", "i64", "f32", "f64", "void"];
|
|
const typesNonVoid = ["i32", "i64", "f32", "f64"];
|
|
const swapType = (type, index) => types[(types.indexOf(type) + index) % types.length];
|
|
const swapTypeNonVoid = (type, index) => typesNonVoid[(typesNonVoid.indexOf(type) + index) % typesNonVoid.length];
|
|
|
|
const signatures = [
|
|
{ params: ["i32"], ret: "void" },
|
|
{ params: ["i64"], ret: "void" },
|
|
{ params: ["f32"], ret: "void" },
|
|
{ params: ["f64"], ret: "void" },
|
|
{ params: ["i32"], ret: "i32" },
|
|
{ params: ["i64"], ret: "i64" },
|
|
{ params: ["f32"], ret: "f32" },
|
|
{ params: ["f64"], ret: "f64" },
|
|
{ params: ["i32", "f32"], ret: "i32" },
|
|
{ params: ["f32", "i32"], ret: "i32" },
|
|
{ params: ["i64", "f64"], ret: "i64" },
|
|
{ params: ["f64", "i64"], ret: "i64" },
|
|
{ params: ["i32", "f32", "i32"], ret: "i32" },
|
|
{ params: ["i32", "f32", "i32"], ret: "i32" },
|
|
{ params: ["i64", "f64", "i64"], ret: "i64" },
|
|
{ params: ["i64", "f64", "i64"], ret: "i64" },
|
|
{ params: Array(32).fill("i32"), ret: "i64" },
|
|
{ params: Array(32).fill("i64"), ret: "i64" },
|
|
{ params: Array(32).fill("f32"), ret: "i64" },
|
|
{ params: Array(32).fill("f64"), ret: "i64" },
|
|
];
|
|
|
|
const makeImporter = signature => {
|
|
const builder = (new Builder())
|
|
.Type().End()
|
|
.Import().Function("exports", importName, signature).End();
|
|
return new WebAssembly.Module(builder.WebAssembly().get());
|
|
};
|
|
|
|
const makeImportee = signature => {
|
|
const builder = (new Builder())
|
|
.Type().End()
|
|
.Function().End()
|
|
.Export()
|
|
.Function(importName)
|
|
.End()
|
|
.Code()
|
|
.Function(importName, signature);
|
|
switch (signature.ret) {
|
|
case "i32": builder.I32Const(0); break;
|
|
case "i64": builder.I64Const(0); break;
|
|
case "f32": builder.F32Const(0); break;
|
|
case "f64": builder.F64Const(0); break;
|
|
case "void": break;
|
|
}
|
|
return new WebAssembly.Instance(new WebAssembly.Module(builder.Return().End().End().WebAssembly().get()));
|
|
};
|
|
|
|
(function BadSignatureDropStartParams() {
|
|
for (let signature of signatures) {
|
|
const importee = makeImportee(signature);
|
|
for (let i = 1; i <= signature.params.length; ++i) {
|
|
const badParamSignature = { params: signature.params.slice(i, signature.params.length), ret: signature.ret };
|
|
const importer = makeImporter(badParamSignature);
|
|
assert.throws(() => new WebAssembly.Instance(importer, importee), WebAssembly.LinkError, `imported function exports:${importName} signature doesn't match the provided WebAssembly function's signature (evaluating 'new WebAssembly.Instance(importer, importee)')`);
|
|
}
|
|
}
|
|
})();
|
|
|
|
(function BadSignatureDropEndParams() {
|
|
for (let signature of signatures) {
|
|
const importee = makeImportee(signature);
|
|
for (let i = 1; i < signature.params.length; ++i) {
|
|
const badParamSignature = { params: signature.params.slice(0, i), ret: signature.ret };
|
|
const importer = makeImporter(badParamSignature);
|
|
assert.throws(() => new WebAssembly.Instance(importer, importee), WebAssembly.LinkError, `imported function exports:${importName} signature doesn't match the provided WebAssembly function's signature (evaluating 'new WebAssembly.Instance(importer, importee)')`);
|
|
}
|
|
}
|
|
})();
|
|
|
|
(function BadSignatureSwapParam() {
|
|
for (let signature of signatures) {
|
|
const importee = makeImportee(signature);
|
|
for (let signatureIndex = 0; signatureIndex < signature.length; ++signatureIndex) {
|
|
for (let typeIndex = 1; typeIndex < typesNonVoid.length; ++typeIndex) {
|
|
let badParams = signature.params.slice();
|
|
badParams[signatureIndex] = swapTypeNonVoid(badParams[signatureIndex], typeIndex);
|
|
const badParamSignature = { params: badParams, ret: signature.ret };
|
|
const importer = makeImporter(badParamSignature);
|
|
assert.throws(() => new WebAssembly.Instance(importer, importee), WebAssembly.LinkError, `imported function exports:${importName} signature doesn't match the provided WebAssembly function's signature (evaluating 'new WebAssembly.Instance(importer, importee)')`);
|
|
}
|
|
}
|
|
}
|
|
})();
|
|
|
|
(function BadSignatureRet() {
|
|
for (let signature of signatures) {
|
|
const importee = makeImportee(signature);
|
|
for (let typeIndex = 1; typeIndex < types.length; ++typeIndex) {
|
|
const badParamSignature = { params: signature.params, ret: swapType(signature.ret, typeIndex) };
|
|
const importer = makeImporter(badParamSignature);
|
|
assert.throws(() => new WebAssembly.Instance(importer, importee), WebAssembly.LinkError, `imported function exports:${importName} signature doesn't match the provided WebAssembly function's signature (evaluating 'new WebAssembly.Instance(importer, importee)')`);
|
|
}
|
|
}
|
|
})();
|