0ff3b4766423d372e5b9723dd2d7c83d8ff4284c
[WebKit-https.git] / JSTests / wasm / function-tests / table-basic.js
1 import Builder from '../Builder.js'
2 import * as assert from '../assert.js'
3
4 function makeInstance() {
5     const builder = new Builder()
6         .Type()
7             .Func(["i32", "i32"], "i32")
8             .Func(["i32"], "i32")
9         .End()
10         .Import()
11             .Table("imp", "table", {initial: 20, element: "anyfunc"})
12         .End()
13         .Function().End()
14         .Export()
15             .Function("foo")
16             .Function("bar")
17         .End()
18         .Code()
19             .Function("foo", 0 /*['i32', 'i32'] => 'i32'*/)
20                 .GetLocal(1) // parameter to call
21                 .GetLocal(0) // call index
22                 .CallIndirect(1, 0) // calling function of type ['i32'] => 'i32'
23                 .Return()
24             .End()
25             .Function("bar", 1 /*['i32'] => 'i32'*/)
26                 .GetLocal(0)
27                 .I32Const(42)
28                 .I32Add()
29                 .Return()
30             .End()
31         .End();
32
33
34     const bin = builder.WebAssembly().get();
35     const module = new WebAssembly.Module(bin);
36     const table = new WebAssembly.Table({initial: 20, element: "anyfunc"});
37     return {instance: new WebAssembly.Instance(module, {imp: {table}}), table};
38 }
39
40 {
41     const {instance, table} = makeInstance();
42     const exports = instance.exports;
43     const foo = exports.foo;
44     table.set(0, exports.bar);
45     assert.eq(table.get(0), exports.bar);
46
47     for (let i = 0; i < 1000; i++)
48         assert.eq(foo(0, i), i + 42, "call_indirect");
49 }
50
51 {
52     const {instance, table} = makeInstance();
53     const foo = instance.exports.foo;
54     table.set(0, makeInstance().instance.exports.bar); // Cross instance function.
55
56     for (let i = 0; i < 1000; i++)
57         assert.eq(foo(0, i), i + 42, "call_indirect");
58 }