v8/test/mjsunit/wasm/shared-memory.js
Deepti Gandluri f7601238f1 [wasm] Allocate SAB when memory is shared
When shared memory is defined in the module bytes, and not imported/exported
underlying memory should be a SharedArrayBuffer. This was missing in the
allocate flow during instantiation. Fixed to use a SharedArrayBuffer.

BUG=v8:6532

Change-Id: Ic62ed3fd578a0e03124ee40b273e6a4ea474bba4
Reviewed-on: https://chromium-review.googlesource.com/835348
Reviewed-by: Eric Holk <eholk@chromium.org>
Reviewed-by: Ben Smith <binji@chromium.org>
Commit-Queue: Deepti Gandluri <gdeepti@chromium.org>
Cr-Commit-Position: refs/heads/master@{#50255}
2017-12-21 01:01:32 +00:00

133 lines
4.7 KiB
JavaScript

// 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-constants.js");
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));
})();