v8/test/mjsunit/wasm/instance-gc.js
titzer e97ca6ec47 [wasm] Refactor import handling for 0xC.
Imports and exports in 0xC can be much more than functions, including
tables, memories, and globals. This CL refactors the underlying
organization of imports and exports to support these new import types.

BUG=

Committed: https://crrev.com/599f8a83420346d9cba5ff97bd2a7520468207b6
Review-Url: https://codereview.chromium.org/2390113003
Cr-Original-Commit-Position: refs/heads/master@{#40033}
Cr-Commit-Position: refs/heads/master@{#40050}
2016-10-06 15:43:22 +00:00

123 lines
3.0 KiB
JavaScript

// 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_v)
.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);