Index: test/mjsunit/wasm/grow-memory.js |
diff --git a/test/mjsunit/wasm/grow-memory.js b/test/mjsunit/wasm/grow-memory.js |
index 71eb4fec95a7971ab0b824480b66304ea565ef59..a42889684778d44c548c569b0b927e61985162fe 100644 |
--- a/test/mjsunit/wasm/grow-memory.js |
+++ b/test/mjsunit/wasm/grow-memory.js |
@@ -8,7 +8,7 @@ load("test/mjsunit/wasm/wasm-constants.js"); |
load("test/mjsunit/wasm/wasm-module-builder.js"); |
var kPageSize = 0x10000; |
-var kV8MaxPages = 16384; |
+var kV8MaxPages = 32767; |
function genGrowMemoryBuilder() { |
var builder = new WasmModuleBuilder(); |
@@ -298,9 +298,8 @@ function testGrowMemoryTrapMaxPagesZeroInitialMemory() { |
var builder = genGrowMemoryBuilder(); |
builder.addMemory(0, kV8MaxPages, false); |
var module = builder.instantiate(); |
- var maxPages = 16385; |
function growMem(pages) { return module.exports.grow_memory(pages); } |
- assertEquals(-1, growMem(maxPages)); |
+ assertEquals(-1, growMem(kV8MaxPages + 1)); |
} |
testGrowMemoryTrapMaxPagesZeroInitialMemory(); |
@@ -309,9 +308,8 @@ function testGrowMemoryTrapMaxPages() { |
var builder = genGrowMemoryBuilder(); |
builder.addMemory(1, 1, false); |
var module = builder.instantiate(); |
- var maxPages = 16384; |
function growMem(pages) { return module.exports.grow_memory(pages); } |
- assertEquals(-1, growMem(maxPages)); |
+ assertEquals(-1, growMem(kV8MaxPages)); |
} |
testGrowMemoryTrapMaxPages(); |
@@ -493,3 +491,54 @@ function testGrowMemoryDeclaredSpecMaxTraps() { |
} |
testGrowMemoryDeclaredSpecMaxTraps(); |
+ |
+function testGrowMemory2Gb() { |
+ print("testGrowMemory2Gb"); |
+ var builder = genGrowMemoryBuilder(); |
+ builder.addMemory(1, kV8MaxPages, false); |
+ var module = builder.instantiate(); |
+ var offset, val; |
+ function peek() { return module.exports.load(offset); } |
+ function poke(value) { return module.exports.store(offset, value); } |
+ function growMem(pages) { return module.exports.grow_memory(pages); } |
+ |
+ for(offset = 0; offset <= (kPageSize - 4); offset+=4) { |
+ poke(100000 - offset); |
+ assertEquals(100000 - offset, peek()); |
+ } |
+ |
+ let result = growMem(kV8MaxPages - 1); |
+ if (result == 1 ){ |
+ for(offset = 0; offset <= (kPageSize - 4); offset+=4) { |
+ assertEquals(100000 - offset, peek()); |
+ } |
+ |
+ // Bounds check for large mem size |
+ for(offset = (kV8MaxPages - 1) * kPageSize; |
+ offset <= (kV8MaxPages * kPageSize - 4); offset+=4) { |
+ poke(0xaced); |
+ assertEquals(0xaced, peek()); |
+ } |
+ |
+ for (offset = kV8MaxPages * kPageSize - 3; |
+ offset <= kV8MaxPages * kPageSize + 4; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, poke); |
+ } |
+ |
+ // Check traps around 3GB/4GB boundaries |
+ let offset_3gb = 49152 * kPageSize; |
+ let offset_4gb = 2 * kV8MaxPages * kPageSize; |
+ for (offset = offset_3gb - 5; offset < offset_3gb + 4; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, poke); |
+ } |
+ for (offset = offset_4gb - 5; offset < offset_4gb; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, poke); |
+ } |
+ } else { |
+ // Allocating big chunks of memory can fail on gc_stress, especially on 32 |
+ // bit platforms. When grow_memory fails, expected result is -1. |
+ assertEquals(-1, result); |
+ } |
+} |
+ |
+testGrowMemory2Gb(); |