object-is-inlined.js (1174B)
1 function SameValue(x, y) { 2 if (x === y) { 3 return (x !== 0) || (1 / x === 1 / y); 4 } 5 return (x !== x && y !== y); 6 } 7 8 function* cartesian(a, b = a) { 9 for (var pa of a) { 10 for (var pb of b) { 11 yield [pa, pb]; 12 } 13 } 14 } 15 16 var testValues = { 17 Double: `[-0.0, +0.0, 1.0, NaN]`, 18 Int32: `[-1, 0, 1, 2]`, 19 Value: `[-0.0, +0.0, "", NaN]`, 20 }; 21 22 for (var [xs, ys] of cartesian(Object.values(testValues))) { 23 var fn = Function(` 24 var xs = ${xs}; 25 var ys = ${ys}; 26 assertEq(xs.length, 4); 27 assertEq(ys.length, 4); 28 29 // Compare each entry in xs with each entry in ys and ensure Object.is 30 // computes the same result as SameValue. 31 var actual = 0, expected = 0; 32 for (var i = 0; i < 1000; ++i) { 33 // 0 1 2 3 34 var xi = i & 3; 35 36 // 0 1 2 3 1 2 3 0 2 3 0 1 3 0 1 2 37 var yi = (i + ((i >> 2) & 3)) & 3; 38 39 actual += Object.is(xs[xi], ys[yi]) ? 1 : 0; 40 expected += SameValue(xs[xi], ys[yi]) ? 1 : 0; 41 } 42 assertEq(actual, expected); 43 `); 44 for (var i = 0; i < 3; ++i) { 45 fn(); 46 } 47 }