diff --git a/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-general.js b/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-general.js new file mode 100644 index 0000000000..282d4f438e --- /dev/null +++ b/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-general.js @@ -0,0 +1,97 @@ +//@ runBigIntEnabled + +// Copyright (C) 2017 Josh Wolfe. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. + +function assert(a) { + if (!a) + throw new Error("Bad assertion"); +} + +assert.sameValue = function (input, expected, message) { + if (input !== expected) + throw new Error(message); +} + +assert.sameValue(0b00n ^ 0b00n, 0b00n, "0b00n ^ 0b00n === 0b00n"); +assert.sameValue(0b00n ^ 0b01n, 0b01n, "0b00n ^ 0b01n === 0b01n"); +assert.sameValue(0b01n ^ 0b00n, 0b01n, "0b01n ^ 0b00n === 0b01n"); +assert.sameValue(0b00n ^ 0b10n, 0b10n, "0b00n ^ 0b10n === 0b10n"); +assert.sameValue(0b10n ^ 0b00n, 0b10n, "0b10n ^ 0b00n === 0b10n"); +assert.sameValue(0b00n ^ 0b11n, 0b11n, "0b00n ^ 0b11n === 0b11n"); +assert.sameValue(0b11n ^ 0b00n, 0b11n, "0b11n ^ 0b00n === 0b11n"); +assert.sameValue(0b01n ^ 0b01n, 0b00n, "0b01n ^ 0b01n === 0b00n"); +assert.sameValue(0b01n ^ 0b10n, 0b11n, "0b01n ^ 0b10n === 0b11n"); +assert.sameValue(0b10n ^ 0b01n, 0b11n, "0b10n ^ 0b01n === 0b11n"); +assert.sameValue(0b01n ^ 0b11n, 0b10n, "0b01n ^ 0b11n === 0b10n"); +assert.sameValue(0b11n ^ 0b01n, 0b10n, "0b11n ^ 0b01n === 0b10n"); +assert.sameValue(0b10n ^ 0b10n, 0b00n, "0b10n ^ 0b10n === 0b00n"); +assert.sameValue(0b10n ^ 0b11n, 0b01n, "0b10n ^ 0b11n === 0b01n"); +assert.sameValue(0b11n ^ 0b10n, 0b01n, "0b11n ^ 0b10n === 0b01n"); +assert.sameValue(0xffffffffn ^ 0n, 0xffffffffn, "0xffffffffn ^ 0n === 0xffffffffn"); +assert.sameValue(0n ^ 0xffffffffn, 0xffffffffn, "0n ^ 0xffffffffn === 0xffffffffn"); +assert.sameValue(0xffffffffn ^ 0xffffffffn, 0n, "0xffffffffn ^ 0xffffffffn === 0n"); +assert.sameValue(0xffffffffffffffffn ^ 0n, 0xffffffffffffffffn, "0xffffffffffffffffn ^ 0n === 0xffffffffffffffffn"); +assert.sameValue(0n ^ 0xffffffffffffffffn, 0xffffffffffffffffn, "0n ^ 0xffffffffffffffffn === 0xffffffffffffffffn"); +assert.sameValue(0xffffffffffffffffn ^ 0xffffffffn, 0xffffffff00000000n, "0xffffffffffffffffn ^ 0xffffffffn === 0xffffffff00000000n"); +assert.sameValue(0xffffffffn ^ 0xffffffffffffffffn, 0xffffffff00000000n, "0xffffffffn ^ 0xffffffffffffffffn === 0xffffffff00000000n"); +assert.sameValue( + 0xffffffffffffffffn ^ 0xffffffffffffffffn, 0n, + "0xffffffffffffffffn ^ 0xffffffffffffffffn === 0n"); +assert.sameValue( + 0xbf2ed51ff75d380fd3be813ec6185780n ^ 0x4aabef2324cedff5387f1f65n, 0xbf2ed51fbdf6d72cf7705ecbfe6748e5n, + "0xbf2ed51ff75d380fd3be813ec6185780n ^ 0x4aabef2324cedff5387f1f65n === 0xbf2ed51fbdf6d72cf7705ecbfe6748e5n"); +assert.sameValue( + 0x4aabef2324cedff5387f1f65n ^ 0xbf2ed51ff75d380fd3be813ec6185780n, 0xbf2ed51fbdf6d72cf7705ecbfe6748e5n, + "0x4aabef2324cedff5387f1f65n ^ 0xbf2ed51ff75d380fd3be813ec6185780n === 0xbf2ed51fbdf6d72cf7705ecbfe6748e5n"); +assert.sameValue(0n ^ -1n, -1n, "0n ^ -1n === -1n"); +assert.sameValue(-1n ^ 0n, -1n, "-1n ^ 0n === -1n"); +assert.sameValue(0n ^ -2n, -2n, "0n ^ -2n === -2n"); +assert.sameValue(-2n ^ 0n, -2n, "-2n ^ 0n === -2n"); +assert.sameValue(1n ^ -2n, -1n, "1n ^ -2n === -1n"); +assert.sameValue(-2n ^ 1n, -1n, "-2n ^ 1n === -1n"); +assert.sameValue(2n ^ -2n, -4n, "2n ^ -2n === -4n"); +assert.sameValue(-2n ^ 2n, -4n, "-2n ^ 2n === -4n"); +assert.sameValue(2n ^ -3n, -1n, "2n ^ -3n === -1n"); +assert.sameValue(-3n ^ 2n, -1n, "-3n ^ 2n === -1n"); +assert.sameValue(-1n ^ -2n, 1n, "-1n ^ -2n === 1n"); +assert.sameValue(-2n ^ -1n, 1n, "-2n ^ -1n === 1n"); +assert.sameValue(-2n ^ -2n, 0n, "-2n ^ -2n === 0n"); +assert.sameValue(-2n ^ -3n, 3n, "-2n ^ -3n === 3n"); +assert.sameValue(-3n ^ -2n, 3n, "-3n ^ -2n === 3n"); +assert.sameValue(0xffffffffn ^ -1n, -0x100000000n, "0xffffffffn ^ -1n === -0x100000000n"); +assert.sameValue(-1n ^ 0xffffffffn, -0x100000000n, "-1n ^ 0xffffffffn === -0x100000000n"); +assert.sameValue(0xffffffffffffffffn ^ -1n, -0x10000000000000000n, "0xffffffffffffffffn ^ -1n === -0x10000000000000000n"); +assert.sameValue(-1n ^ 0xffffffffffffffffn, -0x10000000000000000n, "-1n ^ 0xffffffffffffffffn === -0x10000000000000000n"); +assert.sameValue( + 0xbf2ed51ff75d380fd3be813ec6185780n ^ -0x4aabef2324cedff5387f1f65n, -0xbf2ed51fbdf6d72cf7705ecbfe6748e5n, + "0xbf2ed51ff75d380fd3be813ec6185780n ^ -0x4aabef2324cedff5387f1f65n === -0xbf2ed51fbdf6d72cf7705ecbfe6748e5n"); +assert.sameValue( + -0x4aabef2324cedff5387f1f65n ^ 0xbf2ed51ff75d380fd3be813ec6185780n, -0xbf2ed51fbdf6d72cf7705ecbfe6748e5n, + "-0x4aabef2324cedff5387f1f65n ^ 0xbf2ed51ff75d380fd3be813ec6185780n === -0xbf2ed51fbdf6d72cf7705ecbfe6748e5n"); +assert.sameValue( + -0xbf2ed51ff75d380fd3be813ec6185780n ^ 0x4aabef2324cedff5387f1f65n, -0xbf2ed51fbdf6d72cf7705ecbfe67481bn, + "-0xbf2ed51ff75d380fd3be813ec6185780n ^ 0x4aabef2324cedff5387f1f65n === -0xbf2ed51fbdf6d72cf7705ecbfe67481bn"); +assert.sameValue( + 0x4aabef2324cedff5387f1f65n ^ -0xbf2ed51ff75d380fd3be813ec6185780n, -0xbf2ed51fbdf6d72cf7705ecbfe67481bn, + "0x4aabef2324cedff5387f1f65n ^ -0xbf2ed51ff75d380fd3be813ec6185780n === -0xbf2ed51fbdf6d72cf7705ecbfe67481bn"); +assert.sameValue( + -0xbf2ed51ff75d380fd3be813ec6185780n ^ -0x4aabef2324cedff5387f1f65n, 0xbf2ed51fbdf6d72cf7705ecbfe67481bn, + "-0xbf2ed51ff75d380fd3be813ec6185780n ^ -0x4aabef2324cedff5387f1f65n === 0xbf2ed51fbdf6d72cf7705ecbfe67481bn"); +assert.sameValue( + -0x4aabef2324cedff5387f1f65n ^ -0xbf2ed51ff75d380fd3be813ec6185780n, 0xbf2ed51fbdf6d72cf7705ecbfe67481bn, + "-0x4aabef2324cedff5387f1f65n ^ -0xbf2ed51ff75d380fd3be813ec6185780n === 0xbf2ed51fbdf6d72cf7705ecbfe67481bn"); +assert.sameValue(-0xffffffffn ^ 0n, -0xffffffffn, "-0xffffffffn ^ 0n === -0xffffffffn"); +assert.sameValue(0n ^ -0xffffffffn, -0xffffffffn, "0n ^ -0xffffffffn === -0xffffffffn"); +assert.sameValue( + -0xffffffffffffffffn ^ 0x10000000000000000n, -0x1ffffffffffffffffn, + "-0xffffffffffffffffn ^ 0x10000000000000000n === -0x1ffffffffffffffffn"); +assert.sameValue( + 0x10000000000000000n ^ -0xffffffffffffffffn, -0x1ffffffffffffffffn, + "0x10000000000000000n ^ -0xffffffffffffffffn === -0x1ffffffffffffffffn"); +assert.sameValue( + -0xffffffffffffffffffffffffn ^ 0x10000000000000000n, -0xfffffffeffffffffffffffffn, + "-0xffffffffffffffffffffffffn ^ 0x10000000000000000n === -0xfffffffeffffffffffffffffn"); +assert.sameValue( + 0x10000000000000000n ^ -0xffffffffffffffffffffffffn, -0xfffffffeffffffffffffffffn, + "0x10000000000000000n ^ -0xffffffffffffffffffffffffn === -0xfffffffeffffffffffffffffn"); diff --git a/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-to-primitive-precedence.js b/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-to-primitive-precedence.js new file mode 100644 index 0000000000..8f90dbf48e --- /dev/null +++ b/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-to-primitive-precedence.js @@ -0,0 +1,29 @@ +//@ runBigIntEnabled + +assert = { + sameValue: function (input, expected, message) { + if (input !== expected) + throw new Error(message); + } +}; + +let o = { + [Symbol.toPrimitive]: function() { + throw new Error("Bad"); + } +}; + +try{ + o ^ Symbol("2"); + assert.sameValue(true, false, "Exception expected to be throwed, but executed without error"); +} catch (e) { + assert.sameValue(e.message, "Bad", "Expected to throw Error('Bad'), but got: " + e); +} + +try{ + Symbol("2") ^ o; + assert.sameValue(true, false, "Exception expected to be throwed, but executed without error"); +} catch (e) { + assert.sameValue(e instanceof TypeError, true, "Expected to throw TypeError, but got: " + e) +} + diff --git a/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-type-error.js b/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-type-error.js new file mode 100644 index 0000000000..2fc57d2220 --- /dev/null +++ b/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-type-error.js @@ -0,0 +1,104 @@ +//@ runBigIntEnabled + +function assert(a, message) { + if (!a) + throw new Error(message); +} + +function assertThrowTypeError(a, b, message) { + try { + let n = a ^ b; + assert(false, message + ": Should throw TypeError, but executed without exception"); + } catch (e) { + assert(e instanceof TypeError, message + ": expected TypeError, got: " + e); + } +} + +assertThrowTypeError(30n, "foo", "BigInt ^ String"); +assertThrowTypeError("bar", 18757382984821n, "String ^ BigInt"); +assertThrowTypeError(30n, Symbol("foo"), "BigInt ^ Symbol"); +assertThrowTypeError(Symbol("bar"), 18757382984821n, "Symbol ^ BigInt"); +assertThrowTypeError(30n, 3320, "BigInt ^ Int32"); +assertThrowTypeError(33256, 18757382984821n, "Int32 ^ BigInt"); +assertThrowTypeError(30n, 0.543, "BigInt ^ Double"); +assertThrowTypeError(230.19293, 18757382984821n, "Double ^ BigInt"); +assertThrowTypeError(30n, NaN, "BigInt ^ NaN"); +assertThrowTypeError(NaN, 18757382984821n, "NaN ^ BigInt"); +assertThrowTypeError(30n, +Infinity, "BigInt ^ +Infinity"); +assertThrowTypeError(+Infinity, 18757382984821n, "+Infinity ^ BigInt"); +assertThrowTypeError(30n, -Infinity, "BigInt ^ -Infinity"); +assertThrowTypeError(-Infinity, 18757382984821n, "-Infinity ^ BigInt"); +assertThrowTypeError(30n, null, "BigInt ^ null"); +assertThrowTypeError(null, 18757382984821n, "null ^ BigInt"); +assertThrowTypeError(30n, undefined, "BigInt ^ undefined"); +assertThrowTypeError(undefined, 18757382984821n, "undefined ^ BigInt"); +assertThrowTypeError(30n, true, "BigInt ^ true"); +assertThrowTypeError(true, 18757382984821n, "true ^ BigInt"); +assertThrowTypeError(30n, false, "BigInt ^ false"); +assertThrowTypeError(false, 18757382984821n, "false ^ BigInt"); + +// Error when returning from object + +let o = { + valueOf: function () { return Symbol("Foo"); } +}; + +assertThrowTypeError(30n, o, "BigInt ^ Object.valueOf returning Symbol"); +assertThrowTypeError(o, 18757382984821n, "Object.valueOf returning Symbol ^ BigInt"); + +o = { + valueOf: function () { return 33256; } +}; + +assertThrowTypeError(30n, o, "BigInt ^ Object.valueOf returning Int32"); +assertThrowTypeError(o, 18757382984821n, "Object.valueOf returning Int32 ^ BigInt"); + +o = { + valueOf: function () { return 0.453; } +}; + +assertThrowTypeError(30n, o, "BigInt ^ Object.valueOf returning Double"); +assertThrowTypeError(o, 18757382984821n, "Object.valueOf returning Double ^ BigInt"); + +o = { + toString: function () { return Symbol("Foo"); } +}; + +assertThrowTypeError(30n, o, "BigInt ^ Object.toString returning Symbol"); +assertThrowTypeError(o, 18757382984821n, "Object.toString returning Symbol ^ BigInt"); + +o = { + toString: function () { return 33256; } +}; + +assertThrowTypeError(30n, o, "BigInt ^ Object.toString returning Int32"); +assertThrowTypeError(o, 18757382984821n, "Object.toString returning Int32 ^ BigInt"); + +o = { + toString: function () { return 0.453; } +}; + +assertThrowTypeError(30n, o, "BigInt ^ Object.toString returning Double"); +assertThrowTypeError(o, 18757382984821n, "Object.toString returning Double ^ BigInt"); + +o = { + [Symbol.toPrimitive]: function () { return Symbol("Foo"); } +}; + +assertThrowTypeError(30n, o, "BigInt ^ Object.@@toPrimitive returning Symbol"); +assertThrowTypeError(o, 18757382984821n, "Object.@@toPrimitive returning Symbol ^ BigInt"); + +o = { + [Symbol.toPrimitive]: function () { return 33256; } +}; + +assertThrowTypeError(30n, o, "BigInt ^ Object.@@toPrimitive returning Int32"); +assertThrowTypeError(o, 18757382984821n, "Object.@@toPrimitive returning Int32 ^ BigInt"); + +o = { + [Symbol.toPrimitive]: function () { return 0.453; } +}; + +assertThrowTypeError(30n, o, "BigInt ^ Object.@@toPrimitive returning Double"); +assertThrowTypeError(o, 18757382984821n, "Object.@@toPrimitive returning Double ^ BigInt"); + diff --git a/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-wrapped-value.js b/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-wrapped-value.js new file mode 100644 index 0000000000..97008efb08 --- /dev/null +++ b/implementation-contributed/javascriptcore/stress/big-int-bitwise-xor-wrapped-value.js @@ -0,0 +1,37 @@ +//@ runBigIntEnabled + +assert = { + sameValue: function (input, expected, message) { + if (input !== expected) + throw new Error(message); + } +}; + +function testBitXor(x, y, z, message) { + assert.sameValue(x ^ y, z, message); + assert.sameValue(y ^ x, z, message); +} + +testBitXor(Object(0b10n), 0b01n, 0b11n, "ToPrimitive: unbox object with internal slot"); + +let o = { + [Symbol.toPrimitive]: function() { + return 0b10n; + } +}; +testBitXor(o, 0b01n, 0b11n, "ToPrimitive: @@toPrimitive"); + +o = { + valueOf: function() { + return 0b10n; + } +}; +testBitXor(o, 0b01n, 0b11n, "ToPrimitive: valueOf"); + +o = { + toString: function() { + return 0b10n; + } +} +testBitXor(o, 0b01n, 0b11n, "ToPrimitive: toString"); + diff --git a/implementation-contributed/javascriptcore/stress/dont-emit-osr-exits-for-every-call-ftl.js b/implementation-contributed/javascriptcore/stress/dont-emit-osr-exits-for-every-call-ftl.js new file mode 100644 index 0000000000..46946a5780 --- /dev/null +++ b/implementation-contributed/javascriptcore/stress/dont-emit-osr-exits-for-every-call-ftl.js @@ -0,0 +1,15 @@ +//@ runDefault("--useConcurrentJIT=0", "--validateFTLOSRExitLiveness=1") + +function foo(o, p) { + p = null; + try { + o.f = null; + p = null; + } catch (e) { + } +} +noInline(foo); + +for (var i = 0; i < 1000000; ++i) { + foo({}); +} diff --git a/implementation-contributed/javascriptcore/stress/function-cache-with-parameters-end-position.js b/implementation-contributed/javascriptcore/stress/function-cache-with-parameters-end-position.js deleted file mode 100644 index b0ff2214d0..0000000000 --- a/implementation-contributed/javascriptcore/stress/function-cache-with-parameters-end-position.js +++ /dev/null @@ -1,40 +0,0 @@ -function shouldBe(actual, expected) { - if (actual !== expected) - throw new Error('bad value: ' + actual); -} - -function shouldThrow(func, errorMessage) { - var errorThrown = false; - var error = null; - try { - func(); - } catch (e) { - errorThrown = true; - error = e; - } - if (!errorThrown) - throw new Error('not thrown'); - if (String(error) !== errorMessage) - throw new Error(`bad error: ${String(error)}`); -} - -for (var i = 0; i < 10; ++i) { - var f = Function('/*) {\n*/', 'return 42'); - shouldBe(f.toString(), -`function anonymous(/*) { -*/) { -return 42 -}`); -} -shouldThrow(() => Function('/*', '*/){\nreturn 42'), `SyntaxError: Parameters should match arguments offered as parameters in Function constructor.`); - -shouldThrow(() => Function('/*', '*/){\nreturn 43'), `SyntaxError: Parameters should match arguments offered as parameters in Function constructor.`); -for (var i = 0; i < 10; ++i) { - var f = Function('/*) {\n*/', 'return 43'); - shouldBe(f.toString(), -`function anonymous(/*) { -*/) { -return 43 -}`); -} - diff --git a/implementation-contributed/javascriptcore/stress/function-constructor-name.js b/implementation-contributed/javascriptcore/stress/function-constructor-name.js deleted file mode 100644 index bf7e9459ca..0000000000 --- a/implementation-contributed/javascriptcore/stress/function-constructor-name.js +++ /dev/null @@ -1,36 +0,0 @@ -function shouldBe(actual, expected) { - if (actual !== expected) - throw new Error('bad value: ' + actual); -} - -var GeneratorFunction = function*(){}.constructor; -var AsyncFunction = async function(){}.constructor; -var AsyncGeneratorFunction = async function*(){}.constructor; - -var f = Function(`return 42`); -shouldBe(typeof anonymous, `undefined`); -shouldBe(f.toString(), -`function anonymous() { -return 42 -}`); - -var gf = GeneratorFunction(`return 42`); -shouldBe(typeof anonymous, `undefined`); -shouldBe(gf.toString(), -`function* anonymous() { -return 42 -}`); - -var af = AsyncFunction(`return 42`); -shouldBe(typeof anonymous, `undefined`); -shouldBe(af.toString(), -`async function anonymous() { -return 42 -}`); - -var agf = AsyncGeneratorFunction(`return 42`); -shouldBe(typeof anonymous, `undefined`); -shouldBe(agf.toString(), -`async function* anonymous() { -return 42 -}`); diff --git a/implementation-contributed/javascriptcore/stress/regress-190515-2.js b/implementation-contributed/javascriptcore/stress/regress-190515-2.js new file mode 100644 index 0000000000..f76053ca40 --- /dev/null +++ b/implementation-contributed/javascriptcore/stress/regress-190515-2.js @@ -0,0 +1,15 @@ +//@ requireOptions("--jitPolicyScale=0") + +// This test should not crash. + +function test(array) { + return array.push(0, 0.1); +} + +for (var i = 0; i < 100000; ++i) { + test([]) +} + +for (var i = 0; i < 100000; ++i) { + test([0]) +} diff --git a/implementation-contributed/javascriptcore/stress/regress-190515.js b/implementation-contributed/javascriptcore/stress/regress-190515.js new file mode 100644 index 0000000000..5bdc6083d8 --- /dev/null +++ b/implementation-contributed/javascriptcore/stress/regress-190515.js @@ -0,0 +1,26 @@ +function set(arr, value) { + arr[0] = value; +} + +function getImmutableArrayOrSet(get) { + let arr = [1]; + if (get) + return arr; + + set(arr, 42); + set({}, 1); +} +noInline(getImmutableArrayOrSet); + +function test() { + getImmutableArrayOrSet(true); + + for (let i = 0; i < 10000; i++) + getImmutableArrayOrSet(false); + + let arr = getImmutableArrayOrSet(true); + if (arr[0] != 1) + throw "FAILED"; +} + +test();