WebAssembly: JSC::link* shouldn't need a CodeBlock
[WebKit-https.git] / JSTests / wasm / js-api / test_Instance.js
1 import * as assert from '../assert.js';
2 import Builder from '../Builder.js';
3
4 (function EmptyModule() {
5     const builder = new Builder();
6     const bin = builder.WebAssembly().get();
7     const module = new WebAssembly.Module(bin);
8     const instance = new WebAssembly.Instance(module);
9     assert.instanceof(instance, WebAssembly.Instance);
10 })();
11
12 (function ExportedAnswerI32() {
13     const builder = (new Builder())
14         .Type().End()
15         .Function().End()
16         .Export()
17             .Function("answer")
18         .End()
19         .Code()
20             .Function("answer", { params: [], ret: "i32" })
21                 .I32Const(42)
22                 .Return()
23             .End()
24         .End();
25     const bin = builder.WebAssembly().get();
26     const module = new WebAssembly.Module(bin);
27     const instance = new WebAssembly.Instance(module);
28     const result = instance.exports.answer();
29     assert.isA(result, "number");
30     assert.eq(result, 42);
31 })();
32
33 const wasmModuleWhichImportJS = () => {
34     const builder = (new Builder())
35         .Type().End()
36         .Import()
37             .Function("imp", "func", { params: ["i32"] })
38         .End()
39         .Function().End()
40         .Export()
41             .Function("changeCounter")
42         .End()
43         .Code()
44             .Function("changeCounter", { params: ["i32"] })
45                 .I32Const(42)
46                 .GetLocal(0)
47                 .I32Add()
48                 .Call(0) // Calls func(param[0] + 42).
49             .End()
50         .End();
51     const bin = builder.WebAssembly().get();
52     const module = new WebAssembly.Module(bin);
53     return module;
54 };
55
56 (function MonomorphicImport() {
57     let counter = 0;
58     const counterSetter = v => counter = v;
59     const module = wasmModuleWhichImportJS();
60     const instance = new WebAssembly.Instance(module, { imp: { func: counterSetter } });
61     for (let i = 0; i < 4096; ++i) {
62         // Invoke this a bunch of times to make sure the IC in the wasm -> JS stub works correctly.
63         instance.exports.changeCounter(i);
64         assert.eq(counter, i + 42);
65     }
66 })();
67
68 (function Polyphic2Import() {
69     let counterA = 0;
70     let counterB = undefined;
71     const counterASetter = v => counterA = v;
72     const counterBSetter = v => counterB = { valueB: v };
73     const module = wasmModuleWhichImportJS();
74     const instanceA = new WebAssembly.Instance(module, { imp: { func: counterASetter } });
75     const instanceB = new WebAssembly.Instance(module, { imp: { func: counterBSetter } });
76     for (let i = 0; i < 2048; ++i) {
77         instanceA.exports.changeCounter(i);
78         assert.isA(counterA, "number");
79         assert.eq(counterA, i + 42);
80         instanceB.exports.changeCounter(i);
81         assert.isA(counterB, "object");
82         assert.eq(counterB.valueB, i + 42);
83     }
84 })();
85
86 (function Polyphic3Import() {
87     let counterA = 0;
88     let counterB = undefined;
89     let counterC = undefined;
90     const counterASetter = v => counterA = v;
91     const counterBSetter = v => counterB = { valueB: v };
92     const counterCSetter = v => counterC = { valueC: v };
93     const module = wasmModuleWhichImportJS();
94     const instanceA = new WebAssembly.Instance(module, { imp: { func: counterASetter } });
95     const instanceB = new WebAssembly.Instance(module, { imp: { func: counterBSetter } });
96     const instanceC = new WebAssembly.Instance(module, { imp: { func: counterCSetter } });
97     for (let i = 0; i < 2048; ++i) {
98         instanceA.exports.changeCounter(i);
99         assert.isA(counterA, "number");
100         assert.eq(counterA, i + 42);
101         instanceB.exports.changeCounter(i);
102         assert.isA(counterB, "object");
103         assert.eq(counterB.valueB, i + 42);
104         instanceC.exports.changeCounter(i);
105         assert.isA(counterC, "object");
106         assert.eq(counterC.valueC, i + 42);
107     }
108 })();
109
110 (function VirtualImport() {
111     const num = 10; // It's definitely going virtual at 10!
112     let counters = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
113     const counterSetters = [
114         v => counters[0] = v,
115         v => counters[1] = v + 1,
116         v => counters[2] = v + 2,
117         v => counters[3] = v + 3,
118         v => counters[4] = v + 4,
119         v => counters[5] = v + 5,
120         v => counters[6] = v + 6,
121         v => counters[7] = v + 7,
122         v => counters[8] = v + 8,
123         v => counters[9] = v + 9,
124     ];
125     assert.eq(counters.length, num);
126     assert.eq(counterSetters.length, num);
127     const module = wasmModuleWhichImportJS();
128     let instances = [];
129     for (let i = 0; i < num; ++i)
130         instances[i] = new WebAssembly.Instance(module, { imp: { func: counterSetters[i] } });
131     for (let i = 0; i < 2048; ++i) {
132         for (let j = 0; j < num; ++j) {
133             instances[j].exports.changeCounter(i);
134             assert.isA(counters[j], "number");
135             assert.eq(counters[j], i + 42 + j);
136         }
137     }
138 })();