import-gc.js (1615B)
1 // |jit-test| --no-baseline; --no-blinterp 2 // Turn off baseline and since it messes up the GC finalization assertions by 3 // adding spurious edges to the GC graph. 4 5 const Module = WebAssembly.Module; 6 const Instance = WebAssembly.Instance; 7 8 const m1 = new Module(wasmTextToBinary(`(module (func $f) (export "f" (func $f)))`)); 9 const m2 = new Module(wasmTextToBinary(`(module (import "a" "f" (func)) (func $f) (export "g" (func $f)))`)); 10 11 // Imported instance objects should stay alive as long as any importer is alive. 12 resetFinalizeCount(); 13 var i1 = new Instance(m1); 14 var i2 = new Instance(m2, {a:i1.exports}); 15 var f = i1.exports.f; 16 var g = i2.exports.g; 17 i1.edge = makeFinalizeObserver(); 18 i2.edge = makeFinalizeObserver(); 19 f.edge = makeFinalizeObserver(); 20 g.edge = makeFinalizeObserver(); 21 gc(); 22 assertEq(finalizeCount(), 0); 23 i1.exports = null; 24 f = null; 25 gc(); 26 assertEq(finalizeCount(), 0); 27 i2 = null; 28 gc(); 29 assertEq(finalizeCount(), 0); 30 i1 = null; 31 gc(); 32 assertEq(finalizeCount(), 0); 33 g = null; 34 gc(); 35 assertEq(finalizeCount(), 4); 36 37 // ...but the importee doesn't keep the importer alive. 38 resetFinalizeCount(); 39 var i1 = new Instance(m1); 40 var i2 = new Instance(m2, {a:i1.exports}); 41 var f = i1.exports.f; 42 var g = i2.exports.g; 43 i1.edge = makeFinalizeObserver(); 44 i2.edge = makeFinalizeObserver(); 45 f.edge = makeFinalizeObserver(); 46 g.edge = makeFinalizeObserver(); 47 gc(); 48 assertEq(finalizeCount(), 0); 49 i2.exports = null; 50 g = null; 51 gc(); 52 assertEq(finalizeCount(), 0); 53 i2 = null; 54 gc(); 55 assertEq(finalizeCount(), 2); 56 i1.exports = null; 57 f = null; 58 gc(); 59 assertEq(finalizeCount(), 2); 60 i1 = null; 61 gc(); 62 assertEq(finalizeCount(), 4);