diff options
Diffstat (limited to 'deps/v8/test/mjsunit/compiler/bigint-constructor.js')
-rw-r--r-- | deps/v8/test/mjsunit/compiler/bigint-constructor.js | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/compiler/bigint-constructor.js b/deps/v8/test/mjsunit/compiler/bigint-constructor.js new file mode 100644 index 0000000000..7a6438c6fc --- /dev/null +++ b/deps/v8/test/mjsunit/compiler/bigint-constructor.js @@ -0,0 +1,107 @@ +// Copyright 2022 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --allow-natives-syntax --turbofan --no-always-turbofan + +(function () { + function ToBigInt(x) { + return BigInt(x); + } + + %PrepareFunctionForOptimization(ToBigInt); + assertEquals(0n, ToBigInt(0)); + %OptimizeFunctionOnNextCall(ToBigInt); + + // Test the builtin ToBigIntConvertNumber. + assertThrows(() => ToBigInt(undefined), TypeError); + + assertEquals(0n, ToBigInt(false)); + assertEquals(1n, ToBigInt(true)); + + assertEquals(42n, ToBigInt(42n)); + + assertEquals(3n, ToBigInt(3)); + assertEquals(0xdeadbeefn, ToBigInt(0xdeadbeef)); + assertEquals(-0xdeadbeefn, ToBigInt(-0xdeadbeef)); + + assertEquals(2n, ToBigInt("2")); + assertEquals(0xdeadbeefdeadbeefdn, ToBigInt("0xdeadbeefdeadbeefd")); + assertThrows(() => ToBigInt("-0x10"), SyntaxError); + + assertThrows(() => ToBigInt(Symbol("foo")), TypeError); + assertOptimized(ToBigInt); +})(); + +{ + // Test constants to BigInts. + function OptimizeAndTest(expected, fun) { + %PrepareFunctionForOptimization(fun); + assertEquals(expected, fun()); + %OptimizeFunctionOnNextCall(fun); + assertEquals(expected, fun()); + assertOptimized(fun); + } + + OptimizeAndTest(42n, () => BigInt(42n)); + + // MinusZero + OptimizeAndTest(0n, () => BigInt(-0)); + OptimizeAndTest(0n, () => BigInt.asIntN(32, BigInt(-0))); + OptimizeAndTest(0n, () => BigInt.asUintN(32, BigInt(-0))); + OptimizeAndTest(0n, () => 0n + BigInt(-0)); + + // Smi + OptimizeAndTest(42n, () => BigInt(42)); + OptimizeAndTest(42n, () => BigInt.asIntN(32, BigInt(42))); + OptimizeAndTest(42n, () => BigInt.asUintN(32, BigInt(42))); + OptimizeAndTest(42n, () => 0n + BigInt(42)); + + // Signed32 + OptimizeAndTest(-0x80000000n, () => BigInt(-0x80000000)); + OptimizeAndTest(-0x80000000n, () => BigInt.asIntN(32, BigInt(-0x80000000))); + OptimizeAndTest(0x80000000n, () => BigInt.asUintN(32, BigInt(-0x80000000))); + OptimizeAndTest(-0x80000000n, () => 0n + BigInt(-0x80000000)); + + // Unsigned32 + OptimizeAndTest(0x80000000n, () => BigInt(0x80000000)); + OptimizeAndTest(-0x80000000n, () => BigInt.asIntN(32, BigInt(0x80000000))); + OptimizeAndTest(0x80000000n, () => BigInt.asUintN(32, BigInt(0x80000000))); + OptimizeAndTest(0x80000000n, () => 0n + BigInt(0x80000000)); +} + +(function () { + function SmiToBigInt(arr) { + return BigInt(arr[0]); + } + + // Element kind: PACKED_SMI_ELEMENTS + const numbers = [0x3fffffff, 0, -0x40000000]; + %PrepareFunctionForOptimization(SmiToBigInt); + assertEquals(0x3fffffffn, SmiToBigInt(numbers)); + %OptimizeFunctionOnNextCall(SmiToBigInt); + assertEquals(0x3fffffffn, SmiToBigInt(numbers)); + assertOptimized(SmiToBigInt); + + // Change the map of {numbers}. + numbers[1] = 0x80000000; + assertEquals(0x3fffffffn, SmiToBigInt(numbers)); + assertUnoptimized(SmiToBigInt); +})(); + +(function () { + function ToBigInt() { + return BigInt(123); + } + + %PrepareFunctionForOptimization(ToBigInt); + assertEquals(123n, ToBigInt()); + %OptimizeFunctionOnNextCall(ToBigInt); + assertEquals(123n, ToBigInt()); + assertOptimized(ToBigInt); + + // Replace the global BigInt object. + BigInt = () => 42; + assertUnoptimized(ToBigInt); + assertEquals(42, ToBigInt()); +})(); |