| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 // Flags: --expose-wasm --stress-compaction | 5 // Flags: --expose-wasm --stress-compaction |
| 6 | 6 |
| 7 load("test/mjsunit/wasm/wasm-constants.js"); | 7 load("test/mjsunit/wasm/wasm-constants.js"); |
| 8 load("test/mjsunit/wasm/wasm-module-builder.js"); | 8 load("test/mjsunit/wasm/wasm-module-builder.js"); |
| 9 | 9 |
| 10 var kPageSize = 0x10000; | 10 var kPageSize = 0x10000; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 35 builder.addFunction("store8", kSig_i_ii) | 35 builder.addFunction("store8", kSig_i_ii) |
| 36 .addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprI32StoreMem8, 0, 0, | 36 .addBody([kExprGetLocal, 0, kExprGetLocal, 1, kExprI32StoreMem8, 0, 0, |
| 37 kExprGetLocal, 1]) | 37 kExprGetLocal, 1]) |
| 38 .exportFunc(); | 38 .exportFunc(); |
| 39 return builder; | 39 return builder; |
| 40 } | 40 } |
| 41 | 41 |
| 42 // TODO(gdeepti): Generate tests programatically for all the sizes instead of | 42 // TODO(gdeepti): Generate tests programatically for all the sizes instead of |
| 43 // current implementation. | 43 // current implementation. |
| 44 function testGrowMemoryReadWrite32() { | 44 function testGrowMemoryReadWrite32() { |
| 45 print('testGrowMemoryReadWrite32'); |
| 45 var builder = genGrowMemoryBuilder(); | 46 var builder = genGrowMemoryBuilder(); |
| 46 builder.addMemory(1, kV8MaxPages, false); | 47 builder.addMemory(1, kV8MaxPages, false); |
| 47 var module = builder.instantiate(); | 48 var module = builder.instantiate(); |
| 48 var offset; | 49 var offset; |
| 49 function peek() { return module.exports.load(offset); } | 50 function peek() { return module.exports.load(offset); } |
| 50 function poke(value) { return module.exports.store(offset, value); } | 51 function poke(value) { return module.exports.store(offset, value); } |
| 51 function growMem(pages) { return module.exports.grow_memory(pages); } | 52 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 52 | 53 |
| 53 for(offset = 0; offset <= (kPageSize - 4); offset+=4) { | 54 for(offset = 0; offset <= (kPageSize - 4); offset+=4) { |
| 54 poke(20); | 55 poke(20); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 82 } | 83 } |
| 83 for (offset = 19*kPageSize - 3; offset < 19*kPageSize + 5; offset++) { | 84 for (offset = 19*kPageSize - 3; offset < 19*kPageSize + 5; offset++) { |
| 84 assertTraps(kTrapMemOutOfBounds, poke); | 85 assertTraps(kTrapMemOutOfBounds, poke); |
| 85 assertTraps(kTrapMemOutOfBounds, peek); | 86 assertTraps(kTrapMemOutOfBounds, peek); |
| 86 } | 87 } |
| 87 } | 88 } |
| 88 | 89 |
| 89 testGrowMemoryReadWrite32(); | 90 testGrowMemoryReadWrite32(); |
| 90 | 91 |
| 91 function testGrowMemoryReadWrite16() { | 92 function testGrowMemoryReadWrite16() { |
| 93 print('testGrowMemoryReadWrite16'); |
| 92 var builder = genGrowMemoryBuilder(); | 94 var builder = genGrowMemoryBuilder(); |
| 93 builder.addMemory(1, kV8MaxPages, false); | 95 builder.addMemory(1, kV8MaxPages, false); |
| 94 var module = builder.instantiate(); | 96 var module = builder.instantiate(); |
| 95 var offset; | 97 var offset; |
| 96 function peek() { return module.exports.load16(offset); } | 98 function peek() { return module.exports.load16(offset); } |
| 97 function poke(value) { return module.exports.store16(offset, value); } | 99 function poke(value) { return module.exports.store16(offset, value); } |
| 98 function growMem(pages) { return module.exports.grow_memory(pages); } | 100 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 99 | 101 |
| 100 for(offset = 0; offset <= (kPageSize - 2); offset+=2) { | 102 for(offset = 0; offset <= (kPageSize - 2); offset+=2) { |
| 101 poke(20); | 103 poke(20); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 129 } | 131 } |
| 130 for (offset = 19*kPageSize - 1; offset < 19*kPageSize + 5; offset++) { | 132 for (offset = 19*kPageSize - 1; offset < 19*kPageSize + 5; offset++) { |
| 131 assertTraps(kTrapMemOutOfBounds, poke); | 133 assertTraps(kTrapMemOutOfBounds, poke); |
| 132 assertTraps(kTrapMemOutOfBounds, peek); | 134 assertTraps(kTrapMemOutOfBounds, peek); |
| 133 } | 135 } |
| 134 } | 136 } |
| 135 | 137 |
| 136 testGrowMemoryReadWrite16(); | 138 testGrowMemoryReadWrite16(); |
| 137 | 139 |
| 138 function testGrowMemoryReadWrite8() { | 140 function testGrowMemoryReadWrite8() { |
| 141 print('testGrowMemoryReadWrite8'); |
| 139 var builder = genGrowMemoryBuilder(); | 142 var builder = genGrowMemoryBuilder(); |
| 140 builder.addMemory(1, kV8MaxPages, false); | 143 builder.addMemory(1, kV8MaxPages, false); |
| 141 var module = builder.instantiate(); | 144 var module = builder.instantiate(); |
| 142 var offset; | 145 var offset; |
| 143 function peek() { return module.exports.load8(offset); } | 146 function peek() { return module.exports.load8(offset); } |
| 144 function poke(value) { return module.exports.store8(offset, value); } | 147 function poke(value) { return module.exports.store8(offset, value); } |
| 145 function growMem(pages) { return module.exports.grow_memory(pages); } | 148 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 146 | 149 |
| 147 for(offset = 0; offset <= kPageSize - 1; offset++) { | 150 for(offset = 0; offset <= kPageSize - 1; offset++) { |
| 148 poke(20); | 151 poke(20); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 176 } | 179 } |
| 177 for (offset = 19*kPageSize; offset < 19*kPageSize + 5; offset++) { | 180 for (offset = 19*kPageSize; offset < 19*kPageSize + 5; offset++) { |
| 178 assertTraps(kTrapMemOutOfBounds, poke); | 181 assertTraps(kTrapMemOutOfBounds, poke); |
| 179 assertTraps(kTrapMemOutOfBounds, peek); | 182 assertTraps(kTrapMemOutOfBounds, peek); |
| 180 } | 183 } |
| 181 } | 184 } |
| 182 | 185 |
| 183 testGrowMemoryReadWrite8(); | 186 testGrowMemoryReadWrite8(); |
| 184 | 187 |
| 185 function testGrowMemoryZeroInitialSize() { | 188 function testGrowMemoryZeroInitialSize() { |
| 189 print('testGrowMemoryZeroInitialSize'); |
| 186 var builder = genGrowMemoryBuilder(); | 190 var builder = genGrowMemoryBuilder(); |
| 187 builder.addMemory(0, kV8MaxPages, false); | 191 builder.addMemory(0, kV8MaxPages, false); |
| 188 var module = builder.instantiate(); | 192 var module = builder.instantiate(); |
| 189 var offset; | 193 var offset; |
| 190 function peek() { return module.exports.load(offset); } | 194 function peek() { return module.exports.load(offset); } |
| 191 function poke(value) { return module.exports.store(offset, value); } | 195 function poke(value) { return module.exports.store(offset, value); } |
| 192 function growMem(pages) { return module.exports.grow_memory(pages); } | 196 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 193 | 197 |
| 194 assertTraps(kTrapMemOutOfBounds, peek); | 198 assertTraps(kTrapMemOutOfBounds, peek); |
| 195 assertTraps(kTrapMemOutOfBounds, poke); | 199 assertTraps(kTrapMemOutOfBounds, poke); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 210 assertTraps(kTrapMemOutOfBounds, poke); | 214 assertTraps(kTrapMemOutOfBounds, poke); |
| 211 assertEquals(i, growMem(1)); | 215 assertEquals(i, growMem(1)); |
| 212 } | 216 } |
| 213 poke(20); | 217 poke(20); |
| 214 assertEquals(20, peek()); | 218 assertEquals(20, peek()); |
| 215 } | 219 } |
| 216 | 220 |
| 217 testGrowMemoryZeroInitialSize(); | 221 testGrowMemoryZeroInitialSize(); |
| 218 | 222 |
| 219 function testGrowMemoryZeroInitialSize32() { | 223 function testGrowMemoryZeroInitialSize32() { |
| 224 print('testGrowMemoryZeroInitialSize32'); |
| 220 var builder = genGrowMemoryBuilder(); | 225 var builder = genGrowMemoryBuilder(); |
| 221 builder.addMemory(0, kV8MaxPages, false); | 226 builder.addMemory(0, kV8MaxPages, false); |
| 222 var module = builder.instantiate(); | 227 var module = builder.instantiate(); |
| 223 var offset; | 228 var offset; |
| 224 function peek() { return module.exports.load(offset); } | 229 function peek() { return module.exports.load(offset); } |
| 225 function poke(value) { return module.exports.store(offset, value); } | 230 function poke(value) { return module.exports.store(offset, value); } |
| 226 function growMem(pages) { return module.exports.grow_memory(pages); } | 231 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 227 | 232 |
| 228 assertTraps(kTrapMemOutOfBounds, peek); | 233 assertTraps(kTrapMemOutOfBounds, peek); |
| 229 assertTraps(kTrapMemOutOfBounds, poke); | 234 assertTraps(kTrapMemOutOfBounds, poke); |
| 230 | 235 |
| 231 assertEquals(0, growMem(1)); | 236 assertEquals(0, growMem(1)); |
| 232 | 237 |
| 233 for(offset = 0; offset <= kPageSize - 4; offset++) { | 238 for(offset = 0; offset <= kPageSize - 4; offset++) { |
| 234 poke(20); | 239 poke(20); |
| 235 assertEquals(20, peek()); | 240 assertEquals(20, peek()); |
| 236 } | 241 } |
| 237 | 242 |
| 238 for(offset = kPageSize - 3; offset <= kPageSize + 5; offset++) { | 243 for(offset = kPageSize - 3; offset <= kPageSize + 5; offset++) { |
| 239 assertTraps(kTrapMemOutOfBounds, peek); | 244 assertTraps(kTrapMemOutOfBounds, peek); |
| 240 } | 245 } |
| 241 } | 246 } |
| 242 | 247 |
| 243 testGrowMemoryZeroInitialSize32(); | 248 testGrowMemoryZeroInitialSize32(); |
| 244 | 249 |
| 245 function testGrowMemoryZeroInitialSize16() { | 250 function testGrowMemoryZeroInitialSize16() { |
| 251 print('testGrowMemoryZeroInitialSize16'); |
| 246 var builder = genGrowMemoryBuilder(); | 252 var builder = genGrowMemoryBuilder(); |
| 247 builder.addMemory(0, kV8MaxPages, false); | 253 builder.addMemory(0, kV8MaxPages, false); |
| 248 var module = builder.instantiate(); | 254 var module = builder.instantiate(); |
| 249 var offset; | 255 var offset; |
| 250 function peek() { return module.exports.load16(offset); } | 256 function peek() { return module.exports.load16(offset); } |
| 251 function poke(value) { return module.exports.store16(offset, value); } | 257 function poke(value) { return module.exports.store16(offset, value); } |
| 252 function growMem(pages) { return module.exports.grow_memory(pages); } | 258 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 253 | 259 |
| 254 assertTraps(kTrapMemOutOfBounds, peek); | 260 assertTraps(kTrapMemOutOfBounds, peek); |
| 255 assertTraps(kTrapMemOutOfBounds, poke); | 261 assertTraps(kTrapMemOutOfBounds, poke); |
| 256 | 262 |
| 257 assertEquals(0, growMem(1)); | 263 assertEquals(0, growMem(1)); |
| 258 | 264 |
| 259 for(offset = 0; offset <= kPageSize - 2; offset++) { | 265 for(offset = 0; offset <= kPageSize - 2; offset++) { |
| 260 poke(20); | 266 poke(20); |
| 261 assertEquals(20, peek()); | 267 assertEquals(20, peek()); |
| 262 } | 268 } |
| 263 | 269 |
| 264 for(offset = kPageSize - 1; offset <= kPageSize + 5; offset++) { | 270 for(offset = kPageSize - 1; offset <= kPageSize + 5; offset++) { |
| 265 assertTraps(kTrapMemOutOfBounds, peek); | 271 assertTraps(kTrapMemOutOfBounds, peek); |
| 266 } | 272 } |
| 267 } | 273 } |
| 268 | 274 |
| 269 testGrowMemoryZeroInitialSize16(); | 275 testGrowMemoryZeroInitialSize16(); |
| 270 | 276 |
| 271 function testGrowMemoryZeroInitialSize8() { | 277 function testGrowMemoryZeroInitialSize8() { |
| 278 print('testGrowMemoryZeroInitialSize8'); |
| 272 var builder = genGrowMemoryBuilder(); | 279 var builder = genGrowMemoryBuilder(); |
| 273 builder.addMemory(0, kV8MaxPages, false); | 280 builder.addMemory(0, kV8MaxPages, false); |
| 274 var module = builder.instantiate(); | 281 var module = builder.instantiate(); |
| 275 var offset; | 282 var offset; |
| 276 function peek() { return module.exports.load8(offset); } | 283 function peek() { return module.exports.load8(offset); } |
| 277 function poke(value) { return module.exports.store8(offset, value); } | 284 function poke(value) { return module.exports.store8(offset, value); } |
| 278 function growMem(pages) { return module.exports.grow_memory(pages); } | 285 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 279 | 286 |
| 280 assertTraps(kTrapMemOutOfBounds, peek); | 287 assertTraps(kTrapMemOutOfBounds, peek); |
| 281 assertTraps(kTrapMemOutOfBounds, poke); | 288 assertTraps(kTrapMemOutOfBounds, poke); |
| 282 | 289 |
| 283 assertEquals(0, growMem(1)); | 290 assertEquals(0, growMem(1)); |
| 284 | 291 |
| 285 for(offset = 0; offset <= kPageSize - 1; offset++) { | 292 for(offset = 0; offset <= kPageSize - 1; offset++) { |
| 286 poke(20); | 293 poke(20); |
| 287 assertEquals(20, peek()); | 294 assertEquals(20, peek()); |
| 288 } | 295 } |
| 289 | 296 |
| 290 for(offset = kPageSize; offset <= kPageSize + 5; offset++) { | 297 for(offset = kPageSize; offset <= kPageSize + 5; offset++) { |
| 291 assertTraps(kTrapMemOutOfBounds, peek); | 298 assertTraps(kTrapMemOutOfBounds, peek); |
| 292 } | 299 } |
| 293 } | 300 } |
| 294 | 301 |
| 295 testGrowMemoryZeroInitialSize8(); | 302 testGrowMemoryZeroInitialSize8(); |
| 296 | 303 |
| 297 function testGrowMemoryTrapMaxPagesZeroInitialMemory() { | 304 function testGrowMemoryTrapMaxPagesZeroInitialMemory() { |
| 305 print('testGrowMemoryTrapMaxPagesZeroInitialMemory'); |
| 298 var builder = genGrowMemoryBuilder(); | 306 var builder = genGrowMemoryBuilder(); |
| 299 builder.addMemory(0, kV8MaxPages, false); | 307 builder.addMemory(0, kV8MaxPages, false); |
| 300 var module = builder.instantiate(); | 308 var module = builder.instantiate(); |
| 301 var maxPages = 16385; | 309 var maxPages = 16385; |
| 302 function growMem(pages) { return module.exports.grow_memory(pages); } | 310 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 303 assertEquals(-1, growMem(maxPages)); | 311 assertEquals(-1, growMem(maxPages)); |
| 304 } | 312 } |
| 305 | 313 |
| 306 testGrowMemoryTrapMaxPagesZeroInitialMemory(); | 314 testGrowMemoryTrapMaxPagesZeroInitialMemory(); |
| 307 | 315 |
| 308 function testGrowMemoryTrapMaxPages() { | 316 function testGrowMemoryTrapMaxPages() { |
| 317 print('testGrowMemoryTrapMaxPages'); |
| 309 var builder = genGrowMemoryBuilder(); | 318 var builder = genGrowMemoryBuilder(); |
| 310 builder.addMemory(1, 1, false); | 319 builder.addMemory(1, 1, false); |
| 311 var module = builder.instantiate(); | 320 var module = builder.instantiate(); |
| 312 var maxPages = 16384; | 321 var maxPages = 16384; |
| 313 function growMem(pages) { return module.exports.grow_memory(pages); } | 322 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 314 assertEquals(-1, growMem(maxPages)); | 323 assertEquals(-1, growMem(maxPages)); |
| 315 } | 324 } |
| 316 | 325 |
| 317 testGrowMemoryTrapMaxPages(); | 326 testGrowMemoryTrapMaxPages(); |
| 318 | 327 |
| 319 function testGrowMemoryTrapsWithNonSmiInput() { | 328 function testGrowMemoryTrapsWithNonSmiInput() { |
| 329 print('testGrowMemoryTrapsWithNonSmiInput'); |
| 320 var builder = genGrowMemoryBuilder(); | 330 var builder = genGrowMemoryBuilder(); |
| 321 builder.addMemory(0, kV8MaxPages, false); | 331 builder.addMemory(0, kV8MaxPages, false); |
| 322 var module = builder.instantiate(); | 332 var module = builder.instantiate(); |
| 323 function growMem(pages) { return module.exports.grow_memory(pages); } | 333 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 324 // The parameter of grow_memory is unsigned. Therefore -1 stands for | 334 // The parameter of grow_memory is unsigned. Therefore -1 stands for |
| 325 // UINT32_MIN, which cannot be represented as SMI. | 335 // UINT32_MIN, which cannot be represented as SMI. |
| 326 assertEquals(-1, growMem(-1)); | 336 assertEquals(-1, growMem(-1)); |
| 327 }; | 337 }; |
| 328 | 338 |
| 329 testGrowMemoryTrapsWithNonSmiInput(); | 339 testGrowMemoryTrapsWithNonSmiInput(); |
| 330 | 340 |
| 331 function testGrowMemoryCurrentMemory() { | 341 function testGrowMemoryCurrentMemory() { |
| 342 print('testGrowMemoryCurrentMemory'); |
| 332 var builder = genGrowMemoryBuilder(); | 343 var builder = genGrowMemoryBuilder(); |
| 333 builder.addMemory(1, kV8MaxPages, false); | 344 builder.addMemory(1, kV8MaxPages, false); |
| 334 builder.addFunction("memory_size", kSig_i_v) | 345 builder.addFunction("memory_size", kSig_i_v) |
| 335 .addBody([kExprMemorySize, kMemoryZero]) | 346 .addBody([kExprMemorySize, kMemoryZero]) |
| 336 .exportFunc(); | 347 .exportFunc(); |
| 337 var module = builder.instantiate(); | 348 var module = builder.instantiate(); |
| 338 function growMem(pages) { return module.exports.grow_memory(pages); } | 349 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 339 function MemSize() { return module.exports.memory_size(); } | 350 function MemSize() { return module.exports.memory_size(); } |
| 340 assertEquals(1, MemSize()); | 351 assertEquals(1, MemSize()); |
| 341 assertEquals(1, growMem(1)); | 352 assertEquals(1, growMem(1)); |
| 342 assertEquals(2, MemSize()); | 353 assertEquals(2, MemSize()); |
| 343 } | 354 } |
| 344 | 355 |
| 345 testGrowMemoryCurrentMemory(); | 356 testGrowMemoryCurrentMemory(); |
| 346 | 357 |
| 347 function testGrowMemoryPreservesDataMemOp32() { | 358 function testGrowMemoryPreservesDataMemOp32() { |
| 359 print('testGrowMemoryPreservesDataMemOp32'); |
| 348 var builder = genGrowMemoryBuilder(); | 360 var builder = genGrowMemoryBuilder(); |
| 349 builder.addMemory(1, kV8MaxPages, false); | 361 builder.addMemory(1, kV8MaxPages, false); |
| 350 var module = builder.instantiate(); | 362 var module = builder.instantiate(); |
| 351 var offset, val; | 363 var offset, val; |
| 352 function peek() { return module.exports.load(offset); } | 364 function peek() { return module.exports.load(offset); } |
| 353 function poke(value) { return module.exports.store(offset, value); } | 365 function poke(value) { return module.exports.store(offset, value); } |
| 354 function growMem(pages) { return module.exports.grow_memory(pages); } | 366 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 355 | 367 |
| 356 for(offset = 0; offset <= (kPageSize - 4); offset+=4) { | 368 for(offset = 0; offset <= (kPageSize - 4); offset+=4) { |
| 357 poke(100000 - offset); | 369 poke(100000 - offset); |
| 358 assertEquals(100000 - offset, peek()); | 370 assertEquals(100000 - offset, peek()); |
| 359 } | 371 } |
| 360 | 372 |
| 361 assertEquals(1, growMem(3)); | 373 assertEquals(1, growMem(3)); |
| 362 | 374 |
| 363 for(offset = 0; offset <= (kPageSize - 4); offset+=4) { | 375 for(offset = 0; offset <= (kPageSize - 4); offset+=4) { |
| 364 assertEquals(100000 - offset, peek()); | 376 assertEquals(100000 - offset, peek()); |
| 365 } | 377 } |
| 366 } | 378 } |
| 367 | 379 |
| 368 testGrowMemoryPreservesDataMemOp32(); | 380 testGrowMemoryPreservesDataMemOp32(); |
| 369 | 381 |
| 370 function testGrowMemoryPreservesDataMemOp16() { | 382 function testGrowMemoryPreservesDataMemOp16() { |
| 383 print('testGrowMemoryPreservesDataMemOp16'); |
| 371 var builder = genGrowMemoryBuilder(); | 384 var builder = genGrowMemoryBuilder(); |
| 372 builder.addMemory(1, kV8MaxPages, false); | 385 builder.addMemory(1, kV8MaxPages, false); |
| 373 var module = builder.instantiate(); | 386 var module = builder.instantiate(); |
| 374 var offset, val; | 387 var offset, val; |
| 375 function peek() { return module.exports.load16(offset); } | 388 function peek() { return module.exports.load16(offset); } |
| 376 function poke(value) { return module.exports.store16(offset, value); } | 389 function poke(value) { return module.exports.store16(offset, value); } |
| 377 function growMem(pages) { return module.exports.grow_memory(pages); } | 390 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 378 | 391 |
| 379 for(offset = 0; offset <= (kPageSize - 2); offset+=2) { | 392 for(offset = 0; offset <= (kPageSize - 2); offset+=2) { |
| 380 poke(65535 - offset); | 393 poke(65535 - offset); |
| 381 assertEquals(65535 - offset, peek()); | 394 assertEquals(65535 - offset, peek()); |
| 382 } | 395 } |
| 383 | 396 |
| 384 assertEquals(1, growMem(3)); | 397 assertEquals(1, growMem(3)); |
| 385 | 398 |
| 386 for(offset = 0; offset <= (kPageSize - 2); offset+=2) { | 399 for(offset = 0; offset <= (kPageSize - 2); offset+=2) { |
| 387 assertEquals(65535 - offset, peek()); | 400 assertEquals(65535 - offset, peek()); |
| 388 } | 401 } |
| 389 } | 402 } |
| 390 | 403 |
| 391 testGrowMemoryPreservesDataMemOp16(); | 404 testGrowMemoryPreservesDataMemOp16(); |
| 392 | 405 |
| 393 function testGrowMemoryPreservesDataMemOp8() { | 406 function testGrowMemoryPreservesDataMemOp8() { |
| 407 print('testGrowMemoryPreservesDataMemOp8'); |
| 394 var builder = genGrowMemoryBuilder(); | 408 var builder = genGrowMemoryBuilder(); |
| 395 builder.addMemory(1, kV8MaxPages, false); | 409 builder.addMemory(1, kV8MaxPages, false); |
| 396 var module = builder.instantiate(); | 410 var module = builder.instantiate(); |
| 397 var offset, val = 0; | 411 var offset, val = 0; |
| 398 function peek() { return module.exports.load8(offset); } | 412 function peek() { return module.exports.load8(offset); } |
| 399 function poke(value) { return module.exports.store8(offset, value); } | 413 function poke(value) { return module.exports.store8(offset, value); } |
| 400 function growMem(pages) { return module.exports.grow_memory(pages); } | 414 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 401 | 415 |
| 402 for(offset = 0; offset <= (kPageSize - 1); offset++, val++) { | 416 for(offset = 0; offset <= (kPageSize - 1); offset++, val++) { |
| 403 poke(val); | 417 poke(val); |
| 404 assertEquals(val, peek()); | 418 assertEquals(val, peek()); |
| 405 if (val == 255) val = 0; | 419 if (val == 255) val = 0; |
| 406 } | 420 } |
| 407 | 421 |
| 408 assertEquals(1, growMem(3)); | 422 assertEquals(1, growMem(3)); |
| 409 | 423 |
| 410 val = 0; | 424 val = 0; |
| 411 | 425 |
| 412 for(offset = 0; offset <= (kPageSize - 1); offset++, val++) { | 426 for(offset = 0; offset <= (kPageSize - 1); offset++, val++) { |
| 413 assertEquals(val, peek()); | 427 assertEquals(val, peek()); |
| 414 if (val == 255) val = 0; | 428 if (val == 255) val = 0; |
| 415 } | 429 } |
| 416 } | 430 } |
| 417 | 431 |
| 418 testGrowMemoryPreservesDataMemOp8(); | 432 testGrowMemoryPreservesDataMemOp8(); |
| 419 | 433 |
| 420 function testGrowMemoryOutOfBoundsOffset() { | 434 function testGrowMemoryOutOfBoundsOffset() { |
| 435 print('testGrowMemoryOutOfBoundsOffset'); |
| 421 var builder = genGrowMemoryBuilder(); | 436 var builder = genGrowMemoryBuilder(); |
| 422 builder.addMemory(1, kV8MaxPages, false); | 437 builder.addMemory(1, kV8MaxPages, false); |
| 423 var module = builder.instantiate(); | 438 var module = builder.instantiate(); |
| 424 var offset, val; | 439 var offset, val; |
| 425 function peek() { return module.exports.load(offset); } | 440 function peek() { return module.exports.load(offset); } |
| 426 function poke(value) { return module.exports.store(offset, value); } | 441 function poke(value) { return module.exports.store(offset, value); } |
| 427 function growMem(pages) { return module.exports.grow_memory(pages); } | 442 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 428 | 443 |
| 429 offset = 3*kPageSize + 4; | 444 offset = 3*kPageSize + 4; |
| 430 assertTraps(kTrapMemOutOfBounds, poke); | 445 assertTraps(kTrapMemOutOfBounds, poke); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 443 } | 458 } |
| 444 | 459 |
| 445 for (offset = 4*kPageSize - 3; offset <= 4*kPageSize + 4; offset++) { | 460 for (offset = 4*kPageSize - 3; offset <= 4*kPageSize + 4; offset++) { |
| 446 assertTraps(kTrapMemOutOfBounds, poke); | 461 assertTraps(kTrapMemOutOfBounds, poke); |
| 447 } | 462 } |
| 448 } | 463 } |
| 449 | 464 |
| 450 testGrowMemoryOutOfBoundsOffset(); | 465 testGrowMemoryOutOfBoundsOffset(); |
| 451 | 466 |
| 452 function testGrowMemoryOutOfBoundsOffset2() { | 467 function testGrowMemoryOutOfBoundsOffset2() { |
| 468 print('testGrowMemoryOutOfBoundsOffset2'); |
| 453 var builder = new WasmModuleBuilder(); | 469 var builder = new WasmModuleBuilder(); |
| 454 builder.addMemory(16, 128, false); | 470 builder.addMemory(16, 128, false); |
| 455 builder.addFunction("main", kSig_v_v) | 471 builder.addFunction("main", kSig_v_v) |
| 456 .addBody([ | 472 .addBody([ |
| 457 kExprI32Const, 20, | 473 kExprI32Const, 20, |
| 458 kExprI32Const, 29, | 474 kExprI32Const, 29, |
| 459 kExprGrowMemory, kMemoryZero, | 475 kExprGrowMemory, kMemoryZero, |
| 460 kExprI32StoreMem, 0, 0xFF, 0xFF, 0xFF, 0x3a | 476 kExprI32StoreMem, 0, 0xFF, 0xFF, 0xFF, 0x3a |
| 461 ]) | 477 ]) |
| 462 .exportAs("main"); | 478 .exportAs("main"); |
| 463 var module = builder.instantiate(); | 479 var module = builder.instantiate(); |
| 464 assertTraps(kTrapMemOutOfBounds, module.exports.main); | 480 assertTraps(kTrapMemOutOfBounds, module.exports.main); |
| 465 } | 481 } |
| 466 | 482 |
| 467 testGrowMemoryOutOfBoundsOffset2(); | 483 testGrowMemoryOutOfBoundsOffset2(); |
| 468 | 484 |
| 469 function testGrowMemoryDeclaredMaxTraps() { | 485 function testGrowMemoryDeclaredMaxTraps() { |
| 486 print('testGrowMemoryDeclaredMaxTraps'); |
| 470 var builder = genGrowMemoryBuilder(); | 487 var builder = genGrowMemoryBuilder(); |
| 471 builder.addMemory(1, 16, false); | 488 builder.addMemory(1, 16, false); |
| 472 var module = builder.instantiate(); | 489 var module = builder.instantiate(); |
| 473 function growMem(pages) { return module.exports.grow_memory(pages); } | 490 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 474 assertEquals(1, growMem(5)); | 491 assertEquals(1, growMem(5)); |
| 475 assertEquals(6, growMem(5)); | 492 assertEquals(6, growMem(5)); |
| 476 assertEquals(-1, growMem(6)); | 493 assertEquals(-1, growMem(6)); |
| 477 } | 494 } |
| 478 | 495 |
| 479 testGrowMemoryDeclaredMaxTraps(); | 496 testGrowMemoryDeclaredMaxTraps(); |
| 480 | 497 |
| 481 function testGrowMemoryDeclaredSpecMaxTraps() { | 498 function testGrowMemoryDeclaredSpecMaxTraps() { |
| 499 print('testGrowMemoryDeclaredSpecMaxTraps'); |
| 482 // The spec maximum is higher than the internal V8 maximum. This test only | 500 // The spec maximum is higher than the internal V8 maximum. This test only |
| 483 // checks that grow_memory does not grow past the internally defined maximum | 501 // checks that grow_memory does not grow past the internally defined maximum |
| 484 // to reflect the currentl implementation. | 502 // to reflect the currentl implementation. |
| 485 var builder = genGrowMemoryBuilder(); | 503 var builder = genGrowMemoryBuilder(); |
| 486 var kSpecMaxPages = 65535; | 504 var kSpecMaxPages = 65535; |
| 487 builder.addMemory(1, kSpecMaxPages, false); | 505 builder.addMemory(1, kSpecMaxPages, false); |
| 488 var module = builder.instantiate(); | 506 var module = builder.instantiate(); |
| 489 function poke(value) { return module.exports.store(offset, value); } | 507 function poke(value) { return module.exports.store(offset, value); } |
| 490 function growMem(pages) { return module.exports.grow_memory(pages); } | 508 function growMem(pages) { return module.exports.grow_memory(pages); } |
| 491 assertEquals(1, growMem(20)); | 509 assertEquals(1, growMem(20)); |
| 492 assertEquals(-1, growMem(kV8MaxPages - 20)); | 510 assertEquals(-1, growMem(kV8MaxPages - 20)); |
| 493 } | 511 } |
| 494 | 512 |
| 495 testGrowMemoryDeclaredSpecMaxTraps(); | 513 testGrowMemoryDeclaredSpecMaxTraps(); |
| OLD | NEW |