summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/wasm/ref-types/externref-global-object.js
blob: 806896e9b8502d482737983de9192b6208bbfaf7 (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
// |jit-test| skip-if: typeof WebAssembly.Global !== 'function'

// Dummy object.
function Baguette(calories) {
    this.calories = calories;
}

assertEq(new WebAssembly.Global({value: "externref"}) instanceof WebAssembly.Global, true);

(function() {
    // Test initialization without a value.
    let g = new WebAssembly.Global({value: "externref"});
    assertEq(g.value, void 0);
    assertErrorMessage(() => g.value = 42, TypeError, /immutable global/);
})();

(function() {
    // Test initialization with a value.
    let g = new WebAssembly.Global({value: "externref"}, null);
    assertEq(g.value, null);
    assertErrorMessage(() => g.value = 42, TypeError, /immutable global/);

    let obj = {};
    g = new WebAssembly.Global({value: "externref"}, obj);
    assertEq(g.value, obj);
    assertErrorMessage(() => g.value = 42, TypeError, /immutable global/);

    g = new WebAssembly.Global({value: "externref"}, 1337);
    assertEq(typeof g.value, "number");
    assertEq(+g.value, 1337);

    g = new WebAssembly.Global({value: "externref"}, 13.37);
    assertEq(typeof g.value, "number");
    assertEq(+g.value, 13.37);

    g = new WebAssembly.Global({value: "externref"}, "string");
    assertEq(typeof g.value, "string");
    assertEq(g.value.toString(), "string");

    g = new WebAssembly.Global({value: "externref"}, true);
    assertEq(typeof g.value, "boolean");
    assertEq(!!g.value, true);

    g = new WebAssembly.Global({value: "externref"}, Symbol("status"));
    assertEq(typeof g.value, "symbol");
    assertEq(g.value.toString(), "Symbol(status)");

    g = new WebAssembly.Global({value: "externref"}, undefined);
    assertEq(g.value, undefined);
})();

(function() {
    // Test mutable property and assignment.
    let g = new WebAssembly.Global({value: "externref", mutable: true}, null);
    assertEq(g.value, null);

    let obj = { x: 42 };
    g.value = obj;
    assertEq(g.value, obj);
    assertEq(g.value.x, 42);

    obj = null;
    assertEq(g.value.x, 42);

    let otherObj = { y : 35 };
    g.value = otherObj;
    assertEq(g.value, otherObj);
})();

(function() {
    // Test tracing.
    let nom = new Baguette(1);
    let g = new WebAssembly.Global({value: "externref"}, nom);
    nom = null;
    gc();
    assertEq(g.value.calories, 1);
})();

var global = new WebAssembly.Global({ value: "externref", mutable: true }, null);

// GCZeal mode 2 implies that every allocation (second parameter = every single
// allocation) will trigger a full GC.
gczeal(2, 1);

{
    let nomnom = new Baguette(42);
    global.value = nomnom;
    nomnom = null;
}
new Baguette();
assertEq(global.value.calories, 42);