set-has-value.js (2160B)
1 // Similar test as "cacheir/set-has-value.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 testPolymorphic_same_set(n) { 20 var xs = [10, 10.5, "test", Symbol("?"), 123n, -123n, {}, []]; 21 var ys = [-0, NaN, "bad", Symbol("!"), 42n, -99n, {}, []]; 22 var zs = [...xs, ...ys]; 23 var set = createSet(xs, n); 24 25 var N = 128; 26 var c = 0; 27 for (var i = 0; i < N; ++i) { 28 var z = zs[i & 15]; 29 if (set.has(z)) c++; 30 if (set.has(z)) c++; 31 } 32 assertEq(c, N); 33 } 34 runTest(testPolymorphic_same_set); 35 36 // Duplicate the above tests, but this time use a different set. 37 38 function testPolymorphic_different_set(n) { 39 var xs = [10, 10.5, "test", Symbol("?"), 123n, -123n, {}, []]; 40 var ys = [-0, NaN, "bad", Symbol("!"), 42n, -99n, {}, []]; 41 var zs = [...xs, ...ys]; 42 var set1 = createSet(xs, n); 43 var set2 = createSet(xs, n); 44 45 var N = 128; 46 var c = 0; 47 for (var i = 0; i < N; ++i) { 48 var z = zs[i & 15]; 49 if (set1.has(z)) c++; 50 if (set2.has(z)) c++; 51 } 52 assertEq(c, N); 53 } 54 runTest(testPolymorphic_different_set); 55 56 // Test the alias information is correct. 57 58 function testPolymorphic_alias(n) { 59 var xs = [10, 10.5, "test", Symbol("?"), 123n, -123n, {}, []]; 60 var set = createSet([], n); 61 62 var N = 128; 63 var c = 0; 64 for (var i = 0; i < N; ++i) { 65 var x = xs[i & 15]; 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(testPolymorphic_alias); 76 77 // And finally test that we don't actually support GVN for values, because the 78 // hash changes when moving a value which holds 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 = (i & 1) ? {} : null; 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();