1import * as assert from '../assert.js';
2import Builder from '../Builder.js';
3
4const importName = "pierOne";
5const types = ["i32", "i64", "f32", "f64", "void"];
6const typesNonVoid = ["i32", "i64", "f32", "f64"];
7const swapType = (type, index) => types[(types.indexOf(type) + index) % types.length];
8const swapTypeNonVoid = (type, index) => typesNonVoid[(typesNonVoid.indexOf(type) + index) % typesNonVoid.length];
9
10const signatures = [
11 { params: ["i32"], ret: "void" },
12 { params: ["i64"], ret: "void" },
13 { params: ["f32"], ret: "void" },
14 { params: ["f64"], ret: "void" },
15 { params: ["i32"], ret: "i32" },
16 { params: ["i64"], ret: "i64" },
17 { params: ["f32"], ret: "f32" },
18 { params: ["f64"], ret: "f64" },
19 { params: ["i32", "f32"], ret: "i32" },
20 { params: ["f32", "i32"], ret: "i32" },
21 { params: ["i64", "f64"], ret: "i64" },
22 { params: ["f64", "i64"], ret: "i64" },
23 { params: ["i32", "f32", "i32"], ret: "i32" },
24 { params: ["i32", "f32", "i32"], ret: "i32" },
25 { params: ["i64", "f64", "i64"], ret: "i64" },
26 { params: ["i64", "f64", "i64"], ret: "i64" },
27 { params: Array(32).fill("i32"), ret: "i64" },
28 { params: Array(32).fill("i64"), ret: "i64" },
29 { params: Array(32).fill("f32"), ret: "i64" },
30 { params: Array(32).fill("f64"), ret: "i64" },
31];
32
33const makeImporter = signature => {
34 const builder = (new Builder())
35 .Type().End()
36 .Import().Function("exports", importName, signature).End();
37 return new WebAssembly.Module(builder.WebAssembly().get());
38};
39
40const makeImportee = signature => {
41 const builder = (new Builder())
42 .Type().End()
43 .Function().End()
44 .Export()
45 .Function(importName)
46 .End()
47 .Code()
48 .Function(importName, signature);
49 switch (signature.ret) {
50 case "i32": builder.I32Const(0); break;
51 case "i64": builder.I64Const(0); break;
52 case "f32": builder.F32Const(0); break;
53 case "f64": builder.F64Const(0); break;
54 case "void": break;
55 }
56 return new WebAssembly.Instance(new WebAssembly.Module(builder.Return().End().End().WebAssembly().get()));
57};
58
59(function BadSignatureDropStartParams() {
60 for (let signature of signatures) {
61 const importee = makeImportee(signature);
62 for (let i = 1; i <= signature.params.length; ++i) {
63 const badParamSignature = { params: signature.params.slice(i, signature.params.length), ret: signature.ret };
64 const importer = makeImporter(badParamSignature);
65 assert.throws(() => new WebAssembly.Instance(importer, importee), WebAssembly.LinkError, `imported function's signature mismatches the provided WebAssembly function's signature (evaluating 'new WebAssembly.Instance(importer, importee)')`);
66 }
67 }
68})();
69
70(function BadSignatureDropEndParams() {
71 for (let signature of signatures) {
72 const importee = makeImportee(signature);
73 for (let i = 1; i < signature.params.length; ++i) {
74 const badParamSignature = { params: signature.params.slice(0, i), ret: signature.ret };
75 const importer = makeImporter(badParamSignature);
76 assert.throws(() => new WebAssembly.Instance(importer, importee), WebAssembly.LinkError, `imported function's signature mismatches the provided WebAssembly function's signature (evaluating 'new WebAssembly.Instance(importer, importee)')`);
77 }
78 }
79})();
80
81(function BadSignatureSwapParam() {
82 for (let signature of signatures) {
83 const importee = makeImportee(signature);
84 for (let signatureIndex = 0; signatureIndex < signature.length; ++signatureIndex) {
85 for (let typeIndex = 1; typeIndex < typesNonVoid.length; ++typeIndex) {
86 let badParams = signature.params.slice();
87 badParams[signatureIndex] = swapTypeNonVoid(badParams[signatureIndex], typeIndex);
88 const badParamSignature = { params: badParams, ret: signature.ret };
89 const importer = makeImporter(badParamSignature);
90 assert.throws(() => new WebAssembly.Instance(importer, importee), WebAssembly.LinkError, `imported function's signature mismatches the provided WebAssembly function's signature (evaluating 'new WebAssembly.Instance(importer, importee)')`);
91 }
92 }
93 }
94})();
95
96(function BadSignatureRet() {
97 for (let signature of signatures) {
98 const importee = makeImportee(signature);
99 for (let typeIndex = 1; typeIndex < types.length; ++typeIndex) {
100 const badParamSignature = { params: signature.params, ret: swapType(signature.ret, typeIndex) };
101 const importer = makeImporter(badParamSignature);
102 assert.throws(() => new WebAssembly.Instance(importer, importee), WebAssembly.LinkError, `imported function's signature mismatches the provided WebAssembly function's signature (evaluating 'new WebAssembly.Instance(importer, importee)')`);
103 }
104 }
105})();