Index: test/mjsunit/wasm/module-memory.js |
diff --git a/test/mjsunit/wasm/module-memory.js b/test/mjsunit/wasm/module-memory.js |
index a5e5f42488aad5c3dc0a9ab9673e2ca3229d1301..8c4300836db302cf6d03c2c576a5928985341e14 100644 |
--- a/test/mjsunit/wasm/module-memory.js |
+++ b/test/mjsunit/wasm/module-memory.js |
@@ -156,3 +156,154 @@ function testOOBThrows() { |
} |
testOOBThrows(); |
+ |
+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 < 65533; offset++) { |
+ poke(20); |
+ assertEquals(peek(), 20); |
+ } |
+ for (offset = 65534; offset < 66538; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, poke); |
+ assertTraps(kTrapMemOutOfBounds, peek); |
+ } |
+ |
+ assertEquals(growMem(3), 1); |
+ |
+ for (offset = 65534; offset < 262141; offset++) { |
+ poke(20); |
+ assertEquals(peek(), 20); |
+ } |
+ for (offset = 262142; offset < 262145; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, poke); |
+ assertTraps(kTrapMemOutOfBounds, peek); |
+ } |
+ |
+ assertEquals(growMem(15), 4); |
+ |
+ for (offset = 262142; offset < 262148; offset++) { |
+ poke(20); |
+ assertEquals(peek(), 20); |
+ } |
+ for (offset = 1245184; offset < 1245188; 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); |
+ |
+ assertEquals(growMem(1), 0); |
+ |
+ for(offset = 0; offset <=65533; offset++) { |
+ poke(20); |
+ assertEquals(peek(), 20); |
+ } |
+ |
+ //TODO(gdeepti): Fix tests with correct write boundaries |
+ //when runtime function is fixed. |
+ for(offset = 65536; offset <= 65539; 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(); |
+ |
+ |
+function testGrowMemoryOobThrows() { |
+ var builder = genGrowMemoryBuilder(); |
+ builder.addMemory(1, 1, false); |
+ builder.addFunction("geti", kSig_i_ii) |
+ .addBody([ |
+ kExprGetLocal, 0, |
+ kExprGetLocal, 1, |
+ kExprI32LoadMem, 0, 0, |
+ kExprI32StoreMem, 0, 0 |
+ ]) |
+ .exportFunc(); |
+ |
+ var module = builder.instantiate(); |
+ var offset; |
+ |
+ function read() { return module.exports.geti(0, offset); } |
+ function write() { return module.exports.geti(offset, 0); } |
+ |
+ for (offset = 0; offset < 65533; offset++) { |
+ assertEquals(0, read()); |
+ assertEquals(0, write()); |
+ } |
+ |
+ for (offset = 65534; offset < 66536; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, read); |
+ assertTraps(kTrapMemOutOfBounds, write); |
+ } |
+ |
+ function resizeMem() { return module.exports.grow_memory(2); } |
+ assertEquals(1, resizeMem()); |
+ |
+ for (offset = 0; offset < 196605; offset++) { |
+ assertEquals(0, read()); |
+ assertEquals(0, write()); |
+ } |
+ |
+ for (offset = 196605; offset < 196610; offset++) { |
+ assertTraps(kTrapMemOutOfBounds, read); |
+ assertTraps(kTrapMemOutOfBounds, write); |
+ } |
+ |
+} |
+ |
+testGrowMemoryOobThrows(); |