| --- weak-marking-01.js |
| +++ weak-marking-01.js |
| @@ -85,15 +85,35 @@ function deadKeys() { |
| |
| gc(); |
| assertEq(finalizeCount(), initialCount + 2); |
| assertEq(nondeterministicGetWeakMapKeys(wm1).length, 0); |
| } |
| |
| deadKeys(); |
| |
| +// The weakKeys table has to grow if it encounters enough new unmarked weakmap |
| +// keys. Trigger this to happen during weakmap marking. |
| +// |
| +// There's some trickiness involved in getting it to test the right thing, |
| +// because if a key is marked before the weakmap, then it won't get entered |
| +// into the weakKeys table. This chains through multiple weakmap layers to |
| +// ensure that the objects can't get marked before the weakmaps. |
| function weakKeysRealloc() { |
| var wm1 = new WeakMap; |
| + var wm2 = new WeakMap; |
| + var wm3 = new WeakMap; |
| var obj1 = {'name': 'obj1'}; |
| - var wm2 = new WeakMap; |
| + var obj2 = {'name': 'obj2'}; |
| wm1.set(obj1, wm2); |
| - |
| + wm2.set(obj2, wm3); |
| + for (var i = 0; i < 10000; i++) { |
| + wm3.set(Object.create(null), wm2); |
| + } |
| + wm3.set(Object.create(null), makeFinalizeObserver()); |
| + wm2 = undefined; |
| + wm3 = undefined; |
| + obj2 = undefined; |
| + |
| + var initialCount = finalizeCount(); |
| + gc(); |
| + assertEq(finalizeCount(), initialCount + 1); |
| } |