bug-1643913.js (741B)
1 gczeal(0); 2 3 for (let p of [false, true]) { 4 f(p); 5 6 // Run an incremental GC to completion. 7 startgc(1); 8 while (gcstate() !== 'NotActive') { 9 gcslice(10000, { dontStart: true }); 10 } 11 } 12 13 function ccwToObject() { 14 return evalcx('({})', newGlobal({newCompartment: true})); 15 } 16 17 function ccwToRegistry() { 18 return evalcx('new FinalizationRegistry(value => {})', 19 newGlobal({newCompartment: true})); 20 } 21 22 function f(p) { 23 let registry = ccwToRegistry(); 24 let target = ccwToObject(); 25 registry.register(target, undefined); 26 27 // Add a CCW from registry to target zone or vice versa to control 28 // the order the zones are swept in. 29 if (p) { 30 registry.ptr = target; 31 } else { 32 target.ptr = registry; 33 } 34 35 gc(); 36 }