map-has-nongcthing.js (6039B)
1 // Similar test as "cacheir/map-has-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])); 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 if (map.has(z)) c++; 30 if (map.has(z)) c++; 31 } 32 assertEq(c, N); 33 } 34 runTest(testInt32_same_map); 35 36 function testDouble_same_map(n) { 37 var xs = [Math.PI, Infinity]; 38 var ys = [Math.E, -Infinity]; 39 var zs = [...xs, ...ys]; 40 var map = createMap(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 (map.has(z)) c++; 47 if (map.has(z)) c++; 48 } 49 assertEq(c, N); 50 } 51 runTest(testDouble_same_map); 52 53 function testZero_same_map(n) { 54 var xs = [0, -0]; 55 var ys = [1, -1]; 56 var zs = [...xs, ...ys]; 57 var map = createMap([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 (map.has(z)) c++; 64 if (map.has(z)) c++; 65 } 66 assertEq(c, N); 67 } 68 runTest(testZero_same_map); 69 70 function testNaN_same_map(n) { 71 var xs = [NaN, -NaN]; 72 var ys = [1, -1]; 73 var zs = [...xs, ...ys]; 74 var map = createMap([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 (map.has(z)) c++; 81 if (map.has(z)) c++; 82 } 83 assertEq(c, N); 84 } 85 runTest(testNaN_same_map); 86 87 function testUndefinedAndNull_same_map(n) { 88 var xs = [undefined, null]; 89 var ys = [1, -1]; 90 var zs = [...xs, ...ys]; 91 var map = createMap(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 (map.has(z)) c++; 98 if (map.has(z)) c++; 99 } 100 assertEq(c, N); 101 } 102 runTest(testUndefinedAndNull_same_map); 103 104 function testBoolean_same_map(n) { 105 var xs = [true, false]; 106 var ys = [1, -1]; 107 var zs = [...xs, ...ys]; 108 var map = createMap(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 (map.has(z)) c++; 115 if (map.has(z)) c++; 116 } 117 assertEq(c, N); 118 } 119 runTest(testBoolean_same_map); 120 121 // Duplicate the above tests, but this time use a different map. 122 123 function testInt32_different_map(n) { 124 var xs = [1, 2]; 125 var ys = [3, 4]; 126 var zs = [...xs, ...ys]; 127 var map1 = createMap(xs, n); 128 var map2 = createMap(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 (map1.has(z)) c++; 135 if (map2.has(z)) c++; 136 } 137 assertEq(c, N); 138 } 139 runTest(testInt32_different_map); 140 141 function testDouble_different_map(n) { 142 var xs = [Math.PI, Infinity]; 143 var ys = [Math.E, -Infinity]; 144 var zs = [...xs, ...ys]; 145 var map1 = createMap(xs, n); 146 var map2 = createMap(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 (map1.has(z)) c++; 153 if (map2.has(z)) c++; 154 } 155 assertEq(c, N); 156 } 157 runTest(testDouble_different_map); 158 159 function testZero_different_map(n) { 160 var xs = [0, -0]; 161 var ys = [1, -1]; 162 var zs = [...xs, ...ys]; 163 var map1 = createMap([0], n); 164 var map2 = createMap([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 (map1.has(z)) c++; 171 if (map2.has(z)) c++; 172 } 173 assertEq(c, N); 174 } 175 runTest(testZero_different_map); 176 177 function testNaN_different_map(n) { 178 var xs = [NaN, -NaN]; 179 var ys = [1, -1]; 180 var zs = [...xs, ...ys]; 181 var map1 = createMap([NaN], n); 182 var map2 = createMap([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 (map1.has(z)) c++; 189 if (map2.has(z)) c++; 190 } 191 assertEq(c, N); 192 } 193 runTest(testNaN_different_map); 194 195 function testUndefinedAndNull_different_map(n) { 196 var xs = [undefined, null]; 197 var ys = [1, -1]; 198 var zs = [...xs, ...ys]; 199 var map1 = createMap(xs, n); 200 var map2 = createMap(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 (map1.has(z)) c++; 207 if (map2.has(z)) c++; 208 } 209 assertEq(c, N); 210 } 211 runTest(testUndefinedAndNull_different_map); 212 213 function testBoolean_different_map(n) { 214 var xs = [true, false]; 215 var ys = [1, -1]; 216 var zs = [...xs, ...ys]; 217 var map1 = createMap(xs, n); 218 var map2 = createMap(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 (map1.has(z)) c++; 225 if (map2.has(z)) c++; 226 } 227 assertEq(c, N); 228 } 229 runTest(testBoolean_different_map); 230 231 // Test the alias information is correct. 232 233 function testInt32_alias(n) { 234 var xs = [1, 2]; 235 var map = createMap([], 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 map.set(x, x); 243 if (map.has(x)) c++; 244 245 map.delete(x); 246 if (map.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 map = createMap([], 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 map.set(x, x); 262 if (map.has(x)) c++; 263 264 map.delete(x); 265 if (map.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 map = createMap([], 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 map.set(x, x); 281 if (map.has(x)) c++; 282 283 map.delete(x); 284 if (map.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 map = createMap([], 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 map.set(x, x); 300 if (map.has(x)) c++; 301 302 map.delete(x); 303 if (map.has(x)) c++; 304 } 305 assertEq(c, N); 306 } 307 runTest(testBoolean_alias);