blob: 80e894b28f34fa622357878deec759a2b5e70e5d [file] [log] [blame]
// Copyright 2017 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --experimental-wasm-threads
load("test/mjsunit/wasm/wasm-module-builder.js");
function assertMemoryIsValid(memory, shared) {
assertSame(WebAssembly.Memory.prototype, memory.__proto__);
assertSame(WebAssembly.Memory, memory.constructor);
assertTrue(memory instanceof Object);
assertTrue(memory instanceof WebAssembly.Memory);
if (shared) {
assertTrue(memory.buffer instanceof SharedArrayBuffer);
// Assert that the buffer is frozen when memory is shared.
assertTrue(Object.isFrozen(memory.buffer));
}
}
(function TestConstructorWithShared() {
print("TestConstructorWithShared");
let memory = new WebAssembly.Memory({
initial: 0, maximum: 10, shared: true});
assertMemoryIsValid(memory, true);
})();
(function TestConstructorWithUndefinedShared() {
print("TestConstructorWithUndefinedShared");
// Maximum = undefined, shared = undefined.
let memory = new WebAssembly.Memory({
initial: 0, maximum: undefined, shared: undefined});
assertMemoryIsValid(memory);
})();
(function TestConstructorWithNumericShared() {
print("TestConstructorWithNumericShared");
// For numeric values, shared = true.
let memory = new WebAssembly.Memory({
initial: 0, maximum: 10, shared: 2098665});
assertMemoryIsValid(memory, true);
})();
(function TestConstructorWithEmptyStringShared() {
print("TestConstructorWithEmptyStringShared");
// Maximum = undefined, shared = false.
let memory = new WebAssembly.Memory({
initial: 0, maximum: undefined, shared: ""});
assertMemoryIsValid(memory);
})();
(function TestConstructorWithUndefinedMaxShared() {
print("TestConstructorWithUndefinedMaxShared");
// New memory with Maximum = undefined, shared = true => TypeError.
assertThrows(() => new WebAssembly.Memory({initial: 0, shared: true}),
TypeError);
})();
(function TestCompileWithUndefinedShared() {
print("TestCompileWithUndefinedShared");
let memory = new WebAssembly.Memory({
initial: 0, maximum: 10, shared: true});
let builder = new WasmModuleBuilder();
builder.addImportedMemory("m", "imported_mem", 0, undefined, "shared");
assertThrows(() => new WebAssembly.Module(builder.toBuffer()),
WebAssembly.CompileError);
})();
(function TestCompileAtomicOpUndefinedShared() {
print("TestCompileAtomicOpUndefinedShared");
let memory = new WebAssembly.Memory({
initial: 0, maximum: 10, shared: true});
let builder = new WasmModuleBuilder();
builder.addFunction("main", kSig_i_ii)
.addBody([
kExprGetLocal, 0,
kExprGetLocal, 1,
kAtomicPrefix,
kExprI32AtomicAdd]);
builder.addImportedMemory("m", "imported_mem");
assertThrows(() => new WebAssembly.Module(builder.toBuffer()),
WebAssembly.CompileError);
})();
(function TestInstantiateWithUndefinedShared() {
print("TestInstantiateWithUndefinedShared");
let memory = new WebAssembly.Memory({
initial: 0, maximum: 10, shared: true});
let builder = new WasmModuleBuilder();
builder.addImportedMemory("m", "imported_mem");
let module = new WebAssembly.Module(builder.toBuffer());
assertThrows(() => new WebAssembly.Instance(module,
{m: {imported_mem: memory}}), WebAssembly.LinkError);
})();
(function TestInstantiateWithImportNotSharedDefined() {
print("TestInstantiateWithImportNotSharedDefined");
let memory = new WebAssembly.Memory({
initial: 0, maximum: 10, shared: false});
let builder = new WasmModuleBuilder();
builder.addImportedMemory("m", "imported_mem", 0, 10, "shared");
let module = new WebAssembly.Module(builder.toBuffer());
assertThrows(() => new WebAssembly.Instance(module,
{m: {imported_mem: memory}}), WebAssembly.LinkError);
})();
(function TestInstantiateWithSharedDefined() {
print("TestInstantiateWithSharedDefined");
let builder = new WasmModuleBuilder();
builder.addMemory(2, 10, true, "shared");
let module = new WebAssembly.Module(builder.toBuffer());
let instance = new WebAssembly.Instance(module);
assertMemoryIsValid(instance.exports.memory, true);
})();
(function TestAtomicOpWithSharedMemoryDefined() {
print("TestAtomicOpWithSharedMemoryDefined");
let builder = new WasmModuleBuilder();
builder.addMemory(2, 10, false, "shared");
builder.addFunction("main", kSig_i_ii)
.addBody([
kExprGetLocal, 0,
kExprGetLocal, 1,
kAtomicPrefix,
kExprI32AtomicAdd, 2, 0])
.exportFunc();
let module = new WebAssembly.Module(builder.toBuffer());
let instance = new WebAssembly.Instance(module);
assertEquals(0, instance.exports.main(0, 0x11111111));
assertEquals(0x11111111, instance.exports.main(0, 0x11111111));
})();
(function TestMemoryConstructorShouldNotCallHasProperty() {
print(arguments.callee.name);
// from test/wasm-js/data/test/js-api/memory/constructor.any.js
const proxy = new Proxy({}, {
has(o, x) {
throw new Error(`Should not call [[HasProperty]] with ${x}`);
},
get(o, x) {
return 0;
},
});
new WebAssembly.Memory(proxy);
})();