map-get-nongcthing.js (7031B)
1 // Similar test as "cacheir/map-get-nongcthing.js", except that we now perform 2 // duplicate lookups to ensure GVN works properly. 3 4 // Return a new map, possibly filling some dummy entries to enforce creating 5 // multiple hash buckets. 6 function createMap(values, n) { 7 var xs = [...values]; 8 for (var i = 0; i < n; ++i) { 9 xs.push({}); 10 } 11 return new Map(xs.map((x, i) => [x, i + 1])); 12 } 13 14 function runTest(fn) { 15 fn(0); 16 fn(100); 17 } 18 19 function testInt32_same_map(n) { 20 var xs = [1, 2]; 21 var ys = [3, 4]; 22 var zs = [...xs, ...ys]; 23 var map = createMap(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 var v = map.get(z); 30 if (v !== undefined) c += v; 31 var w = map.get(z); 32 if (w !== undefined) c += w; 33 } 34 assertEq(c, N + N / 2); 35 } 36 runTest(testInt32_same_map); 37 38 function testDouble_same_map(n) { 39 var xs = [Math.PI, Infinity]; 40 var ys = [Math.E, -Infinity]; 41 var zs = [...xs, ...ys]; 42 var map = createMap(xs, n); 43 44 var N = 100; 45 var c = 0; 46 for (var i = 0; i < N; ++i) { 47 var z = zs[i & 3]; 48 var v = map.get(z); 49 if (v !== undefined) c += v; 50 var w = map.get(z); 51 if (w !== undefined) c += w; 52 } 53 assertEq(c, N + N / 2); 54 } 55 runTest(testDouble_same_map); 56 57 function testZero_same_map(n) { 58 var xs = [0, -0]; 59 var ys = [1, -1]; 60 var zs = [...xs, ...ys]; 61 var map = createMap([0], n); 62 63 var N = 100; 64 var c = 0; 65 for (var i = 0; i < N; ++i) { 66 var z = zs[i & 3]; 67 var v = map.get(z); 68 if (v !== undefined) c += v; 69 var w = map.get(z); 70 if (w !== undefined) c += w; 71 } 72 assertEq(c, N); 73 } 74 runTest(testZero_same_map); 75 76 function testNaN_same_map(n) { 77 var xs = [NaN, -NaN]; 78 var ys = [1, -1]; 79 var zs = [...xs, ...ys]; 80 var map = createMap([NaN], n); 81 82 var N = 100; 83 var c = 0; 84 for (var i = 0; i < N; ++i) { 85 var z = zs[i & 3]; 86 var v = map.get(z); 87 if (v !== undefined) c += v; 88 var w = map.get(z); 89 if (w !== undefined) c += w; 90 } 91 assertEq(c, N); 92 } 93 runTest(testNaN_same_map); 94 95 function testUndefinedAndNull_same_map(n) { 96 var xs = [undefined, null]; 97 var ys = [1, -1]; 98 var zs = [...xs, ...ys]; 99 var map = createMap(xs, n); 100 101 var N = 100; 102 var c = 0; 103 for (var i = 0; i < N; ++i) { 104 var z = zs[i & 3]; 105 var v = map.get(z); 106 if (v !== undefined) c += v; 107 var w = map.get(z); 108 if (w !== undefined) c += w; 109 } 110 assertEq(c, N + N / 2); 111 } 112 runTest(testUndefinedAndNull_same_map); 113 114 function testBoolean_same_map(n) { 115 var xs = [true, false]; 116 var ys = [1, -1]; 117 var zs = [...xs, ...ys]; 118 var map = createMap(xs, n); 119 120 var N = 100; 121 var c = 0; 122 for (var i = 0; i < N; ++i) { 123 var z = zs[i & 3]; 124 var v = map.get(z); 125 if (v !== undefined) c += v; 126 var w = map.get(z); 127 if (w !== undefined) c += w; 128 } 129 assertEq(c, N + N / 2); 130 } 131 runTest(testBoolean_same_map); 132 133 // Duplicate the above tests, but this time use a different map. 134 135 function testInt32_different_map(n) { 136 var xs = [1, 2]; 137 var ys = [3, 4]; 138 var zs = [...xs, ...ys]; 139 var map1 = createMap(xs, n); 140 var map2 = createMap(xs, n); 141 142 var N = 100; 143 var c = 0; 144 for (var i = 0; i < N; ++i) { 145 var z = zs[i & 3]; 146 var v = map1.get(z); 147 if (v !== undefined) c += v; 148 var w = map2.get(z); 149 if (w !== undefined) c += w; 150 } 151 assertEq(c, N + N / 2); 152 } 153 runTest(testInt32_different_map); 154 155 function testDouble_different_map(n) { 156 var xs = [Math.PI, Infinity]; 157 var ys = [Math.E, -Infinity]; 158 var zs = [...xs, ...ys]; 159 var map1 = createMap(xs, n); 160 var map2 = createMap(xs, n); 161 162 var N = 100; 163 var c = 0; 164 for (var i = 0; i < N; ++i) { 165 var z = zs[i & 3]; 166 var v = map1.get(z); 167 if (v !== undefined) c += v; 168 var w = map2.get(z); 169 if (w !== undefined) c += w; 170 } 171 assertEq(c, N + N / 2); 172 } 173 runTest(testDouble_different_map); 174 175 function testZero_different_map(n) { 176 var xs = [0, -0]; 177 var ys = [1, -1]; 178 var zs = [...xs, ...ys]; 179 var map1 = createMap([0], n); 180 var map2 = createMap([0], n); 181 182 var N = 100; 183 var c = 0; 184 for (var i = 0; i < N; ++i) { 185 var z = zs[i & 3]; 186 var v = map1.get(z); 187 if (v !== undefined) c += v; 188 var w = map2.get(z); 189 if (w !== undefined) c += w; 190 } 191 assertEq(c, N); 192 } 193 runTest(testZero_different_map); 194 195 function testNaN_different_map(n) { 196 var xs = [NaN, -NaN]; 197 var ys = [1, -1]; 198 var zs = [...xs, ...ys]; 199 var map1 = createMap([NaN], n); 200 var map2 = createMap([NaN], 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 var v = map1.get(z); 207 if (v !== undefined) c += v; 208 var w = map2.get(z); 209 if (w !== undefined) c += w; 210 } 211 assertEq(c, N); 212 } 213 runTest(testNaN_different_map); 214 215 function testUndefinedAndNull_different_map(n) { 216 var xs = [undefined, null]; 217 var ys = [1, -1]; 218 var zs = [...xs, ...ys]; 219 var map1 = createMap(xs, n); 220 var map2 = createMap(xs, n); 221 222 var N = 100; 223 var c = 0; 224 for (var i = 0; i < N; ++i) { 225 var z = zs[i & 3]; 226 var v = map1.get(z); 227 if (v !== undefined) c += v; 228 var w = map2.get(z); 229 if (w !== undefined) c += w; 230 } 231 assertEq(c, N + N / 2); 232 } 233 runTest(testUndefinedAndNull_different_map); 234 235 function testBoolean_different_map(n) { 236 var xs = [true, false]; 237 var ys = [1, -1]; 238 var zs = [...xs, ...ys]; 239 var map1 = createMap(xs, n); 240 var map2 = createMap(xs, n); 241 242 var N = 100; 243 var c = 0; 244 for (var i = 0; i < N; ++i) { 245 var z = zs[i & 3]; 246 var v = map1.get(z); 247 if (v !== undefined) c += v; 248 var w = map2.get(z); 249 if (w !== undefined) c += w; 250 } 251 assertEq(c, N + N / 2); 252 } 253 runTest(testBoolean_different_map); 254 255 // Test the alias information is correct. 256 257 function testInt32_alias(n) { 258 var xs = [1, 2]; 259 var map = createMap([], n); 260 261 var N = 100; 262 var c = 0; 263 for (var i = 0; i < N; ++i) { 264 var x = xs[i & 1]; 265 266 map.set(x, 1); 267 var v = map.get(x); 268 269 map.delete(x); 270 var w = map.get(x); 271 272 c += v; 273 assertEq(w, undefined); 274 } 275 assertEq(c, N); 276 } 277 runTest(testInt32_alias); 278 279 function testDouble_alias(n) { 280 var xs = [Math.PI, Infinity]; 281 var map = createMap([], n); 282 283 var N = 100; 284 var c = 0; 285 for (var i = 0; i < N; ++i) { 286 var x = xs[i & 1]; 287 288 map.set(x, 1); 289 var v = map.get(x); 290 291 map.delete(x); 292 var w = map.get(x); 293 294 c += v; 295 assertEq(w, undefined); 296 } 297 assertEq(c, N); 298 } 299 runTest(testDouble_alias); 300 301 function testUndefinedAndNull_alias(n) { 302 var xs = [undefined, null]; 303 var map = createMap([], n); 304 305 var N = 100; 306 var c = 0; 307 for (var i = 0; i < N; ++i) { 308 var x = xs[i & 1]; 309 310 map.set(x, 1); 311 var v = map.get(x); 312 313 map.delete(x); 314 var w = map.get(x); 315 316 c += v; 317 assertEq(w, undefined); 318 } 319 assertEq(c, N); 320 } 321 runTest(testUndefinedAndNull_alias); 322 323 function testBoolean_alias(n) { 324 var xs = [true, false]; 325 var map = createMap([], n); 326 327 var N = 100; 328 var c = 0; 329 for (var i = 0; i < N; ++i) { 330 var x = xs[i & 1]; 331 332 map.set(x, 1); 333 var v = map.get(x); 334 335 map.delete(x); 336 var w = map.get(x); 337 338 c += v; 339 assertEq(w, undefined); 340 } 341 assertEq(c, N); 342 } 343 runTest(testBoolean_alias);