blob: ef85eb23576acbe4076ea5311ec517cc94054d68 [file] [log] [blame]
Ben Murdoch014dc512016-03-22 12:00:34 +00001// 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");
Ben Murdoch3b9bc312016-06-02 14:46:10 +01008load("test/mjsunit/wasm/wasm-module-builder.js");
Ben Murdoch014dc512016-03-22 12:00:34 +00009
Ben Murdoch3b9bc312016-06-02 14:46:10 +010010var kMemSize = 65536;
Ben Murdoch014dc512016-03-22 12:00:34 +000011
12function genModule(memory) {
Ben Murdoch3b9bc312016-06-02 14:46:10 +010013 var builder = new WasmModuleBuilder();
Ben Murdoch014dc512016-03-22 12:00:34 +000014
Ben Murdoch3b9bc312016-06-02 14:46:10 +010015 builder.addMemory(1, 1, true);
16 builder.addFunction("main", [kAstI32, kAstI32])
17 .addBody([
18 kExprBlock,2,
19 kExprLoop,1,
20 kExprIf,
21 kExprGetLocal,0,
22 kExprBr, 0,
23 kExprIfElse,
24 kExprI32LoadMem,0,0,kExprGetLocal,0,
25 kExprBr,2, kExprI8Const, 255,
26 kExprSetLocal,0,
27 kExprI32Sub,kExprGetLocal,0,kExprI8Const,4,
28 kExprI8Const,0])
29 .exportFunc();
Ben Murdoch014dc512016-03-22 12:00:34 +000030
Ben Murdoch3b9bc312016-06-02 14:46:10 +010031 return builder.instantiate(null, memory);
Ben Murdoch014dc512016-03-22 12:00:34 +000032}
33
34function testPokeMemory() {
35 var module = genModule(null);
Ben Murdoch3b9bc312016-06-02 14:46:10 +010036 var buffer = module.exports.memory;
37 var main = module.exports.main;
Ben Murdoch014dc512016-03-22 12:00:34 +000038 assertEquals(kMemSize, buffer.byteLength);
39
40 var array = new Int8Array(buffer);
41 assertEquals(kMemSize, array.length);
42
43 for (var i = 0; i < kMemSize; i++) {
44 assertEquals(0, array[i]);
45 }
46
47 for (var i = 0; i < 10; i++) {
Ben Murdoch3b9bc312016-06-02 14:46:10 +010048 assertEquals(0, main(kMemSize - 4));
Ben Murdoch014dc512016-03-22 12:00:34 +000049
50 array[kMemSize/2 + i] = 1;
Ben Murdoch3b9bc312016-06-02 14:46:10 +010051 assertEquals(0, main(kMemSize/2 - 4));
52 assertEquals(-1, main(kMemSize - 4));
Ben Murdoch014dc512016-03-22 12:00:34 +000053
54 array[kMemSize/2 + i] = 0;
Ben Murdoch3b9bc312016-06-02 14:46:10 +010055 assertEquals(0, main(kMemSize - 4));
Ben Murdoch014dc512016-03-22 12:00:34 +000056 }
57}
58
59testPokeMemory();
60
61function testSurvivalAcrossGc() {
Ben Murdoch3b9bc312016-06-02 14:46:10 +010062 var checker = genModule(null).exports.main;
Ben Murdoch014dc512016-03-22 12:00:34 +000063 for (var i = 0; i < 5; i++) {
64 print("gc run ", i);
65 assertEquals(0, checker(kMemSize - 4));
66 gc();
67 }
68}
69
70testSurvivalAcrossGc();
71testSurvivalAcrossGc();
72testSurvivalAcrossGc();
73testSurvivalAcrossGc();
74
75
76function testPokeOuterMemory() {
77 var buffer = new ArrayBuffer(kMemSize);
78 var module = genModule(buffer);
Ben Murdoch3b9bc312016-06-02 14:46:10 +010079 var main = module.exports.main;
Ben Murdoch014dc512016-03-22 12:00:34 +000080 assertEquals(kMemSize, buffer.byteLength);
81
82 var array = new Int8Array(buffer);
83 assertEquals(kMemSize, array.length);
84
85 for (var i = 0; i < kMemSize; i++) {
86 assertEquals(0, array[i]);
87 }
88
89 for (var i = 0; i < 10; i++) {
Ben Murdoch3b9bc312016-06-02 14:46:10 +010090 assertEquals(0, main(kMemSize - 4));
Ben Murdoch014dc512016-03-22 12:00:34 +000091
92 array[kMemSize/2 + i] = 1;
Ben Murdoch3b9bc312016-06-02 14:46:10 +010093 assertEquals(0, main(kMemSize/2 - 4));
94 assertEquals(-1, main(kMemSize - 4));
Ben Murdoch014dc512016-03-22 12:00:34 +000095
96 array[kMemSize/2 + i] = 0;
Ben Murdoch3b9bc312016-06-02 14:46:10 +010097 assertEquals(0, main(kMemSize - 4));
Ben Murdoch014dc512016-03-22 12:00:34 +000098 }
99}
100
101testPokeOuterMemory();
102
103function testOuterMemorySurvivalAcrossGc() {
104 var buffer = new ArrayBuffer(kMemSize);
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100105 var checker = genModule(buffer).exports.main;
Ben Murdoch014dc512016-03-22 12:00:34 +0000106 for (var i = 0; i < 5; i++) {
107 print("gc run ", i);
108 assertEquals(0, checker(kMemSize - 4));
109 gc();
110 }
111}
112
113testOuterMemorySurvivalAcrossGc();
114testOuterMemorySurvivalAcrossGc();
115testOuterMemorySurvivalAcrossGc();
116testOuterMemorySurvivalAcrossGc();
117
118
119function testOOBThrows() {
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100120 var builder = new WasmModuleBuilder();
Ben Murdoch014dc512016-03-22 12:00:34 +0000121
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100122 builder.addMemory(1, 1, true);
123 builder.addFunction("geti", [kAstI32, kAstI32, kAstI32])
124 .addBody([
125 kExprI32StoreMem, 0, 0, kExprGetLocal, 0, kExprI32LoadMem, 0, 0, kExprGetLocal, 1
126 ])
127 .exportFunc();
Ben Murdoch014dc512016-03-22 12:00:34 +0000128
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100129 var module = builder.instantiate();
Ben Murdoch014dc512016-03-22 12:00:34 +0000130
131 var offset;
132
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100133 function read() { return module.exports.geti(0, offset); }
134 function write() { return module.exports.geti(offset, 0); }
Ben Murdoch014dc512016-03-22 12:00:34 +0000135
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100136 for (offset = 0; offset < 65533; offset++) {
Ben Murdoch014dc512016-03-22 12:00:34 +0000137 assertEquals(0, read());
138 assertEquals(0, write());
139 }
140
141
Ben Murdoch3b9bc312016-06-02 14:46:10 +0100142 for (offset = 65534; offset < 66536; offset++) {
Ben Murdoch014dc512016-03-22 12:00:34 +0000143 assertTraps(kTrapMemOutOfBounds, read);
144 assertTraps(kTrapMemOutOfBounds, write);
145 }
146}
147
148testOOBThrows();