blob: b4e6770f10ed9e3ad55b9ae18ee96deda3ff171e [file] [log] [blame]
// META: global=jsshell
test(() => {
const thisValues = [
undefined,
null,
true,
"",
Symbol(),
1,
{},
WebAssembly.Global,
WebAssembly.Global.prototype,
];
const desc = Object.getOwnPropertyDescriptor(WebAssembly.Global.prototype, "value");
assert_equals(typeof desc, "object");
const getter = desc.get;
assert_equals(typeof getter, "function");
const setter = desc.set;
assert_equals(typeof setter, "function");
for (const thisValue of thisValues) {
assert_throws(new TypeError(), () => getter.call(thisValue), `getter with this=${format_value(thisValue)}`);
assert_throws(new TypeError(), () => setter.call(thisValue, 1), `setter with this=${format_value(thisValue)}`);
}
}, "Branding");
for (const type of ["i32", "f32", "f64"]) {
const immutableOptions = [
[{}, "missing"],
[{ "mutable": undefined }, "undefined"],
[{ "mutable": null }, "null"],
[{ "mutable": false }, "false"],
[{ "mutable": "" }, "empty string"],
[{ "mutable": 0 }, "zero"],
];
for (const [opts, name] of immutableOptions) {
test(() => {
opts.value = type;
const global = new WebAssembly.Global(opts);
assert_equals(global.value, 0, "initial value");
assert_equals(global.valueOf(), 0, "initial valueOf");
assert_throws(new TypeError(), () => global.value = 1);
assert_equals(global.value, 0, "post-set value");
assert_equals(global.valueOf(), 0, "post-set valueOf");
}, `Immutable ${type} (${name})`);
}
const mutableOptions = [
[{ "mutable": true }, "true"],
[{ "mutable": 1 }, "one"],
[{ "mutable": "x" }, "string"],
[Object.create({ "mutable": true }), "true on prototype"],
];
for (const [opts, name] of mutableOptions) {
test(() => {
opts.value = type;
const global = new WebAssembly.Global(opts);
assert_equals(global.value, 0, "initial value");
assert_equals(global.valueOf(), 0, "initial valueOf");
global.value = 1;
assert_equals(global.value, 1, "post-set value");
assert_equals(global.valueOf(), 1, "post-set valueOf");
}, `Mutable ${type} (${name})`);
}
}
test(() => {
const argument = { "value": "i64", "mutable": true };
const global = new WebAssembly.Global(argument);
assert_throws(new TypeError(), () => global.value);
assert_throws(new TypeError(), () => global.value = 0);
assert_throws(new TypeError(), () => global.valueOf());
}, "i64 with default");
test(() => {
const argument = { "value": "i32", "mutable": true };
const global = new WebAssembly.Global(argument);
const desc = Object.getOwnPropertyDescriptor(WebAssembly.Global.prototype, "value");
assert_equals(typeof desc, "object");
const setter = desc.set;
assert_equals(typeof setter, "function");
assert_throws(new TypeError(), () => setter.call(global));
}, "Calling setter without argument");