summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/wasm/instance-gc.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/wasm/instance-gc.js')
-rw-r--r--deps/v8/test/mjsunit/wasm/instance-gc.js122
1 files changed, 122 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/wasm/instance-gc.js b/deps/v8/test/mjsunit/wasm/instance-gc.js
new file mode 100644
index 0000000000..1713f27b99
--- /dev/null
+++ b/deps/v8/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);