v8/test/mjsunit/wasm/memory64.js
Clemens Backes 43b8f03d2b [wasm][test] Fix memory64 test
There are fives bytes total which are expected to be different from
zero. We were only handling one of them when checking random positions
in the array. This was leading to random failures.

R=manoskouk@chromium.org

Bug: v8:11621
Change-Id: Iac231d8b35fcbfbbc837c8e9134401cb8a2519ac
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2810783
Reviewed-by: Manos Koukoutos <manoskouk@chromium.org>
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Cr-Commit-Position: refs/heads/master@{#73860}
2021-04-08 10:29:47 +00:00

114 lines
3.6 KiB
JavaScript

// Copyright 2021 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-memory64
load('test/mjsunit/wasm/wasm-module-builder.js');
// We use standard JavaScript doubles to represent bytes and offsets. They offer
// enough precision (53 bits) for every allowed memory size.
function BasicMemory64Tests(num_pages) {
const num_bytes = num_pages * kPageSize;
print(`Testing ${num_bytes} bytes (${num_pages} pages)`);
let builder = new WasmModuleBuilder();
builder.addMemory64(num_pages, num_pages, true);
builder.addFunction('load', makeSig([kWasmF64], [kWasmI32]))
.addBody([
kExprLocalGet, 0, // local.get 0
kExprI64UConvertF64, // i64.uconvert_sat.f64
kExprI32LoadMem, 0, 0, // i32.load_mem align=1 offset=0
])
.exportFunc();
builder.addFunction('store', makeSig([kWasmF64, kWasmI32], []))
.addBody([
kExprLocalGet, 0, // local.get 0
kExprI64UConvertF64, // i64.uconvert_sat.f64
kExprLocalGet, 1, // local.get 1
kExprI32StoreMem, 0, 0, // i32.store_mem align=1 offset=0
])
.exportFunc();
let module = builder.instantiate();
let memory = module.exports.memory;
let load = module.exports.load;
let store = module.exports.store;
let array = new Int8Array(memory.buffer);
assertEquals(num_bytes, array.length);
assertEquals(0, load(num_bytes - 4));
assertThrows(() => load(num_bytes - 3));
store(num_bytes - 4, 0x12345678);
assertEquals(0x12345678, load(num_bytes - 4));
let kStoreOffset = 27;
store(kStoreOffset, 11);
assertEquals(11, load(kStoreOffset));
// Now check 100 random positions.
for (let i = 0; i < 100; ++i) {
let position = Math.floor(Math.random() * num_bytes);
let expected = 0;
if (position == kStoreOffset) {
expected = 11;
} else if (num_bytes - position <= 4) {
expected = [0x12, 0x34, 0x56, 0x78][num_bytes - position - 1];
}
assertEquals(expected, array[position]);
}
}
(function TestSmallMemory() {
print(arguments.callee.name);
BasicMemory64Tests(4);
})();
(function Test3GBMemory() {
print(arguments.callee.name);
let num_pages = 3 * 1024 * 1024 * 1024 / kPageSize;
// This test can fail if 3GB of memory cannot be allocated.
try {
BasicMemory64Tests(num_pages);
} catch (e) {
assertInstanceof(e, RangeError);
assertMatches(/Out of memory/, e.message);
}
})();
// TODO(clemensb): Allow for memories >4GB and enable this test.
//(function Test5GBMemory() {
// print(arguments.callee.name);
// let num_pages = 5 * 1024 * 1024 * 1024 / kPageSize;
// BasicMemory64Tests(num_pages);
//})();
(function TestGrow64() {
print(arguments.callee.name);
let builder = new WasmModuleBuilder();
builder.addMemory64(1, 10, false);
builder.addFunction('grow', makeSig([kWasmI64], [kWasmI64]))
.addBody([
kExprLocalGet, 0, // local.get 0
kExprMemoryGrow, 0, // memory.grow 0
])
.exportFunc();
let instance = builder.instantiate();
assertEquals(1n, instance.exports.grow(2n));
assertEquals(3n, instance.exports.grow(1n));
assertEquals(-1n, instance.exports.grow(-1n));
assertEquals(-1n, instance.exports.grow(1n << 31n));
assertEquals(-1n, instance.exports.grow(1n << 32n));
assertEquals(-1n, instance.exports.grow(1n << 33n));
assertEquals(-1n, instance.exports.grow(1n << 63n));
assertEquals(-1n, instance.exports.grow(7n)); // Above the of 10.
assertEquals(4n, instance.exports.grow(6n)); // Just at the maximum of 10.
})();