summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/ref-types/tables-api.js
blob: a2ae3c45f0daff8463de52aa02c0aa66f2a28f72 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// Test changes to the WebAssembly.Table API by reference-types

function assertTableFilled(table, length, element) {
  assertEq(table.length, length);
  for (let i = 0; i < length; i++) {
    assertEq(table.get(i), element);
  }
}

const tableLength = 10;

// Test table constructor can accept a default value to fill elements to
for (let value of WasmExternrefValues) {
  let table = new WebAssembly.Table({'element': 'externref', initial: tableLength}, value);
  assertTableFilled(table, tableLength, value);
}
for (let value of WasmFuncrefValues) {
  let table = new WebAssembly.Table({'element': 'anyfunc', initial: tableLength}, value);
  assertTableFilled(table, tableLength, value);
}

// Test not specifying default value in constructor yields 'undefined' for externref
{
  let table = new WebAssembly.Table({'element': 'externref', initial: tableLength});
  assertTableFilled(table, tableLength, undefined);
}

// Test not specifying default value in constructor yields 'null' for funcref
{
  let table = new WebAssembly.Table({'element': 'anyfunc', initial: tableLength});
  assertTableFilled(table, tableLength, null);
}

// Test omitting the value in table set defaults to undefined for externref and
// null for funcref.
{
    let t = new WebAssembly.Table({element:"externref", initial: 1});
    // Clear out initial value
    t.set(0, '');
    // Set with an omitted value
    t.set(0);
    // Assert the omitted value is undefined
    assertEq(t.get(0), undefined);
}
{
    let t = new WebAssembly.Table({element:"anyfunc", initial: 1});
    // Clear out initial value
    t.set(0, WasmFuncrefValues[0]);
    // Set with an omitted value
    t.set(0);
    // Assert the omitted value is null
    assertEq(t.get(0), null);
}

// Test table grow. There is an optional fill argument that defaults to
// undefined with externref, and null with funcref.
{
    let t = new WebAssembly.Table({element:"externref", initial:0});
    t.grow(1);
    assertEq(t.get(t.length-1), undefined);
    let prev = undefined;
    for (let v of WasmExternrefValues) {
        t.grow(2, v);
        assertEq(t.get(t.length-3), prev);
        assertEq(t.get(t.length-2), v);

        assertEq(t.get(t.length-1), v);
        prev = v;
    }
}

{
    let t = new WebAssembly.Table({element:"anyfunc", initial:0});
    t.grow(1);
    assertEq(t.get(t.length-1), null);
    let prev = null;
    for (let v of WasmFuncrefValues) {
        t.grow(2, v);
        assertEq(t.get(t.length-3), prev);
        assertEq(t.get(t.length-2), v);

        assertEq(t.get(t.length-1), v);
        prev = v;
    }
}

// If growing by zero elements there are no spurious writes
{
    let t = new WebAssembly.Table({element:"externref", initial:1});
    t.set(0, 1337);
    t.grow(0, 1789);
    assertEq(t.get(0), 1337);
}