set-has-nongcthing.js (6005B)
1 // Similar test as "cacheir/set-has-nongcthing.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 testInt32_same_set(n) { 20 var xs = [1, 2]; 21 var ys = [3, 4]; 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(testInt32_same_set); 35 36 function testDouble_same_set(n) { 37 var xs = [Math.PI, Infinity]; 38 var ys = [Math.E, -Infinity]; 39 var zs = [...xs, ...ys]; 40 var set = createSet(xs, n); 41 42 var N = 100; 43 var c = 0; 44 for (var i = 0; i < N; ++i) { 45 var z = zs[i & 3]; 46 if (set.has(z)) c++; 47 if (set.has(z)) c++; 48 } 49 assertEq(c, N); 50 } 51 runTest(testDouble_same_set); 52 53 function testZero_same_set(n) { 54 var xs = [0, -0]; 55 var ys = [1, -1]; 56 var zs = [...xs, ...ys]; 57 var set = createSet([0], n); 58 59 var N = 100; 60 var c = 0; 61 for (var i = 0; i < N; ++i) { 62 var z = zs[i & 3]; 63 if (set.has(z)) c++; 64 if (set.has(z)) c++; 65 } 66 assertEq(c, N); 67 } 68 runTest(testZero_same_set); 69 70 function testNaN_same_set(n) { 71 var xs = [NaN, -NaN]; 72 var ys = [1, -1]; 73 var zs = [...xs, ...ys]; 74 var set = createSet([NaN], n); 75 76 var N = 100; 77 var c = 0; 78 for (var i = 0; i < N; ++i) { 79 var z = zs[i & 3]; 80 if (set.has(z)) c++; 81 if (set.has(z)) c++; 82 } 83 assertEq(c, N); 84 } 85 runTest(testNaN_same_set); 86 87 function testUndefinedAndNull_same_set(n) { 88 var xs = [undefined, null]; 89 var ys = [1, -1]; 90 var zs = [...xs, ...ys]; 91 var set = createSet(xs, n); 92 93 var N = 100; 94 var c = 0; 95 for (var i = 0; i < N; ++i) { 96 var z = zs[i & 3]; 97 if (set.has(z)) c++; 98 if (set.has(z)) c++; 99 } 100 assertEq(c, N); 101 } 102 runTest(testUndefinedAndNull_same_set); 103 104 function testBoolean_same_set(n) { 105 var xs = [true, false]; 106 var ys = [1, -1]; 107 var zs = [...xs, ...ys]; 108 var set = createSet(xs, n); 109 110 var N = 100; 111 var c = 0; 112 for (var i = 0; i < N; ++i) { 113 var z = zs[i & 3]; 114 if (set.has(z)) c++; 115 if (set.has(z)) c++; 116 } 117 assertEq(c, N); 118 } 119 runTest(testBoolean_same_set); 120 121 // Duplicate the above tests, but this time use a different set. 122 123 function testInt32_different_set(n) { 124 var xs = [1, 2]; 125 var ys = [3, 4]; 126 var zs = [...xs, ...ys]; 127 var set1 = createSet(xs, n); 128 var set2 = createSet(xs, n); 129 130 var N = 100; 131 var c = 0; 132 for (var i = 0; i < N; ++i) { 133 var z = zs[i & 3]; 134 if (set1.has(z)) c++; 135 if (set2.has(z)) c++; 136 } 137 assertEq(c, N); 138 } 139 runTest(testInt32_different_set); 140 141 function testDouble_different_set(n) { 142 var xs = [Math.PI, Infinity]; 143 var ys = [Math.E, -Infinity]; 144 var zs = [...xs, ...ys]; 145 var set1 = createSet(xs, n); 146 var set2 = createSet(xs, n); 147 148 var N = 100; 149 var c = 0; 150 for (var i = 0; i < N; ++i) { 151 var z = zs[i & 3]; 152 if (set1.has(z)) c++; 153 if (set2.has(z)) c++; 154 } 155 assertEq(c, N); 156 } 157 runTest(testDouble_different_set); 158 159 function testZero_different_set(n) { 160 var xs = [0, -0]; 161 var ys = [1, -1]; 162 var zs = [...xs, ...ys]; 163 var set1 = createSet([0], n); 164 var set2 = createSet([0], n); 165 166 var N = 100; 167 var c = 0; 168 for (var i = 0; i < N; ++i) { 169 var z = zs[i & 3]; 170 if (set1.has(z)) c++; 171 if (set2.has(z)) c++; 172 } 173 assertEq(c, N); 174 } 175 runTest(testZero_different_set); 176 177 function testNaN_different_set(n) { 178 var xs = [NaN, -NaN]; 179 var ys = [1, -1]; 180 var zs = [...xs, ...ys]; 181 var set1 = createSet([NaN], n); 182 var set2 = createSet([NaN], n); 183 184 var N = 100; 185 var c = 0; 186 for (var i = 0; i < N; ++i) { 187 var z = zs[i & 3]; 188 if (set1.has(z)) c++; 189 if (set2.has(z)) c++; 190 } 191 assertEq(c, N); 192 } 193 runTest(testNaN_different_set); 194 195 function testUndefinedAndNull_different_set(n) { 196 var xs = [undefined, null]; 197 var ys = [1, -1]; 198 var zs = [...xs, ...ys]; 199 var set1 = createSet(xs, n); 200 var set2 = createSet(xs, n); 201 202 var N = 100; 203 var c = 0; 204 for (var i = 0; i < N; ++i) { 205 var z = zs[i & 3]; 206 if (set1.has(z)) c++; 207 if (set2.has(z)) c++; 208 } 209 assertEq(c, N); 210 } 211 runTest(testUndefinedAndNull_different_set); 212 213 function testBoolean_different_set(n) { 214 var xs = [true, false]; 215 var ys = [1, -1]; 216 var zs = [...xs, ...ys]; 217 var set1 = createSet(xs, n); 218 var set2 = createSet(xs, n); 219 220 var N = 100; 221 var c = 0; 222 for (var i = 0; i < N; ++i) { 223 var z = zs[i & 3]; 224 if (set1.has(z)) c++; 225 if (set2.has(z)) c++; 226 } 227 assertEq(c, N); 228 } 229 runTest(testBoolean_different_set); 230 231 // Test the alias information is correct. 232 233 function testInt32_alias(n) { 234 var xs = [1, 2]; 235 var set = createSet([], n); 236 237 var N = 100; 238 var c = 0; 239 for (var i = 0; i < N; ++i) { 240 var x = xs[i & 1]; 241 242 set.add(x); 243 if (set.has(x)) c++; 244 245 set.delete(x); 246 if (set.has(x)) c++; 247 } 248 assertEq(c, N); 249 } 250 runTest(testInt32_alias); 251 252 function testDouble_alias(n) { 253 var xs = [Math.PI, Infinity]; 254 var set = createSet([], n); 255 256 var N = 100; 257 var c = 0; 258 for (var i = 0; i < N; ++i) { 259 var x = xs[i & 1]; 260 261 set.add(x); 262 if (set.has(x)) c++; 263 264 set.delete(x); 265 if (set.has(x)) c++; 266 } 267 assertEq(c, N); 268 } 269 runTest(testDouble_alias); 270 271 function testUndefinedAndNull_alias(n) { 272 var xs = [undefined, null]; 273 var set = createSet([], n); 274 275 var N = 100; 276 var c = 0; 277 for (var i = 0; i < N; ++i) { 278 var x = xs[i & 1]; 279 280 set.add(x); 281 if (set.has(x)) c++; 282 283 set.delete(x); 284 if (set.has(x)) c++; 285 } 286 assertEq(c, N); 287 } 288 runTest(testUndefinedAndNull_alias); 289 290 function testBoolean_alias(n) { 291 var xs = [true, false]; 292 var set = createSet([], n); 293 294 var N = 100; 295 var c = 0; 296 for (var i = 0; i < N; ++i) { 297 var x = xs[i & 1]; 298 299 set.add(x); 300 if (set.has(x)) c++; 301 302 set.delete(x); 303 if (set.has(x)) c++; 304 } 305 assertEq(c, N); 306 } 307 runTest(testBoolean_alias);