| 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();
|
|
|