map-get-value.js (2386B)
1 // Similar test as "cacheir/map-get-value.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 testPolymorphic_same_map(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 map = createMap(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 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, (8 * 9) / 2 * 8 * 2); 35 } 36 runTest(testPolymorphic_same_map); 37 38 // Duplicate the above tests, but this time use a different map. 39 40 function testPolymorphic_different_map(n) { 41 var xs = [10, 10.5, "test", Symbol("?"), 123n, -123n, {}, []]; 42 var ys = [-0, NaN, "bad", Symbol("!"), 42n, -99n, {}, []]; 43 var zs = [...xs, ...ys]; 44 var map1 = createMap(xs, n); 45 var map2 = createMap(xs, n); 46 47 var N = 128; 48 var c = 0; 49 for (var i = 0; i < N; ++i) { 50 var z = zs[i & 15]; 51 var v = map1.get(z); 52 if (v !== undefined) c += v; 53 var w = map2.get(z); 54 if (w !== undefined) c += w; 55 } 56 assertEq(c, (8 * 9) / 2 * 8 * 2); 57 } 58 runTest(testPolymorphic_different_map); 59 60 // Test the alias information is correct. 61 62 function testPolymorphic_alias(n) { 63 var xs = [10, 10.5, "test", Symbol("?"), 123n, -123n, {}, []]; 64 var map = createMap([], n); 65 66 var N = 128; 67 var c = 0; 68 for (var i = 0; i < N; ++i) { 69 var x = xs[i & 1]; 70 71 map.set(x, 1); 72 var v = map.get(x); 73 74 map.delete(x); 75 var w = map.get(x); 76 77 c += v; 78 assertEq(w, undefined); 79 } 80 assertEq(c, N); 81 } 82 runTest(testPolymorphic_alias); 83 84 // And finally test that we don't actually support GVN for values, because the 85 // hash changes when moving a value which holds an object. 86 87 function testRekey() { 88 var map = new Map(); 89 var c = 0; 90 var N = 100; 91 for (var i = 0; i < N; ++i) { 92 var k = (i & 1) ? {} : null; 93 map.set(k, 1); 94 95 c += map.get(k); 96 97 minorgc(); 98 99 c += map.get(k); 100 } 101 102 assertEq(c, N * 2); 103 } 104 testRekey();