1// Copyright 2015 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// Flags: --expose-wasm --expose-gc --stress-compaction 6 7load("test/mjsunit/wasm/wasm-constants.js"); 8load("test/mjsunit/wasm/wasm-module-builder.js"); 9 10var kMemSize = 65536; 11 12function genModule(memory) { 13 var builder = new WasmModuleBuilder(); 14 15 builder.addMemory(1, 1, true); 16 builder.addFunction("main", kSig_i_i) 17 .addBody([ 18 // main body: while(i) { if(mem[i]) return -1; i -= 4; } return 0; 19 kExprLoop, 20 kExprGetLocal,0, 21 kExprIf, 22 kExprGetLocal,0, 23 kExprI32LoadMem,0,0, 24 kExprIf, 25 kExprI8Const,255, 26 kExprReturn, kArity1, 27 kExprEnd, 28 kExprGetLocal,0, 29 kExprI8Const,4, 30 kExprI32Sub, 31 kExprSetLocal,0, 32 kExprBr, kArity1, 1, 33 kExprEnd, 34 kExprEnd, 35 kExprI8Const,0 36 ]) 37 .exportFunc(); 38 39 return builder.instantiate(null, memory); 40} 41 42function testPokeMemory() { 43 var module = genModule(null); 44 var buffer = module.exports.memory; 45 var main = module.exports.main; 46 assertEquals(kMemSize, buffer.byteLength); 47 48 var array = new Int8Array(buffer); 49 assertEquals(kMemSize, array.length); 50 51 for (var i = 0; i < kMemSize; i++) { 52 assertEquals(0, array[i]); 53 } 54 55 for (var i = 0; i < 10; i++) { 56 assertEquals(0, main(kMemSize - 4)); 57 58 array[kMemSize/2 + i] = 1; 59 assertEquals(0, main(kMemSize/2 - 4)); 60 assertEquals(-1, main(kMemSize - 4)); 61 62 array[kMemSize/2 + i] = 0; 63 assertEquals(0, main(kMemSize - 4)); 64 } 65} 66 67testPokeMemory(); 68 69function testSurvivalAcrossGc() { 70 var checker = genModule(null).exports.main; 71 for (var i = 0; i < 5; i++) { 72 print("gc run ", i); 73 assertEquals(0, checker(kMemSize - 4)); 74 gc(); 75 } 76} 77 78testSurvivalAcrossGc(); 79testSurvivalAcrossGc(); 80testSurvivalAcrossGc(); 81testSurvivalAcrossGc(); 82 83 84function testPokeOuterMemory() { 85 var buffer = new ArrayBuffer(kMemSize); 86 var module = genModule(buffer); 87 var main = module.exports.main; 88 assertEquals(kMemSize, buffer.byteLength); 89 90 var array = new Int8Array(buffer); 91 assertEquals(kMemSize, array.length); 92 93 for (var i = 0; i < kMemSize; i++) { 94 assertEquals(0, array[i]); 95 } 96 97 for (var i = 0; i < 10; i++) { 98 assertEquals(0, main(kMemSize - 4)); 99 100 array[kMemSize/2 + i] = 1; 101 assertEquals(0, main(kMemSize/2 - 4)); 102 assertEquals(-1, main(kMemSize - 4)); 103 104 array[kMemSize/2 + i] = 0; 105 assertEquals(0, main(kMemSize - 4)); 106 } 107} 108 109testPokeOuterMemory(); 110 111function testOuterMemorySurvivalAcrossGc() { 112 var buffer = new ArrayBuffer(kMemSize); 113 var checker = genModule(buffer).exports.main; 114 for (var i = 0; i < 5; i++) { 115 print("gc run ", i); 116 assertEquals(0, checker(kMemSize - 4)); 117 gc(); 118 } 119} 120 121testOuterMemorySurvivalAcrossGc(); 122testOuterMemorySurvivalAcrossGc(); 123testOuterMemorySurvivalAcrossGc(); 124testOuterMemorySurvivalAcrossGc(); 125 126 127function testOOBThrows() { 128 var builder = new WasmModuleBuilder(); 129 130 builder.addMemory(1, 1, true); 131 builder.addFunction("geti", kSig_i_ii) 132 .addBody([ 133 kExprGetLocal, 0, 134 kExprGetLocal, 1, 135 kExprI32LoadMem, 0, 0, 136 kExprI32StoreMem, 0, 0 137 ]) 138 .exportFunc(); 139 140 var module = builder.instantiate(); 141 var offset; 142 143 function read() { return module.exports.geti(0, offset); } 144 function write() { return module.exports.geti(offset, 0); } 145 146 for (offset = 0; offset < 65533; offset++) { 147 assertEquals(0, read()); 148 assertEquals(0, write()); 149 } 150 151 152 for (offset = 65534; offset < 66536; offset++) { 153 assertTraps(kTrapMemOutOfBounds, read); 154 assertTraps(kTrapMemOutOfBounds, write); 155 } 156} 157 158testOOBThrows(); 159