| 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); | 
|  |