| 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)')`); |
| } |
| } |
| })(); |