| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --expose-wasm --expose-gc |
| |
| load("test/mjsunit/wasm/wasm-constants.js"); |
| load("test/mjsunit/wasm/wasm-module-builder.js"); |
| |
| let nogc = () => {}; |
| |
| function newModule() { |
| let builder = new WasmModuleBuilder(); |
| builder.addMemory(1, 1, true); |
| builder.addFunction("main", kSig_i_v) |
| .addBody([kExprI32Const, 0, kExprI32LoadMem, 0, 0]) |
| .exportFunc(); |
| |
| return new WebAssembly.Module(builder.toBuffer()); |
| } |
| |
| function newInstance(module, val) { |
| var instance = new WebAssembly.Instance(module); |
| var view = new Int32Array(instance.exports.memory.buffer); |
| view[0] = val; |
| return instance; |
| } |
| |
| function TestSingleLiveInstance(gc) { |
| let module = newModule(); |
| |
| print("TestSingleLiveInstance..."); |
| for (var i = 0; i < 5; i++) { |
| (() => { // don't leak references between iterations. |
| print(" [" + i + "]..."); |
| gc(); |
| var instance = newInstance(module, i + 99); |
| assertEquals(i + 99, instance.exports.main()); |
| })(); |
| } |
| } |
| |
| TestSingleLiveInstance(nogc); |
| TestSingleLiveInstance(gc); |
| |
| function TestMultiInstance(gc) { |
| let module = newModule(); |
| |
| print("TestMultiInstance..."); |
| // Note: compute the root instances in another function to be |
| // sure that {roots} really is the only set of roots to the instances. |
| let roots = (() => { return [ |
| newInstance(module, 33), |
| newInstance(module, 4444), |
| newInstance(module, 555555) |
| ];})(); |
| |
| (() => { // don't leak references! |
| print(" [0]..."); |
| gc(); |
| assertEquals(33, roots[0].exports.main()); |
| roots[0] = null; |
| })(); |
| |
| (() => { // don't leak references! |
| print(" [1]..."); |
| gc(); |
| assertEquals(4444, roots[1].exports.main()); |
| roots[1] = null; |
| })(); |
| |
| (() => { // don't leak references! |
| print(" [2]..."); |
| gc(); |
| assertEquals(555555, roots[2].exports.main()); |
| roots[2] = null; |
| })(); |
| } |
| |
| TestMultiInstance(nogc); |
| TestMultiInstance(gc); |
| |
| function TestReclaimingCompiledModule() { |
| let module = newModule(); |
| |
| print("TestReclaimingCompiledModule..."); |
| let roots = (() => { return [ |
| newInstance(module, 7777), |
| newInstance(module, 8888), |
| ];})(); |
| |
| (() => { // don't leak references! |
| print(" [0]..."); |
| assertEquals(7777, roots[0].exports.main()); |
| assertEquals(8888, roots[1].exports.main()); |
| roots[1] = null; |
| })(); |
| |
| (() => { // don't leak references! |
| print(" [1]..."); |
| gc(); |
| roots[1] = newInstance(module, 9999); |
| assertEquals(7777, roots[0].exports.main()); |
| assertEquals(9999, roots[1].exports.main()); |
| roots[0] = null; |
| roots[1] = null; |
| })(); |
| |
| (() => { // don't leak references! |
| print(" [2]..."); |
| gc(); |
| roots[0] = newInstance(module, 11111); |
| roots[1] = newInstance(module, 22222); |
| assertEquals(11111, roots[0].exports.main()); |
| assertEquals(22222, roots[1].exports.main()); |
| roots[0] = null; |
| roots[1] = null; |
| })(); |
| } |
| |
| TestReclaimingCompiledModule(nogc); |
| TestReclaimingCompiledModule(gc); |