blob: a5e5f42488aad5c3dc0a9ab9673e2ca3229d1301 [file] [log] [blame]
Ben Murdoch4a90d5f2016-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 Murdochda12d292016-06-02 14:46:10 +01008load("test/mjsunit/wasm/wasm-module-builder.js");
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00009
Ben Murdochda12d292016-06-02 14:46:10 +010010var kMemSize = 65536;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000011
12function genModule(memory) {
Ben Murdochda12d292016-06-02 14:46:10 +010013 var builder = new WasmModuleBuilder();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000014
Ben Murdochda12d292016-06-02 14:46:10 +010015 builder.addMemory(1, 1, true);
Ben Murdochc5610432016-08-08 18:44:38 +010016 builder.addFunction("main", kSig_i_i)
Ben Murdochda12d292016-06-02 14:46:10 +010017 .addBody([
Ben Murdochc5610432016-08-08 18:44:38 +010018 // main body: while(i) { if(mem[i]) return -1; i -= 4; } return 0;
19 kExprLoop,
20 kExprGetLocal,0,
21 kExprIf,
Ben Murdochda12d292016-06-02 14:46:10 +010022 kExprGetLocal,0,
Ben Murdochc5610432016-08-08 18:44:38 +010023 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 ])
Ben Murdochda12d292016-06-02 14:46:10 +010037 .exportFunc();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000038
Ben Murdochda12d292016-06-02 14:46:10 +010039 return builder.instantiate(null, memory);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000040}
41
42function testPokeMemory() {
43 var module = genModule(null);
Ben Murdochda12d292016-06-02 14:46:10 +010044 var buffer = module.exports.memory;
45 var main = module.exports.main;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046 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++) {
Ben Murdochda12d292016-06-02 14:46:10 +010056 assertEquals(0, main(kMemSize - 4));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000057
58 array[kMemSize/2 + i] = 1;
Ben Murdochda12d292016-06-02 14:46:10 +010059 assertEquals(0, main(kMemSize/2 - 4));
60 assertEquals(-1, main(kMemSize - 4));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000061
62 array[kMemSize/2 + i] = 0;
Ben Murdochda12d292016-06-02 14:46:10 +010063 assertEquals(0, main(kMemSize - 4));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000064 }
65}
66
67testPokeMemory();
68
69function testSurvivalAcrossGc() {
Ben Murdochda12d292016-06-02 14:46:10 +010070 var checker = genModule(null).exports.main;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000071 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);
Ben Murdochda12d292016-06-02 14:46:10 +010087 var main = module.exports.main;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000088 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++) {
Ben Murdochda12d292016-06-02 14:46:10 +010098 assertEquals(0, main(kMemSize - 4));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000099
100 array[kMemSize/2 + i] = 1;
Ben Murdochda12d292016-06-02 14:46:10 +0100101 assertEquals(0, main(kMemSize/2 - 4));
102 assertEquals(-1, main(kMemSize - 4));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000103
104 array[kMemSize/2 + i] = 0;
Ben Murdochda12d292016-06-02 14:46:10 +0100105 assertEquals(0, main(kMemSize - 4));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000106 }
107}
108
109testPokeOuterMemory();
110
111function testOuterMemorySurvivalAcrossGc() {
112 var buffer = new ArrayBuffer(kMemSize);
Ben Murdochda12d292016-06-02 14:46:10 +0100113 var checker = genModule(buffer).exports.main;
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000114 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() {
Ben Murdochda12d292016-06-02 14:46:10 +0100128 var builder = new WasmModuleBuilder();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000129
Ben Murdochda12d292016-06-02 14:46:10 +0100130 builder.addMemory(1, 1, true);
Ben Murdochc5610432016-08-08 18:44:38 +0100131 builder.addFunction("geti", kSig_i_ii)
Ben Murdochda12d292016-06-02 14:46:10 +0100132 .addBody([
Ben Murdochc5610432016-08-08 18:44:38 +0100133 kExprGetLocal, 0,
134 kExprGetLocal, 1,
135 kExprI32LoadMem, 0, 0,
136 kExprI32StoreMem, 0, 0
Ben Murdochda12d292016-06-02 14:46:10 +0100137 ])
138 .exportFunc();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000139
Ben Murdochda12d292016-06-02 14:46:10 +0100140 var module = builder.instantiate();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000141 var offset;
142
Ben Murdochda12d292016-06-02 14:46:10 +0100143 function read() { return module.exports.geti(0, offset); }
144 function write() { return module.exports.geti(offset, 0); }
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000145
Ben Murdochda12d292016-06-02 14:46:10 +0100146 for (offset = 0; offset < 65533; offset++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000147 assertEquals(0, read());
148 assertEquals(0, write());
149 }
150
151
Ben Murdochda12d292016-06-02 14:46:10 +0100152 for (offset = 65534; offset < 66536; offset++) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000153 assertTraps(kTrapMemOutOfBounds, read);
154 assertTraps(kTrapMemOutOfBounds, write);
155 }
156}
157
158testOOBThrows();