Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

// META: global=window,dedicatedworker,jsshell
// META: script=/wasm/jsapi/wasm-module-builder.js
let functions = {};
setup(() => {
const builder = new WasmModuleBuilder();
const structIndex = builder.addStruct([makeField(kWasmI32, true)]);
const arrayIndex = builder.addArray(kWasmI32, true);
const structRef = wasmRefType(structIndex);
const arrayRef = wasmRefType(arrayIndex);
builder
.addFunction("makeStruct", makeSig_r_v(structRef))
.addBody([...wasmI32Const(42),
...GCInstr(kExprStructNew), structIndex])
.exportFunc();
builder
.addFunction("makeArray", makeSig_r_v(arrayRef))
.addBody([...wasmI32Const(5), ...wasmI32Const(42),
...GCInstr(kExprArrayNew), arrayIndex])
.exportFunc();
const buffer = builder.toBuffer();
const module = new WebAssembly.Module(buffer);
const instance = new WebAssembly.Instance(module, {});
functions = instance.exports;
});
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_equals(struct.foo, undefined);
assert_equals(struct[0], undefined);
assert_equals(array.foo, undefined);
assert_equals(array[0], undefined);
}, "property access");
test(() => {
"use strict";
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_throws_js(TypeError, () => { struct.foo = 5; });
assert_throws_js(TypeError, () => { array.foo = 5; });
assert_throws_js(TypeError, () => { struct[0] = 5; });
assert_throws_js(TypeError, () => { array[0] = 5; });
}, "property assignment (strict mode)");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_throws_js(TypeError, () => { struct.foo = 5; });
assert_throws_js(TypeError, () => { array.foo = 5; });
assert_throws_js(TypeError, () => { struct[0] = 5; });
assert_throws_js(TypeError, () => { array[0] = 5; });
}, "property assignment (non-strict mode)");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_equals(Object.getOwnPropertyNames(struct).length, 0);
assert_equals(Object.getOwnPropertyNames(array).length, 0);
}, "ownPropertyNames");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_throws_js(TypeError, () => Object.defineProperty(struct, "foo", { value: 1 }));
assert_throws_js(TypeError, () => Object.defineProperty(array, "foo", { value: 1 }));
}, "defineProperty");
test(() => {
"use strict";
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_throws_js(TypeError, () => delete struct.foo);
assert_throws_js(TypeError, () => delete struct[0]);
assert_throws_js(TypeError, () => delete array.foo);
assert_throws_js(TypeError, () => delete array[0]);
}, "delete (strict mode)");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_throws_js(TypeError, () => delete struct.foo);
assert_throws_js(TypeError, () => delete struct[0]);
assert_throws_js(TypeError, () => delete array.foo);
assert_throws_js(TypeError, () => delete array[0]);
}, "delete (non-strict mode)");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_equals(Object.getPrototypeOf(struct), null);
assert_equals(Object.getPrototypeOf(array), null);
}, "getPrototypeOf");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_throws_js(TypeError, () => Object.setPrototypeOf(struct, {}));
assert_throws_js(TypeError, () => Object.setPrototypeOf(array, {}));
}, "setPrototypeOf");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_false(Object.isExtensible(struct));
assert_false(Object.isExtensible(array));
}, "isExtensible");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_throws_js(TypeError, () => Object.preventExtensions(struct));
assert_throws_js(TypeError, () => Object.preventExtensions(array));
}, "preventExtensions");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_throws_js(TypeError, () => Object.seal(struct));
assert_throws_js(TypeError, () => Object.seal(array));
}, "sealing");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_equals(typeof struct, "object");
assert_equals(typeof array, "object");
}, "typeof");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_throws_js(TypeError, () => struct.toString());
assert_equals(Object.prototype.toString.call(struct), "[object Object]");
assert_throws_js(TypeError, () => array.toString());
assert_equals(Object.prototype.toString.call(array), "[object Object]");
}, "toString");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
assert_throws_js(TypeError, () => struct.valueOf());
assert_equals(Object.prototype.valueOf.call(struct), struct);
assert_throws_js(TypeError, () => array.valueOf());
assert_equals(Object.prototype.valueOf.call(array), array);
}, "valueOf");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
const map = new Map();
map.set(struct, "struct");
map.set(array, "array");
assert_equals(map.get(struct), "struct");
assert_equals(map.get(array), "array");
}, "GC objects as map keys");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
const set = new Set();
set.add(struct);
set.add(array);
assert_true(set.has(struct));
assert_true(set.has(array));
}, "GC objects as set element");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
const map = new WeakMap();
map.set(struct, "struct");
map.set(array, "array");
assert_equals(map.get(struct), "struct");
assert_equals(map.get(array), "array");
}, "GC objects as weak map keys");
test(() => {
const struct = functions.makeStruct();
const array = functions.makeArray();
const set = new WeakSet();
set.add(struct);
set.add(array);
assert_true(set.has(struct));
assert_true(set.has(array));
}, "GC objects as weak set element");