set-has-symbol.js (1535B)
1 // Similar test as "cacheir/set-has-symbol.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 = [Symbol(), Symbol()]; 21 var ys = [Symbol(), Symbol()]; 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 = [Symbol(), Symbol()]; 40 var ys = [Symbol(), Symbol()]; 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 = [Symbol(), Symbol()]; 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);