set-has-object.js (1844B)
1 // Similar test as "cacheir/set-has-object.js", except that we now perform 2 // duplicate lookups to ensure GVN works properly. 3 4 // Return a new set, possibly filling some dummy entries to enforce creating 5 // multiple hash buckets. 6 function createSet(values, n) { 7 var xs = [...values]; 8 for (var i = 0; i < n; ++i) { 9 xs.push({}); 10 } 11 return new Set(xs); 12 } 13 14 function runTest(fn) { 15 fn(0); 16 fn(100); 17 } 18 19 function test_same_set(n) { 20 var xs = [{}, {}]; 21 var ys = [{}, {}]; 22 var zs = [...xs, ...ys]; 23 var set = createSet(xs, n); 24 25 var N = 100; 26 var c = 0; 27 for (var i = 0; i < N; ++i) { 28 var z = zs[i & 3]; 29 if (set.has(z)) c++; 30 if (set.has(z)) c++; 31 } 32 assertEq(c, N); 33 } 34 runTest(test_same_set); 35 36 // Duplicate the above tests, but this time use a different set. 37 38 function test_different_set(n) { 39 var xs = [{}, {}]; 40 var ys = [{}, {}]; 41 var zs = [...xs, ...ys]; 42 var set1 = createSet(xs, n); 43 var set2 = createSet(xs, n); 44 45 var N = 100; 46 var c = 0; 47 for (var i = 0; i < N; ++i) { 48 var z = zs[i & 3]; 49 if (set1.has(z)) c++; 50 if (set2.has(z)) c++; 51 } 52 assertEq(c, N); 53 } 54 runTest(test_different_set); 55 56 // Test the alias information is correct. 57 58 function test_alias(n) { 59 var xs = [{}, {}]; 60 var set = createSet([], n); 61 62 var N = 100; 63 var c = 0; 64 for (var i = 0; i < N; ++i) { 65 var x = xs[i & 1]; 66 67 set.add(x); 68 if (set.has(x)) c++; 69 70 set.delete(x); 71 if (set.has(x)) c++; 72 } 73 assertEq(c, N); 74 } 75 runTest(test_alias); 76 77 // And finally test that we don't actually support GVN for objects, because the 78 // hash changes when moving an object. 79 80 function testRekey() { 81 var set = new Set(); 82 var c = 0; 83 var N = 100; 84 for (var i = 0; i < N; ++i) { 85 var k = {}; 86 set.add(k); 87 88 if (set.has(k)) c++; 89 90 minorgc(); 91 92 if (set.has(k)) c++; 93 } 94 95 assertEq(c, N * 2); 96 } 97 testRekey();