Source code

Revision control

Copy as Markdown

Other Tools

// |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);