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