| --- weak-marking-02.js |
| +++ weak-marking-02.js |
| @@ -0,0 +1,63 @@ |
| +// These tests will be using object literals as keys, and we want some of them |
| +// to be dead after being inserted into a WeakMap. That means we must wrap |
| +// everything in functions because it seems like the toplevel script hangs onto |
| +// its object literals. |
| + |
| +// Cross-compartment WeakMap keys work by storing a cross-compartment wrapper |
| +// in the WeakMap, and the actual "delegate" object in the target compartment |
| +// is the thing whose liveness is checked. |
| + |
| +var g2 = newGlobal(); |
| +g2.eval('function genObj(name) { return {"name": name} }'); |
| + |
| +function basicSweeping() { |
| + var wm1 = new WeakMap(); |
| + wm1.set({'name': 'obj1'}, {'name': 'val1'}); |
| + var hold = g2.genObj('obj2'); |
| + wm1.set(hold, {'name': 'val2'}); |
| + wm1.set({'name': 'obj3'}, {'name': 'val3'}); |
| + var obj4 = g2.genObj('obj4'); |
| + wm1.set(obj4, {'name': 'val3'}); |
| + obj4 = undefined; |
| + |
| + gc(); |
| + assertEq(wm1.get(hold).name, 'val2'); |
| + assertEq(nondeterministicGetWeakMapKeys(wm1).length, 1); |
| +} |
| + |
| +basicSweeping(); |
| + |
| +// Same, but behind an additional WM layer, to avoid ordering problems (not |
| +// that I've checked that basicSweeping even has any problems.) |
| +function basicSweeping2() { |
| + var wm1 = new WeakMap(); |
| + wm1.set({'name': 'obj1'}, {'name': 'val1'}); |
| + var hold = g2.genObj('obj2'); |
| + wm1.set(hold, {'name': 'val2'}); |
| + wm1.set({'name': 'obj3'}, {'name': 'val3'}); |
| + var obj4 = g2.genObj('obj4'); |
| + wm1.set(obj4, {'name': 'val3'}); |
| + obj4 = undefined; |
| + |
| + var base1 = {'name': 'base1'}; |
| + var base2 = {'name': 'base2'}; |
| + var wm_base1 = new WeakMap(); |
| + var wm_base2 = new WeakMap(); |
| + wm_base1.set(base1, wm_base2); |
| + wm_base2.set(base2, wm1); |
| + wm1 = wm_base2 = undefined; |
| + |
| + gc(); |
| + |
| + assertEq(nondeterministicGetWeakMapKeys(wm_base1).length, 1); |
| + wm_base2 = wm_base1.get(base1); |
| + assertEq(nondeterministicGetWeakMapKeys(wm_base2).length, 1); |
| + assertEq(nondeterministicGetWeakMapKeys(wm_base1)[0], base1); |
| + assertEq(nondeterministicGetWeakMapKeys(wm_base2)[0], base2); |
| + wm_base2 = wm_base1.get(base1); |
| + wm1 = wm_base2.get(base2); |
| + assertEq(wm1.get(hold).name, 'val2'); |
| + assertEq(nondeterministicGetWeakMapKeys(wm1).length, 1); |
| +} |
| + |
| +basicSweeping2(); |