[WASM-References] Rename anyfunc to funcref
[WebKit-https.git] / JSTests / wasm / references / anyref_table_import.js
1 import * as assert from '../assert.js';
2 import Builder from '../Builder.js';
3
4 {
5     function makeImport() {
6         const tbl = new WebAssembly.Table({initial:2, element:"anyref"});
7
8         const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
9           .Type().End()
10           .Import()
11                 .Table("imp", "tbl", {initial: 2, element: "anyref"})
12           .End()
13           .Function().End()
14           .Export()
15               .Function("set_tbl")
16               .Function("get_tbl")
17               .Function("tbl_is_null")
18               .Function("set_tbl_null")
19               .Table("tbl", 0)
20           .End()
21           .Code()
22             .Function("set_tbl", { params: ["anyref"], ret: "void" })
23               .I32Const(0)
24               .GetLocal(0)
25               .TableSet(0)
26             .End()
27
28             .Function("get_tbl", { params: [], ret: "anyref" })
29               .I32Const(0)
30               .TableGet(0)
31             .End()
32
33             .Function("tbl_is_null", { params: [], ret: "i32" })
34                 .Call(1)
35                 .RefIsNull()
36             .End()
37
38             .Function("set_tbl_null", { params: [], ret: "void" })
39                 .RefNull()
40                 .Call(0)
41             .End()
42           .End().WebAssembly().get()), { imp: { tbl }});
43         fullGC()
44         return $1
45     }
46
47     const $1 = makeImport()
48     fullGC()
49
50     assert.eq($1.exports.get_tbl(), null)
51     assert.eq($1.exports.tbl_is_null(), 1)
52
53     $1.exports.set_tbl("hi")
54     fullGC()
55     assert.eq($1.exports.get_tbl(), "hi")
56     assert.eq($1.exports.tbl_is_null(), 0)
57
58     assert.eq($1.exports.tbl.get(0), "hi")
59     assert.eq($1.exports.tbl.get(1), null)
60
61     $1.exports.tbl.set(0, { test: "test" });
62     fullGC()
63     assert.eq($1.exports.get_tbl().test, "test")
64
65     assert.eq($1.exports.tbl.grow(10), 2)
66     assert.eq($1.exports.tbl.grow(0), 12)
67     assert.eq($1.exports.get_tbl().test, "test")
68     fullGC()
69     assert.eq($1.exports.get_tbl().test, "test")
70 }
71
72 {
73     function makeImport() {
74         const $1 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
75           .Type().End()
76           .Import()
77                 .Table("imp", "tbl", {initial: 2, element: "anyref"})
78           .End()
79           .Function().End()
80           .Export()
81               .Function("set_tbl")
82               .Function("get_tbl")
83               .Function("tbl_is_null")
84               .Function("set_tbl_null")
85               .Table("tbl", 0)
86           .End()
87           .Code()
88             .Function("set_tbl", { params: ["anyref"], ret: "void" })
89               .I32Const(0)
90               .GetLocal(0)
91               .TableSet(0)
92             .End()
93
94             .Function("get_tbl", { params: [], ret: "anyref" })
95               .I32Const(0)
96               .TableGet(0)
97             .End()
98
99             .Function("tbl_is_null", { params: [], ret: "i32" })
100                 .Call(1)
101                 .RefIsNull()
102             .End()
103
104             .Function("set_tbl_null", { params: [], ret: "void" })
105                 .RefNull()
106                 .Call(0)
107             .End()
108           .End().WebAssembly().get()), { imp: { tbl: new WebAssembly.Table({initial:2, element:"anyref"}) }});
109         fullGC()
110
111         $1.exports.tbl.set(0, { test: "test" });
112
113         const $2 = new WebAssembly.Instance(new WebAssembly.Module((new Builder())
114           .Type().End()
115           .Import()
116                 .Table("imp", "tbl", {initial: 2, element: "anyref"})
117           .End()
118           .Function().End()
119           .Export()
120               .Function("set_tbl")
121               .Function("get_tbl")
122               .Function("tbl_is_null")
123               .Function("set_tbl_null")
124               .Table("tbl", 0)
125           .End()
126           .Code()
127             .Function("set_tbl", { params: ["anyref"], ret: "void" })
128               .I32Const(0)
129               .GetLocal(0)
130               .TableSet(0)
131             .End()
132
133             .Function("get_tbl", { params: [], ret: "anyref" })
134               .I32Const(0)
135               .TableGet(0)
136             .End()
137
138             .Function("tbl_is_null", { params: [], ret: "i32" })
139                 .Call(1)
140                 .RefIsNull()
141             .End()
142
143             .Function("set_tbl_null", { params: [], ret: "void" })
144                 .RefNull()
145                 .Call(0)
146             .End()
147           .End().WebAssembly().get()), { imp: { tbl: $1.exports.tbl }});
148         fullGC()
149
150         return $2
151     }
152
153     const $1 = makeImport()
154     fullGC()
155
156     assert.eq($1.exports.get_tbl().test, "test")
157     assert.eq($1.exports.tbl_is_null(), 0)
158
159     $1.exports.set_tbl("hi")
160     fullGC()
161     assert.eq($1.exports.get_tbl(), "hi")
162     assert.eq($1.exports.tbl_is_null(), 0)
163
164     assert.eq($1.exports.tbl.get(0), "hi")
165     assert.eq($1.exports.tbl.get(1), null)
166
167     $1.exports.tbl.set(0, { test: "test" });
168     fullGC()
169     assert.eq($1.exports.get_tbl().test, "test")
170
171     assert.eq($1.exports.tbl.grow(10), 2)
172     assert.eq($1.exports.tbl.grow(0), 12)
173     assert.eq($1.exports.get_tbl().test, "test")
174     fullGC()
175     assert.eq($1.exports.get_tbl().test, "test")
176 }
177
178 {
179     let tbl = new WebAssembly.Table({initial:1, element:"anyref"});
180
181     function doSet(i, v) {
182         tbl.set(i, { test: v });
183     }
184
185     function makeGarbage(depth) {
186         let garbage = { val: "hi", val2: 5, arr: [] }
187         for (let i=0; i<100; ++i) garbage.arr += ({ field: i })
188
189         if (depth < 5)
190             return 1 + makeGarbage(depth + 1);
191         return 0;
192     }
193
194     for (let iter=0; iter<5; ++iter) {
195         for (let k=0; k<100; ++k)
196             tbl = new WebAssembly.Table({initial:100, element:"anyref"})
197
198         for (let i=1; i<20; ++i) {
199             const len = tbl.length;
200             for (let j=0; j<len; ++j)
201                 doSet(j, j);
202             makeGarbage(0);
203             tbl.grow(Math.pow(2,i));
204             for (let j=0; j<len; ++j)
205                 assert.eq(tbl.get(j).test, j);
206             for (let j=0; j<tbl.length; ++j)
207                 doSet(j, -j);
208         }
209     }
210 }
211
212 {
213     const tbl = new WebAssembly.Table({initial:2, element:"funcref"});
214
215     const mod = new WebAssembly.Module((new Builder())
216       .Type().End()
217       .Import()
218             .Table("imp", "tbl", {initial: 2, element: "anyref"})
219       .End()
220       .Function().End()
221       .Export()
222       .End()
223       .Code()
224       .End().WebAssembly().get())
225
226     assert.throws(() => new WebAssembly.Instance(mod, { imp: { tbl }}), Error, "Table import imp:tbl provided a 'type' that is wrong (evaluating 'new WebAssembly.Instance(mod, { imp: { tbl }})')");
227 }
228
229 {
230     const tbl = new WebAssembly.Table({initial:2, element:"funcref"});
231
232     const mod = new WebAssembly.Module((new Builder())
233       .Type().End()
234       .Import()
235             .Table("imp", "tbl", {initial: 2, element: "anyref"})
236       .End()
237       .Function().End()
238       .Export()
239       .End()
240       .Code()
241       .End().WebAssembly().get())
242
243     assert.throws(() => new WebAssembly.Instance(mod, { imp: { tbl }}), Error, "Table import imp:tbl provided a 'type' that is wrong (evaluating 'new WebAssembly.Instance(mod, { imp: { tbl }})')");
244 }