| // 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 --allow-natives-syntax |
| |
| load("test/mjsunit/wasm/wasm-constants.js"); |
| load("test/mjsunit/wasm/wasm-module-builder.js"); |
| |
| // Use global variables for all values where the test wants to maintain strict |
| // control over value lifetime. Using local variables would not give sufficient |
| // guarantees of the value lifetime. |
| var module; |
| var instance1; |
| var instance2; |
| var instance3; |
| var instance4; |
| |
| (function CompiledModuleInstancesInitialize1to3() { |
| var builder = new WasmModuleBuilder(); |
| |
| builder.addMemory(1,1, true); |
| builder.addImport("", "getValue", kSig_i_v); |
| builder.addFunction("f", kSig_i_v) |
| .addBody([ |
| kExprCallFunction, 0 |
| ]).exportFunc(); |
| |
| module = new WebAssembly.Module(builder.toBuffer()); |
| %ValidateWasmModuleState(module); |
| %ValidateWasmInstancesChain(module, 0); |
| instance1 = new WebAssembly.Instance(module, {"": {getValue: () => 1}}); |
| %ValidateWasmInstancesChain(module, 1); |
| instance2 = new WebAssembly.Instance(module, {"": {getValue: () => 2}}); |
| %ValidateWasmInstancesChain(module, 2); |
| instance3 = new WebAssembly.Instance(module, {"": {getValue: () => 3}}); |
| %ValidateWasmInstancesChain(module, 3); |
| })(); |
| |
| (function CompiledModuleInstancesClear1() { |
| assertEquals(1, instance1.exports.f()); |
| instance1 = null; |
| })(); |
| |
| gc(); |
| %ValidateWasmInstancesChain(module, 2); |
| |
| (function CompiledModuleInstancesClear3() { |
| assertEquals(3, instance3.exports.f()); |
| instance3 = null; |
| })(); |
| |
| gc(); |
| %ValidateWasmInstancesChain(module, 1); |
| |
| (function CompiledModuleInstancesClear2() { |
| assertEquals(2, instance2.exports.f()); |
| instance2 = null; |
| })(); |
| |
| gc(); |
| %ValidateWasmModuleState(module); |
| |
| (function CompiledModuleInstancesInitialize4AndClearModule() { |
| instance4 = new WebAssembly.Instance(module, {"": {getValue: () => 4}}); |
| assertEquals(4, instance4.exports.f()); |
| module = null; |
| })(); |
| |
| gc(); |
| // the first GC will clear the module, the second the instance. |
| gc(); |
| %ValidateWasmOrphanedInstance(instance4); |