Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(24)

Unified Diff: test/mjsunit/wasm/module-memory.js

Issue 2051043002: Implement Wasm GrowMemory opcode as a wasm runtime call (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix test failures Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/runtime/runtime-wasm.cc ('K') | « src/x64/assembler-x64.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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();
« src/runtime/runtime-wasm.cc ('K') | « src/x64/assembler-x64.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698