map-get-bigint.js (1910B)
1 // Return a new map, possibly filling some dummy entries to enforce creating 2 // multiple hash buckets. 3 function createMap(values, n) { 4 var xs = [...values]; 5 for (var i = 0; i < n; ++i) { 6 xs.push({}); 7 } 8 return new Map(xs.map((x, i) => [x, i + 1])); 9 } 10 11 function runTest(fn) { 12 fn(0); 13 fn(100); 14 } 15 16 function testInlineDigitsSameSign(n) { 17 var xs = [1n, 2n]; 18 var ys = [3n, 4n]; 19 var zs = [...xs, ...ys]; 20 var map = createMap(xs, n); 21 22 var N = 100; 23 var c = 0; 24 for (var i = 0; i < N; ++i) { 25 var z = zs[i & 3]; 26 var v = map.get(z); 27 if (v !== undefined) c += v; 28 } 29 assertEq(c, N / 2 + N / 4); 30 } 31 runTest(testInlineDigitsSameSign); 32 33 function testInlineDigitsDifferentSign(n) { 34 var xs = [-1n, 2n]; 35 var ys = [1n, -2n]; 36 var zs = [...xs, ...ys]; 37 var map = createMap(xs, n); 38 39 var N = 100; 40 var c = 0; 41 for (var i = 0; i < N; ++i) { 42 var z = zs[i & 3]; 43 var v = map.get(z); 44 if (v !== undefined) c += v; 45 } 46 assertEq(c, N / 2 + N / 4); 47 } 48 runTest(testInlineDigitsDifferentSign); 49 50 function testHeapDigitsSameSign(n) { 51 // Definitely uses heap digits. 52 var heap = 2n ** 1000n; 53 54 var xs = [heap + 1n, heap + 2n]; 55 var ys = [heap + 3n, heap + 4n]; 56 var zs = [...xs, ...ys]; 57 var map = createMap(xs, 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 var v = map.get(z); 64 if (v !== undefined) c += v; 65 } 66 assertEq(c, N / 2 + N / 4); 67 } 68 runTest(testHeapDigitsSameSign); 69 70 function testHeapDigitsDifferentSign(n) { 71 // Definitely uses heap digits. 72 var heap = 2n ** 1000n; 73 74 var xs = [-(heap + 1n), heap + 2n]; 75 var ys = [heap + 1n, -(heap + 2n)]; 76 var zs = [...xs, ...ys]; 77 var map = createMap(xs, n); 78 79 var N = 100; 80 var c = 0; 81 for (var i = 0; i < N; ++i) { 82 var z = zs[i & 3]; 83 var v = map.get(z); 84 if (v !== undefined) c += v; 85 } 86 assertEq(c, N / 2 + N / 4); 87 } 88 runTest(testHeapDigitsDifferentSign);