Index: test/mjsunit/wasm/grow-memory.js |
diff --git a/test/mjsunit/wasm/grow-memory.js b/test/mjsunit/wasm/grow-memory.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cb90a464825e6c07becb771624422e95d8267192 |
--- /dev/null |
+++ b/test/mjsunit/wasm/grow-memory.js |
@@ -0,0 +1,137 @@ |
+// Copyright 2016 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: --expose-wasm --expose-gc --stress-compaction |
+ |
+load("test/mjsunit/wasm/wasm-constants.js"); |
+load("test/mjsunit/wasm/wasm-module-builder.js"); |
+ |
+var kPageSize = 0x10000; |
+ |
+function genGrowMemoryBuilder() { |
+ var builder = new WasmModuleBuilder(); |
+ builder.addFunction("grow_memory", kSig_i_i) |
+ .addBody([kExprGetLocal, 0, kExprGrowMemory]) |
+ .exportFunc(); |
+ builder.addFunction("load", kSig_i_i) |
+ .addBody([kExprGetLocal, 0, kExprI32LoadMem, 0, 0]) |
+ .exportFunc(); |
+ builder.addFunction("store", kSig_i_ii) |
+ .addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprI32StoreMem, 0, 0]) |
+ .exportFunc(); |
+ return builder; |
+} |
+ |
+function testGrowMemoryReadWrite() { |
+ var builder = genGrowMemoryBuilder(); |
+ builder.addMemory(1, 1, false); |
+ var module = builder.instantiate(); |
+ var offset; |
+ 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++) { |
+ poke(20); |
+ assertEquals(peek(), 20); |
+ } |
+ for (offset = kPageSize - 3; offset < kPageSize + 4; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, poke); |
+ assertTraps(kTrapMemOutOfBounds, peek); |
+ } |
+ |
+ try { |
+ assertEquals(growMem(3), 1); |
+ } catch (e) { |
+ assertEquals("object", typeof e); |
+ assertEquals(e.message, kTrapMsgs[kTrapMemAllocationFail]); |
+ return; |
+ } |
+ |
+ for (offset = kPageSize; offset <= 4*kPageSize -4; offset++) { |
+ poke(20); |
+ assertEquals(peek(), 20); |
+ } |
+ for (offset = 4*kPageSize - 3; offset < 4*kPageSize + 4; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, poke); |
+ assertTraps(kTrapMemOutOfBounds, peek); |
+ } |
+ |
+ try { |
+ assertEquals(growMem(15), 4); |
+ } catch (e) { |
+ assertEquals("object", typeof e); |
+ assertEquals(e.message, kTrapMsgs[kTrapMemAllocationFail]); |
+ return; |
+ } |
+ |
+ for (offset = 4*kPageSize - 3; offset <= 4*kPageSize + 4; offset++) { |
+ poke(20); |
+ assertEquals(peek(), 20); |
+ } |
+ for (offset = 19*kPageSize - 10; offset <= 19*kPageSize - 4; offset++) { |
+ poke(20); |
+ assertEquals(peek(), 20); |
+ } |
+ for (offset = 19*kPageSize - 3; offset < 19*kPageSize + 5; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, poke); |
+ assertTraps(kTrapMemOutOfBounds, peek); |
+ } |
+} |
+ |
+testGrowMemoryReadWrite(); |
+ |
+function testGrowMemoryZeroInitialSize() { |
+ var builder = genGrowMemoryBuilder(); |
+ var module = builder.instantiate(); |
+ var offset; |
+ 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); } |
+ |
+ assertTraps(kTrapMemOutOfBounds, peek); |
+ assertTraps(kTrapMemOutOfBounds, poke); |
+ |
+ try { |
+ assertEquals(growMem(1), 0); |
+ } catch (e) { |
+ assertEquals("object", typeof e); |
+ assertEquals(e.message, kTrapMsgs[kTrapMemAllocationFail]); |
+ return; |
+ } |
+ |
+ for(offset = 0; offset <= kPageSize - 4; offset++) { |
+ poke(20); |
+ assertEquals(peek(), 20); |
+ } |
+ |
+ //TODO(gdeepti): Fix tests with correct write boundaries |
+ //when runtime function is fixed. |
+ for(offset = kPageSize; offset <= kPageSize + 5; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, peek); |
+ } |
+} |
+ |
+testGrowMemoryZeroInitialSize(); |
+ |
+function testGrowMemoryTrapMaxPagesZeroInitialMemory() { |
+ var builder = genGrowMemoryBuilder(); |
+ var module = builder.instantiate(); |
+ var maxPages = 16385; |
+ function growMem() { return module.exports.grow_memory(maxPages); } |
+ assertTraps(kTrapMemOutOfBounds, growMem); |
+} |
+ |
+testGrowMemoryTrapMaxPagesZeroInitialMemory(); |
+ |
+function testGrowMemoryTrapMaxPages() { |
+ var builder = genGrowMemoryBuilder(); |
+ builder.addMemory(1, 1, false); |
+ var module = builder.instantiate(); |
+ var maxPages = 16384; |
+ function growMem() { return module.exports.grow_memory(maxPages); } |
+ assertTraps(kTrapMemOutOfBounds, growMem); |
+} |
+ |
+testGrowMemoryTrapMaxPages(); |