finalizationRegistry-multiple.js (1030B)
1 // Check we get the semantics right when registering the same target multiple 2 // times and when unregister tokens die before the registry. 3 4 gczeal(0); 5 6 let vs = []; 7 let r = new FinalizationRegistry(v => vs.push(v)); 8 let t; 9 10 function check(n) { 11 gc(); 12 drainJobQueue(); 13 assertEq(vs.length, n); 14 vs = vs.sort(); 15 for (let i = 0; i < n; i++) { 16 assertEq(vs[i], i); 17 } 18 vs = []; 19 } 20 21 // No token. 22 23 t = {}; 24 r.register(t, 0); 25 r.register(t, 1); 26 check(0); 27 t = undefined; 28 check(2); 29 30 // One token. 31 32 t = {}; 33 let k = {}; 34 r.register(t, 0, k); 35 r.register(t, 1, k); 36 check(0); 37 k = undefined; 38 check(0); 39 t = undefined; 40 check(2); 41 42 // Two tokens. 43 44 t = {}; 45 let k1 = {}; 46 let k2 = {}; 47 r.register(t, 0, k1); 48 r.register(t, 1, k1); 49 r.register(t, 2, k2); 50 r.register(t, 3, k2); 51 check(0); 52 t = undefined; 53 check(4); 54 55 // Two tokens with unregister. 56 57 t = {}; 58 k1 = {}; 59 k2 = {}; 60 r.register(t, 0, k1); 61 r.register(t, 1, k1); 62 r.register(t, 2, k2); 63 r.register(t, 3, k2); 64 check(0); 65 r.unregister(k2); 66 check(0); 67 k1 = undefined; 68 check(0); 69 t = undefined; 70 check(2);