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 | 5 // Flags: --expose-wasm |
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 (function TestOne() { | 10 (function TestOne() { |
(...skipping 22 matching lines...) Expand all Loading... |
33 let memory = new WebAssembly.Memory({initial: 1}); | 33 let memory = new WebAssembly.Memory({initial: 1}); |
34 let i32 = new Int32Array(memory.buffer); | 34 let i32 = new Int32Array(memory.buffer); |
35 let builder = new WasmModuleBuilder(); | 35 let builder = new WasmModuleBuilder(); |
36 builder.addImportedMemory("garg"); | 36 builder.addImportedMemory("garg"); |
37 builder.exportMemoryAs("daggle"); | 37 builder.exportMemoryAs("daggle"); |
38 | 38 |
39 let instance = builder.instantiate({garg: memory}); | 39 let instance = builder.instantiate({garg: memory}); |
40 assertSame(memory, instance.exports.daggle); | 40 assertSame(memory, instance.exports.daggle); |
41 })(); | 41 })(); |
42 | 42 |
| 43 |
43 (function TestImportExport() { | 44 (function TestImportExport() { |
44 print("TestImportExport"); | 45 print("TestImportExport"); |
45 var i1; | 46 var i1; |
46 { | 47 { |
47 let builder = new WasmModuleBuilder(); | 48 let builder = new WasmModuleBuilder(); |
48 builder.addMemory(1, 1, false); | 49 builder.addMemory(1, 1, false); |
49 builder.exportMemoryAs("exported_mem"); | 50 builder.exportMemoryAs("exported_mem"); |
50 builder.addFunction("foo", kSig_i_i) | 51 builder.addFunction("foo", kSig_i_i) |
51 .addBody([ | 52 .addBody([ |
52 kExprGetLocal, 0, | 53 kExprGetLocal, 0, |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 .exportFunc(); | 222 .exportFunc(); |
222 instance = builder.instantiate({ | 223 instance = builder.instantiate({ |
223 imported_mem: exp_instance.exports.exported_mem}); | 224 imported_mem: exp_instance.exports.exported_mem}); |
224 } | 225 } |
225 for (var i = initial_size; i < maximum_size; i++) { | 226 for (var i = initial_size; i < maximum_size; i++) { |
226 assertEquals(i, instance.exports.grow(1)); | 227 assertEquals(i, instance.exports.grow(1)); |
227 assertEquals((i+1), instance.exports.mem_size()); | 228 assertEquals((i+1), instance.exports.mem_size()); |
228 } | 229 } |
229 assertEquals(-1, instance.exports.grow(1)); | 230 assertEquals(-1, instance.exports.grow(1)); |
230 })(); | 231 })(); |
231 | |
232 (function TestMemoryGrowWebAssemblyInstances() { | |
233 print("TestMemoryGrowWebAssemblyInstances"); | |
234 let memory = new WebAssembly.Memory({initial: 1, maximum: 15}); | |
235 var builder = new WasmModuleBuilder(); | |
236 builder.addImportedMemory("imported_mem"); | |
237 builder.addFunction("mem_size", kSig_i_v) | |
238 .addBody([kExprMemorySize, kMemoryZero]) | |
239 .exportAs("mem_size"); | |
240 builder.addFunction("grow", kSig_i_i) | |
241 .addBody([kExprGetLocal, 0, kExprGrowMemory, kMemoryZero]) | |
242 .exportFunc(); | |
243 var module = new WebAssembly.Module(builder.toBuffer()); | |
244 var instances = []; | |
245 for (var i = 0; i < 6; i++) { | |
246 instances.push(new WebAssembly.Instance(module, {imported_mem: memory})); | |
247 } | |
248 function verify_mem_size(expected_pages) { | |
249 assertEquals(expected_pages*kPageSize, | |
250 memory.buffer.byteLength); | |
251 for (var i = 0; i < 6; i++) { | |
252 assertEquals(expected_pages, instances[i].exports.mem_size()); | |
253 } | |
254 } | |
255 | |
256 // Verify initial memory size | |
257 verify_mem_size(1); | |
258 | |
259 // Verify memory size with interleaving calls to Memory.grow, | |
260 // GrowMemory opcode. | |
261 var current_mem_size = 1; | |
262 for (var i = 0; i < 5; i++) { | |
263 function grow(pages) { return instances[i].exports.grow(pages); } | |
264 assertEquals(current_mem_size, memory.grow(1)); | |
265 verify_mem_size(++current_mem_size); | |
266 assertEquals(current_mem_size, instances[i].exports.grow(1)); | |
267 verify_mem_size(++current_mem_size); | |
268 } | |
269 | |
270 assertThrows(() => memory.grow(5)); | |
271 })(); | |
272 | |
273 (function TestImportedMemoryGrowMultipleInstances() { | |
274 print("TestImportMemoryMultipleInstances"); | |
275 let memory = new WebAssembly.Memory({initial: 5, maximum: 100}); | |
276 var builder = new WasmModuleBuilder(); | |
277 builder.addImportedMemory("imported_mem"); | |
278 builder.addFunction("mem_size", kSig_i_v) | |
279 .addBody([kExprMemorySize, kMemoryZero]) | |
280 .exportFunc(); | |
281 builder.addFunction("grow", kSig_i_i) | |
282 .addBody([kExprGetLocal, 0, kExprGrowMemory, kMemoryZero]) | |
283 .exportFunc(); | |
284 var instances = []; | |
285 for (var i = 0; i < 5; i++) { | |
286 instances.push(builder.instantiate({imported_mem: memory})); | |
287 } | |
288 function grow_instance_0(pages) { return instances[0].exports.grow(pages); } | |
289 function grow_instance_1(pages) { return instances[1].exports.grow(pages); } | |
290 function grow_instance_2(pages) { return instances[2].exports.grow(pages); } | |
291 function grow_instance_3(pages) { return instances[3].exports.grow(pages); } | |
292 function grow_instance_4(pages) { return instances[4].exports.grow(pages); } | |
293 | |
294 function verify_mem_size(expected_pages) { | |
295 assertEquals(expected_pages*kPageSize, memory.buffer.byteLength); | |
296 for (var i = 0; i < 5; i++) { | |
297 assertEquals(expected_pages, instances[i].exports.mem_size()); | |
298 } | |
299 } | |
300 | |
301 // Verify initial memory size | |
302 verify_mem_size(5); | |
303 | |
304 // Grow instance memory and buffer memory out of order and verify memory is | |
305 // updated correctly. | |
306 assertEquals(5, grow_instance_0(7)); | |
307 verify_mem_size(12); | |
308 | |
309 assertEquals(12, memory.grow(4)); | |
310 verify_mem_size(16); | |
311 | |
312 assertEquals(16, grow_instance_4(1)); | |
313 verify_mem_size(17); | |
314 | |
315 assertEquals(17, grow_instance_1(6)); | |
316 verify_mem_size(23); | |
317 | |
318 assertEquals(23, grow_instance_3(2)); | |
319 verify_mem_size(25); | |
320 | |
321 assertEquals(25, memory.grow(10)); | |
322 verify_mem_size(35); | |
323 | |
324 assertEquals(35, grow_instance_2(15)); | |
325 verify_mem_size(50); | |
326 assertThrows(() => memory.grow(51)); | |
327 })(); | |
328 | |
329 (function TestExportImportedMemoryGrowMultipleInstances() { | |
330 // TODO(gdeepti):Exported memory objects currently do not take max_size | |
331 // into account so this can grow past the maximum specified in the exported | |
332 // memory object. Assert that growing past maximum for exported objects fails. | |
333 print("TestExportImportedMemoryGrowMultipleInstances"); | |
334 var instance; | |
335 { | |
336 let builder = new WasmModuleBuilder(); | |
337 builder.addMemory(1, 11, true); | |
338 builder.exportMemoryAs("exported_mem"); | |
339 builder.addFunction("mem_size", kSig_i_v) | |
340 .addBody([kExprMemorySize, kMemoryZero]) | |
341 .exportFunc(); | |
342 instance = builder.instantiate(); | |
343 } | |
344 var builder = new WasmModuleBuilder(); | |
345 builder.addImportedMemory("imported_mem"); | |
346 builder.addFunction("mem_size", kSig_i_v) | |
347 .addBody([kExprMemorySize, kMemoryZero]) | |
348 .exportFunc(); | |
349 builder.addFunction("grow", kSig_i_i) | |
350 .addBody([kExprGetLocal, 0, kExprGrowMemory, kMemoryZero]) | |
351 .exportFunc(); | |
352 var instances = []; | |
353 for (var i = 0; i < 10; i++) { | |
354 instances.push(builder.instantiate({ | |
355 imported_mem: instance.exports.exported_mem})); | |
356 } | |
357 function verify_mem_size(expected_pages) { | |
358 for (var i = 0; i < 10; i++) { | |
359 assertEquals(expected_pages, instances[i].exports.mem_size()); | |
360 } | |
361 } | |
362 var current_mem_size = 1; | |
363 for (var i = 0; i < 10; i++) { | |
364 function grow(pages) { return instances[i].exports.grow(pages); } | |
365 assertEquals(current_mem_size, instances[i].exports.grow(1)); | |
366 verify_mem_size(++current_mem_size); | |
367 } | |
368 })(); | |
OLD | NEW |