Index: test/mjsunit/wasm/instance-gc.js |
diff --git a/test/mjsunit/wasm/instance-gc.js b/test/mjsunit/wasm/instance-gc.js |
new file mode 100644 |
index 0000000000000000000000000000000000000000..1713f27b99af2eec16480445d0cc89a09fb264d2 |
--- /dev/null |
+++ b/test/mjsunit/wasm/instance-gc.js |
@@ -0,0 +1,122 @@ |
+// 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) |
+ .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); |