From 36d22d82aa202bb199967e9512281e9a53db42c9 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 21:33:14 +0200 Subject: Adding upstream version 115.7.0esr. Signed-off-by: Daniel Baumann --- .../tests/ion/inlining/object-is-stricteq.js | 143 +++++++++++++++++++++ 1 file changed, 143 insertions(+) create mode 100644 js/src/jit-test/tests/ion/inlining/object-is-stricteq.js (limited to 'js/src/jit-test/tests/ion/inlining/object-is-stricteq.js') diff --git a/js/src/jit-test/tests/ion/inlining/object-is-stricteq.js b/js/src/jit-test/tests/ion/inlining/object-is-stricteq.js new file mode 100644 index 0000000000..059c3f210c --- /dev/null +++ b/js/src/jit-test/tests/ion/inlining/object-is-stricteq.js @@ -0,0 +1,143 @@ +// Test when Object.is() is inlined as JSOP_STRICTEQ + +function SameValue(x, y) { + if (x === y) { + return (x !== 0) || (1 / x === 1 / y); + } + return (x !== x && y !== y); +} + +var compareTemplate = function compare(name, xs, ys) { + // Compare each entry in xs with each entry in ys and ensure Object.is + // computes the same result as SameValue. + for (var i = 0; i < 1000; ++i) { + var xi = (i % xs.length) | 0; + var yi = ((i + ((i / ys.length) | 0)) % ys.length) | 0; + + assertEq(Object.is(xs[xi], ys[yi]), SameValue(xs[xi], ys[yi]), name); + } +} + +const objects = { + plain: {}, + function: function(){}, + proxy: new Proxy({}, {}), +}; + +const sym = Symbol(); + +const testCases = [ + { + name: "Homogenous-Int32", + xs: [-1, 0, 1, 2, 0x7fffffff], + ys: [2, 1, 0, -5, -0x80000000], + }, + { + name: "Homogenous-Boolean", + xs: [true, false], + ys: [true, false], + }, + { + name: "Homogenous-Object", + xs: [{}, [], objects.plain, objects.proxy], + ys: [{}, objects.function, objects.plain, objects.proxy], + }, + { + name: "Homogenous-String", + xs: ["", "abc", "αβγαβγ", "𝐀𝐁𝐂𝐀𝐁𝐂", "ABCabc"], + ys: ["abc", "ABC", "ABCABC", "αβγαβγ", "𝐀𝐁𝐂𝐀𝐁𝐂"], + }, + { + name: "Homogenous-Symbol", + xs: [Symbol.iterator, Symbol(), Symbol.for("object-is"), sym], + ys: [sym, Symbol.match, Symbol(), Symbol.for("object-is-two")], + }, + { + name: "Homogenous-Null", + xs: [null, null], + ys: [null, null], + }, + { + name: "Homogenous-Undefined", + xs: [undefined, undefined], + ys: [undefined, undefined], + }, + + // Note: Values must not include floating-point types! + { + name: "String-Value", + xs: ["", "abc", "αβγαβγ", "𝐀𝐁𝐂𝐀𝐁𝐂"], + ys: [null, undefined, sym, true, 0, "", {}], + }, + { + name: "Null-Value", + xs: [null, null], + ys: [null, undefined, sym, true, 0, "", {}], + }, + { + name: "Undefined-Value", + xs: [undefined, undefined], + ys: [null, undefined, sym, true, 0, "", {}], + }, + { + name: "Boolean-Value", + xs: [true, false], + ys: [null, undefined, sym, true, 0, "", {}], + }, + + // Note: Values must not include floating-point types! + { + name: "Value-String", + xs: [null, undefined, sym, true, 0, "", {}], + ys: ["", "abc", "αβγαβγ", "𝐀𝐁𝐂𝐀𝐁𝐂"], + }, + { + name: "Value-Null", + xs: [null, undefined, sym, true, 0, "", {}], + ys: [null, null], + }, + { + name: "Value-Undefined", + xs: [null, undefined, sym, true, 0, "", {}], + ys: [undefined, undefined], + }, + { + name: "Value-Boolean", + xs: [null, undefined, sym, true, 0, "", {}], + ys: [undefined, undefined], + }, + + // Strict-equal comparison can be optimized to bitwise comparison when + // string types are not possible. + // Note: Values must not include floating-point types! + { + name: "Value-Value", + xs: [null, undefined, sym, true, 0, {}], + ys: [null, undefined, sym, true, 0, {}], + }, + { + name: "ValueMaybeString-ValueMaybeString", + xs: [null, undefined, sym, true, 0, "", {}], + ys: [null, undefined, sym, true, 0, "", {}], + }, + { + name: "Value-ValueMaybeString", + xs: [null, undefined, sym, true, 0, {}], + ys: [null, undefined, sym, true, 0, "", {}], + }, + { + name: "ValueMaybeString-Value", + xs: [null, undefined, sym, true, 0, "", {}], + ys: [null, undefined, sym, true, 0, {}], + }, +]; + +for (let {name, xs, ys} of testCases) { + // Create a separate function for each test case. + // Use indirect eval to avoid possible direct eval deopts. + const compare = (0, eval)(`(${compareTemplate})`); + + for (let i = 0; i < 5; ++i) { + compare(name, xs, ys); + } +} -- cgit v1.2.3