| // 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-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()); |
| |
| print("Initial instances=0"); |
| assertEquals(0, %WasmGetNumberOfInstances(module)); |
| instance1 = new WebAssembly.Instance(module, {"": {getValue: () => 1}}); |
| |
| print("Initial instances=1"); |
| assertEquals(1, %WasmGetNumberOfInstances(module)); |
| instance2 = new WebAssembly.Instance(module, {"": {getValue: () => 2}}); |
| |
| print("Initial instances=2"); |
| assertEquals(2, %WasmGetNumberOfInstances(module)); |
| instance3 = new WebAssembly.Instance(module, {"": {getValue: () => 3}}); |
| |
| print("Initial instances=3"); |
| assertEquals(3, %WasmGetNumberOfInstances(module)); |
| })(); |
| |
| (function CompiledModuleInstancesClear1() { |
| assertEquals(1, instance1.exports.f()); |
| instance1 = null; |
| })(); |
| |
| // Note that two GC's are required because weak slots clearing is deferred. |
| gc(); |
| gc(); |
| print("After gc instances=2"); |
| assertEquals(2, %WasmGetNumberOfInstances(module)); |
| |
| (function CompiledModuleInstancesClear3() { |
| assertEquals(3, instance3.exports.f()); |
| instance3 = null; |
| })(); |
| |
| // Note that two GC's are required because weak slots clearing is deferred. |
| gc(); |
| gc(); |
| print("After gc instances=1"); |
| assertEquals(1, %WasmGetNumberOfInstances(module)); |
| |
| (function CompiledModuleInstancesClear2() { |
| assertEquals(2, instance2.exports.f()); |
| instance2 = null; |
| })(); |
| |
| // Note that two GC's are required because weak slots clearing is deferred. |
| gc(); |
| gc(); |
| print("After gc instances=0"); |
| assertEquals(0, %WasmGetNumberOfInstances(module)); |
| |
| (function CompiledModuleInstancesInitialize4AndClearModule() { |
| instance4 = new WebAssembly.Instance(module, {"": {getValue: () => 4}}); |
| assertEquals(4, instance4.exports.f()); |
| module = null; |
| instance4 = null; |
| })(); |
| |
| // Note that two GC's are required because weak slots clearing is deferred. |
| gc(); |
| gc(); |