Diff
Modified: trunk/JSTests/ChangeLog (261166 => 261167)
--- trunk/JSTests/ChangeLog 2020-05-05 14:39:16 UTC (rev 261166)
+++ trunk/JSTests/ChangeLog 2020-05-05 14:40:10 UTC (rev 261167)
@@ -1,3 +1,15 @@
+2020-05-05 Yusuke Suzuki <[email protected]>
+
+ Unreviewed, reverting r261156.
+
+ Break ARM64_32 build due to existing bug
+
+ Reverted changeset:
+
+ "[JSC] Implement BigInt.asIntN and BigInt.asUintN"
+ https://bugs.webkit.org/show_bug.cgi?id=181144
+ https://trac.webkit.org/changeset/261156
+
2020-05-05 Alexey Shvayka <[email protected]>
Object.prototype.toString is not spec-perfect
Deleted: trunk/JSTests/stress/bigint-asintn.js (261166 => 261167)
--- trunk/JSTests/stress/bigint-asintn.js 2020-05-05 14:39:16 UTC (rev 261166)
+++ trunk/JSTests/stress/bigint-asintn.js 2020-05-05 14:40:10 UTC (rev 261167)
@@ -1,107 +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)}`);
-}
-
-shouldThrow(() => {
- BigInt.asIntN(-1, 0n)
-}, `RangeError: number of bits cannot be negative`);
-
-{
- let toIndex = false;
- let toBigInt = false;
- let index = {
- [Symbol.toPrimitive]() {
- shouldBe(toIndex, false);
- shouldBe(toBigInt, false);
- toIndex = true;
- return 32;
- }
- };
- let bigint = {
- [Symbol.toPrimitive]() {
- shouldBe(toIndex, true);
- shouldBe(toBigInt, false);
- toBigInt = true;
- return 10n;
- }
- }
- shouldBe(BigInt.asIntN(index, bigint), 10n);
- shouldBe(toIndex, true);
- shouldBe(toBigInt, true);
-}
-
-shouldBe(BigInt.asIntN(-0, 0n), 0n);
-
-shouldBe(BigInt.asIntN(0, 0n), 0n);
-shouldBe(BigInt.asIntN(1, 0n), 0n);
-shouldBe(BigInt.asIntN(2, 0n), 0n);
-shouldBe(BigInt.asIntN(3, 0n), 0n);
-
-shouldBe(BigInt.asIntN(0, 1n), 0n);
-shouldBe(BigInt.asIntN(1, 1n), -1n);
-shouldBe(BigInt.asIntN(2, 1n), 1n);
-shouldBe(BigInt.asIntN(3, 1n), 1n);
-
-shouldBe(BigInt.asIntN(30, 0x7fffffffn), -1n);
-shouldBe(BigInt.asIntN(31, 0x7fffffffn), -1n);
-shouldBe(BigInt.asIntN(32, 0x7fffffffn), 2147483647n);
-shouldBe(BigInt.asIntN(33, 0x7fffffffn), 2147483647n);
-shouldBe(BigInt.asIntN(34, 0x7fffffffn), 2147483647n);
-
-shouldBe(BigInt.asIntN(30, 0x80000000n), 0n);
-shouldBe(BigInt.asIntN(31, 0x80000000n), 0n);
-shouldBe(BigInt.asIntN(32, 0x80000000n), -2147483648n);
-shouldBe(BigInt.asIntN(33, 0x80000000n), 2147483648n);
-shouldBe(BigInt.asIntN(34, 0x80000000n), 2147483648n);
-
-shouldBe(BigInt.asIntN(30, -0x80000000n), 0n);
-shouldBe(BigInt.asIntN(31, -0x80000000n), 0n);
-shouldBe(BigInt.asIntN(32, -0x80000000n), -2147483648n);
-shouldBe(BigInt.asIntN(33, -0x80000000n), -2147483648n);
-shouldBe(BigInt.asIntN(34, -0x80000000n), -2147483648n);
-
-shouldBe(BigInt.asIntN(30, -0x80000001n), -1n);
-shouldBe(BigInt.asIntN(31, -0x80000001n), -1n);
-shouldBe(BigInt.asIntN(32, -0x80000001n), 2147483647n);
-shouldBe(BigInt.asIntN(33, -0x80000001n), -2147483649n);
-shouldBe(BigInt.asIntN(34, -0x80000001n), -2147483649n);
-
-shouldBe(BigInt.asIntN(62, 0x7fffffffffffffffn), -1n);
-shouldBe(BigInt.asIntN(63, 0x7fffffffffffffffn), -1n);
-shouldBe(BigInt.asIntN(64, 0x7fffffffffffffffn), 9223372036854775807n);
-shouldBe(BigInt.asIntN(65, 0x7fffffffffffffffn), 9223372036854775807n);
-shouldBe(BigInt.asIntN(66, 0x7fffffffffffffffn), 9223372036854775807n);
-
-shouldBe(BigInt.asIntN(62, 0x8000000000000000n), 0n);
-shouldBe(BigInt.asIntN(63, 0x8000000000000000n), 0n);
-shouldBe(BigInt.asIntN(64, 0x8000000000000000n), -9223372036854775808n);
-shouldBe(BigInt.asIntN(65, 0x8000000000000000n), 9223372036854775808n);
-shouldBe(BigInt.asIntN(66, 0x8000000000000000n), 9223372036854775808n);
-
-shouldBe(BigInt.asIntN(62, -0x800000000000000n), -576460752303423488n);
-shouldBe(BigInt.asIntN(63, -0x800000000000000n), -576460752303423488n);
-shouldBe(BigInt.asIntN(64, -0x800000000000000n), -576460752303423488n);
-shouldBe(BigInt.asIntN(65, -0x800000000000000n), -576460752303423488n);
-shouldBe(BigInt.asIntN(66, -0x800000000000000n), -576460752303423488n);
-
-shouldBe(BigInt.asIntN(62, -0x800000000000001n), -576460752303423489n);
-shouldBe(BigInt.asIntN(63, -0x800000000000001n), -576460752303423489n);
-shouldBe(BigInt.asIntN(64, -0x800000000000001n), -576460752303423489n);
-shouldBe(BigInt.asIntN(65, -0x800000000000001n), -576460752303423489n);
-shouldBe(BigInt.asIntN(66, -0x800000000000001n), -576460752303423489n);
Deleted: trunk/JSTests/stress/bigint-asuintn.js (261166 => 261167)
--- trunk/JSTests/stress/bigint-asuintn.js 2020-05-05 14:39:16 UTC (rev 261166)
+++ trunk/JSTests/stress/bigint-asuintn.js 2020-05-05 14:40:10 UTC (rev 261167)
@@ -1,131 +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)}`);
-}
-
-shouldThrow(() => {
- BigInt.asUintN(-1, 0n)
-}, `RangeError: number of bits cannot be negative`);
-
-{
- let toIndex = false;
- let toBigInt = false;
- let index = {
- [Symbol.toPrimitive]() {
- shouldBe(toIndex, false);
- shouldBe(toBigInt, false);
- toIndex = true;
- return 32;
- }
- };
- let bigint = {
- [Symbol.toPrimitive]() {
- shouldBe(toIndex, true);
- shouldBe(toBigInt, false);
- toBigInt = true;
- return 10n;
- }
- }
- shouldBe(BigInt.asUintN(index, bigint), 10n);
- shouldBe(toIndex, true);
- shouldBe(toBigInt, true);
-}
-
-shouldBe(BigInt.asUintN(-0, 0n), 0n);
-shouldBe(BigInt.asUintN(0, 0n), 0n);
-shouldBe(BigInt.asUintN(1, 0n), 0n);
-shouldBe(BigInt.asUintN(2, 0n), 0n);
-shouldBe(BigInt.asUintN(3, 0n), 0n);
-
-shouldBe(BigInt.asUintN(0, 1n), 0n);
-shouldBe(BigInt.asUintN(1, 1n), 1n);
-shouldBe(BigInt.asUintN(2, 1n), 1n);
-shouldBe(BigInt.asUintN(3, 1n), 1n);
-
-shouldBe(BigInt.asUintN(30, 0x7fffffffn), 1073741823n);
-shouldBe(BigInt.asUintN(31, 0x7fffffffn), 2147483647n);
-shouldBe(BigInt.asUintN(32, 0x7fffffffn), 2147483647n);
-shouldBe(BigInt.asUintN(33, 0x7fffffffn), 2147483647n);
-shouldBe(BigInt.asUintN(34, 0x7fffffffn), 2147483647n);
-
-shouldBe(BigInt.asUintN(30, 0x80000000n), 0n);
-shouldBe(BigInt.asUintN(31, 0x80000000n), 0n);
-shouldBe(BigInt.asUintN(32, 0x80000000n), 2147483648n);
-shouldBe(BigInt.asUintN(33, 0x80000000n), 2147483648n);
-shouldBe(BigInt.asUintN(34, 0x80000000n), 2147483648n);
-
-shouldBe(BigInt.asUintN(30, 0xffffffffn), 1073741823n);
-shouldBe(BigInt.asUintN(31, 0xffffffffn), 2147483647n);
-shouldBe(BigInt.asUintN(32, 0xffffffffn), 4294967295n);
-shouldBe(BigInt.asUintN(33, 0xffffffffn), 4294967295n);
-shouldBe(BigInt.asUintN(34, 0xffffffffn), 4294967295n);
-
-shouldBe(BigInt.asUintN(30, -0x80000000n), 0n);
-shouldBe(BigInt.asUintN(31, -0x80000000n), 0n);
-shouldBe(BigInt.asUintN(32, -0x80000000n), 2147483648n);
-shouldBe(BigInt.asUintN(33, -0x80000000n), 6442450944n);
-shouldBe(BigInt.asUintN(34, -0x80000000n), 15032385536n);
-
-shouldBe(BigInt.asUintN(30, -0x80000001n), 1073741823n);
-shouldBe(BigInt.asUintN(31, -0x80000001n), 2147483647n);
-shouldBe(BigInt.asUintN(32, -0x80000001n), 2147483647n);
-shouldBe(BigInt.asUintN(33, -0x80000001n), 6442450943n);
-shouldBe(BigInt.asUintN(34, -0x80000001n), 15032385535n);
-
-shouldBe(BigInt.asUintN(30, -0xffffffffn), 1n);
-shouldBe(BigInt.asUintN(31, -0xffffffffn), 1n);
-shouldBe(BigInt.asUintN(32, -0xffffffffn), 1n);
-shouldBe(BigInt.asUintN(33, -0xffffffffn), 4294967297n);
-shouldBe(BigInt.asUintN(34, -0xffffffffn), 12884901889n);
-
-shouldBe(BigInt.asUintN(62, 0x7fffffffffffffffn), 4611686018427387903n);
-shouldBe(BigInt.asUintN(63, 0x7fffffffffffffffn), 9223372036854775807n);
-shouldBe(BigInt.asUintN(64, 0x7fffffffffffffffn), 9223372036854775807n);
-shouldBe(BigInt.asUintN(65, 0x7fffffffffffffffn), 9223372036854775807n);
-shouldBe(BigInt.asUintN(66, 0x7fffffffffffffffn), 9223372036854775807n);
-
-shouldBe(BigInt.asUintN(62, 0x8000000000000000n), 0n);
-shouldBe(BigInt.asUintN(63, 0x8000000000000000n), 0n);
-shouldBe(BigInt.asUintN(64, 0x8000000000000000n), 9223372036854775808n);
-shouldBe(BigInt.asUintN(65, 0x8000000000000000n), 9223372036854775808n);
-shouldBe(BigInt.asUintN(66, 0x8000000000000000n), 9223372036854775808n);
-
-shouldBe(BigInt.asUintN(62, 0xffffffffffffffffn), 4611686018427387903n);
-shouldBe(BigInt.asUintN(63, 0xffffffffffffffffn), 9223372036854775807n);
-shouldBe(BigInt.asUintN(64, 0xffffffffffffffffn), 18446744073709551615n);
-shouldBe(BigInt.asUintN(65, 0xffffffffffffffffn), 18446744073709551615n);
-shouldBe(BigInt.asUintN(66, 0xffffffffffffffffn), 18446744073709551615n);
-
-shouldBe(BigInt.asUintN(62, -0x800000000000000n), 4035225266123964416n);
-shouldBe(BigInt.asUintN(63, -0x800000000000000n), 8646911284551352320n);
-shouldBe(BigInt.asUintN(64, -0x800000000000000n), 17870283321406128128n);
-shouldBe(BigInt.asUintN(65, -0x800000000000000n), 36317027395115679744n);
-shouldBe(BigInt.asUintN(66, -0x800000000000000n), 73210515542534782976n);
-
-shouldBe(BigInt.asUintN(62, -0x800000000000001n), 4035225266123964415n);
-shouldBe(BigInt.asUintN(63, -0x800000000000001n), 8646911284551352319n);
-shouldBe(BigInt.asUintN(64, -0x800000000000001n), 17870283321406128127n);
-shouldBe(BigInt.asUintN(65, -0x800000000000001n), 36317027395115679743n);
-shouldBe(BigInt.asUintN(66, -0x800000000000001n), 73210515542534782975n);
-
-shouldBe(BigInt.asUintN(62, -0xffffffffffffffffn), 1n);
-shouldBe(BigInt.asUintN(63, -0xffffffffffffffffn), 1n);
-shouldBe(BigInt.asUintN(64, -0xffffffffffffffffn), 1n);
-shouldBe(BigInt.asUintN(65, -0xffffffffffffffffn), 18446744073709551617n);
-shouldBe(BigInt.asUintN(66, -0xffffffffffffffffn), 55340232221128654849n);
-shouldBe(BigInt.asUintN(67, -0xffffffffffffffffn), 129127208515966861313n);
Modified: trunk/JSTests/test262/expectations.yaml (261166 => 261167)
--- trunk/JSTests/test262/expectations.yaml 2020-05-05 14:39:16 UTC (rev 261166)
+++ trunk/JSTests/test262/expectations.yaml 2020-05-05 14:40:10 UTC (rev 261167)
@@ -678,6 +678,66 @@
test/built-ins/AsyncGeneratorPrototype/return/return-suspendedYield-promise.js:
default: 'Test262:AsyncTestFailure:Test262Error: Test262Error: AsyncGeneratorResolve(generator, resultValue, true) Expected SameValue(«[object Promise]», «unwrapped-value») to be true'
strict mode: 'Test262:AsyncTestFailure:Test262Error: Test262Error: AsyncGeneratorResolve(generator, resultValue, true) Expected SameValue(«[object Promise]», «unwrapped-value») to be true'
+test/built-ins/BigInt/asIntN/arithmetic.js:
+ default: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+ strict mode: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+test/built-ins/BigInt/asIntN/bigint-tobigint-errors.js:
+ default: 'Test262Error: ToBigInt: no argument => undefined => TypeError Expected a TypeError to be thrown but no exception was thrown at all'
+ strict mode: 'Test262Error: ToBigInt: no argument => undefined => TypeError Expected a TypeError to be thrown but no exception was thrown at all'
+test/built-ins/BigInt/asIntN/bigint-tobigint-toprimitive.js:
+ default: 'Test262Error: ToPrimitive: @@toPrimitive takes precedence Expected SameValue(«undefined», «1») to be true'
+ strict mode: 'Test262Error: ToPrimitive: @@toPrimitive takes precedence Expected SameValue(«undefined», «1») to be true'
+test/built-ins/BigInt/asIntN/bigint-tobigint-wrapped-values.js:
+ default: 'Test262Error: ToPrimitive: unbox object with internal slot Expected SameValue(«undefined», «0») to be true'
+ strict mode: 'Test262Error: ToPrimitive: unbox object with internal slot Expected SameValue(«undefined», «0») to be true'
+test/built-ins/BigInt/asIntN/bigint-tobigint.js:
+ default: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+ strict mode: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+test/built-ins/BigInt/asIntN/bits-toindex-errors.js:
+ default: 'Test262Error: ToIndex: throw when integerIndex < 0 Expected a RangeError to be thrown but no exception was thrown at all'
+ strict mode: 'Test262Error: ToIndex: throw when integerIndex < 0 Expected a RangeError to be thrown but no exception was thrown at all'
+test/built-ins/BigInt/asIntN/bits-toindex-toprimitive.js:
+ default: 'Test262Error: ToPrimitive: @@toPrimitive takes precedence Expected SameValue(«undefined», «-1») to be true'
+ strict mode: 'Test262Error: ToPrimitive: @@toPrimitive takes precedence Expected SameValue(«undefined», «-1») to be true'
+test/built-ins/BigInt/asIntN/bits-toindex-wrapped-values.js:
+ default: 'Test262Error: ToPrimitive: unbox object with internal slot Expected SameValue(«undefined», «0») to be true'
+ strict mode: 'Test262Error: ToPrimitive: unbox object with internal slot Expected SameValue(«undefined», «0») to be true'
+test/built-ins/BigInt/asIntN/bits-toindex.js:
+ default: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+ strict mode: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+test/built-ins/BigInt/asIntN/order-of-steps.js:
+ default: 'Test262Error: Expected SameValue(«0», «2») to be true'
+ strict mode: 'Test262Error: Expected SameValue(«0», «2») to be true'
+test/built-ins/BigInt/asUintN/arithmetic.js:
+ default: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+ strict mode: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+test/built-ins/BigInt/asUintN/bigint-tobigint-errors.js:
+ default: 'Test262Error: ToBigInt: no argument => undefined => TypeError Expected a TypeError to be thrown but no exception was thrown at all'
+ strict mode: 'Test262Error: ToBigInt: no argument => undefined => TypeError Expected a TypeError to be thrown but no exception was thrown at all'
+test/built-ins/BigInt/asUintN/bigint-tobigint-toprimitive.js:
+ default: 'Test262Error: ToPrimitive: @@toPrimitive takes precedence Expected SameValue(«undefined», «1») to be true'
+ strict mode: 'Test262Error: ToPrimitive: @@toPrimitive takes precedence Expected SameValue(«undefined», «1») to be true'
+test/built-ins/BigInt/asUintN/bigint-tobigint-wrapped-values.js:
+ default: 'Test262Error: ToPrimitive: unbox object with internal slot Expected SameValue(«undefined», «0») to be true'
+ strict mode: 'Test262Error: ToPrimitive: unbox object with internal slot Expected SameValue(«undefined», «0») to be true'
+test/built-ins/BigInt/asUintN/bigint-tobigint.js:
+ default: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+ strict mode: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+test/built-ins/BigInt/asUintN/bits-toindex-errors.js:
+ default: 'Test262Error: ToIndex: throw when integerIndex < 0 Expected a RangeError to be thrown but no exception was thrown at all'
+ strict mode: 'Test262Error: ToIndex: throw when integerIndex < 0 Expected a RangeError to be thrown but no exception was thrown at all'
+test/built-ins/BigInt/asUintN/bits-toindex-toprimitive.js:
+ default: 'Test262Error: ToPrimitive: @@toPrimitive takes precedence Expected SameValue(«undefined», «1») to be true'
+ strict mode: 'Test262Error: ToPrimitive: @@toPrimitive takes precedence Expected SameValue(«undefined», «1») to be true'
+test/built-ins/BigInt/asUintN/bits-toindex-wrapped-values.js:
+ default: 'Test262Error: ToPrimitive: unbox object with internal slot Expected SameValue(«undefined», «0») to be true'
+ strict mode: 'Test262Error: ToPrimitive: unbox object with internal slot Expected SameValue(«undefined», «0») to be true'
+test/built-ins/BigInt/asUintN/bits-toindex.js:
+ default: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+ strict mode: 'Test262Error: Expected SameValue(«undefined», «0») to be true'
+test/built-ins/BigInt/asUintN/order-of-steps.js:
+ default: 'Test262Error: Expected SameValue(«0», «2») to be true'
+ strict mode: 'Test262Error: Expected SameValue(«0», «2») to be true'
test/built-ins/DataView/custom-proto-access-detaches-buffer.js:
default: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all'
strict mode: 'Test262Error: Expected a TypeError to be thrown but no exception was thrown at all'
Modified: trunk/Source/_javascript_Core/ChangeLog (261166 => 261167)
--- trunk/Source/_javascript_Core/ChangeLog 2020-05-05 14:39:16 UTC (rev 261166)
+++ trunk/Source/_javascript_Core/ChangeLog 2020-05-05 14:40:10 UTC (rev 261167)
@@ -1,3 +1,15 @@
+2020-05-05 Yusuke Suzuki <[email protected]>
+
+ Unreviewed, reverting r261156.
+
+ Break ARM64_32 build due to existing bug
+
+ Reverted changeset:
+
+ "[JSC] Implement BigInt.asIntN and BigInt.asUintN"
+ https://bugs.webkit.org/show_bug.cgi?id=181144
+ https://trac.webkit.org/changeset/261156
+
2020-05-05 Alexey Shvayka <[email protected]>
Object.prototype.toString is not spec-perfect
Modified: trunk/Source/_javascript_Core/runtime/BigIntConstructor.cpp (261166 => 261167)
--- trunk/Source/_javascript_Core/runtime/BigIntConstructor.cpp 2020-05-05 14:39:16 UTC (rev 261166)
+++ trunk/Source/_javascript_Core/runtime/BigIntConstructor.cpp 2020-05-05 14:40:10 UTC (rev 261167)
@@ -77,31 +77,29 @@
JSValue toBigInt(JSGlobalObject* globalObject, JSValue argument)
{
+ ASSERT(argument.isPrimitive());
VM& vm = globalObject->vm();
auto scope = DECLARE_THROW_SCOPE(vm);
-
- JSValue primitive = argument.toPrimitive(globalObject);
- RETURN_IF_EXCEPTION(scope, { });
- if (primitive.isBigInt())
- return primitive;
+ if (argument.isBigInt())
+ return argument;
- if (primitive.isBoolean()) {
+ if (argument.isBoolean()) {
#if USE(BIGINT32)
- return jsBigInt32(primitive.asBoolean());
+ return jsBigInt32(argument.asBoolean());
#else
- return JSBigInt::createFrom(vm, primitive.asBoolean());
+ return JSBigInt::createFrom(vm, argument.asBoolean());
#endif
}
- if (primitive.isString()) {
+ if (argument.isString()) {
scope.release();
- return toStringView(globalObject, primitive, [&] (StringView view) {
+ return toStringView(globalObject, argument, [&] (StringView view) {
return JSBigInt::parseInt(globalObject, view);
});
}
- ASSERT(primitive.isUndefinedOrNull() || primitive.isNumber() || primitive.isSymbol());
+ ASSERT(argument.isUndefinedOrNull() || argument.isNumber() || argument.isSymbol());
throwTypeError(globalObject, scope, "Invalid argument type in ToBigInt operation"_s);
return jsUndefined();
}
@@ -133,44 +131,18 @@
RELEASE_AND_RETURN(scope, JSValue::encode(toBigInt(globalObject, primitive)));
}
-EncodedJSValue JSC_HOST_CALL bigIntConstructorFuncAsUintN(JSGlobalObject* globalObject, CallFrame* callFrame)
+EncodedJSValue JSC_HOST_CALL bigIntConstructorFuncAsUintN(JSGlobalObject*, CallFrame*)
{
- VM& vm = globalObject->vm();
- auto scope = DECLARE_THROW_SCOPE(vm);
-
- auto numberOfBits = callFrame->argument(0).toIndex(globalObject, "number of bits");
- RETURN_IF_EXCEPTION(scope, { });
-
- JSValue bigInt = toBigInt(globalObject, callFrame->argument(1));
- RETURN_IF_EXCEPTION(scope, { });
-
-#if USE(BIGINT32)
- if (bigInt.isBigInt32())
- RELEASE_AND_RETURN(scope, JSValue::encode(JSBigInt::asUintN(globalObject, numberOfBits, bigInt.bigInt32AsInt32())));
-#endif
-
- ASSERT(bigInt.isHeapBigInt());
- RELEASE_AND_RETURN(scope, JSValue::encode(JSBigInt::asUintN(globalObject, numberOfBits, bigInt.asHeapBigInt())));
+ // FIXME: [ESNext][BigInt] Implement BigInt.asIntN and BigInt.asUintN
+ // https://bugs.webkit.org/show_bug.cgi?id=181144
+ return encodedJSUndefined();
}
-EncodedJSValue JSC_HOST_CALL bigIntConstructorFuncAsIntN(JSGlobalObject* globalObject, CallFrame* callFrame)
+EncodedJSValue JSC_HOST_CALL bigIntConstructorFuncAsIntN(JSGlobalObject*, CallFrame*)
{
- VM& vm = globalObject->vm();
- auto scope = DECLARE_THROW_SCOPE(vm);
-
- auto numberOfBits = callFrame->argument(0).toIndex(globalObject, "number of bits");
- RETURN_IF_EXCEPTION(scope, { });
-
- JSValue bigInt = toBigInt(globalObject, callFrame->argument(1));
- RETURN_IF_EXCEPTION(scope, { });
-
-#if USE(BIGINT32)
- if (bigInt.isBigInt32())
- RELEASE_AND_RETURN(scope, JSValue::encode(JSBigInt::asIntN(globalObject, numberOfBits, bigInt.bigInt32AsInt32())));
-#endif
-
- ASSERT(bigInt.isHeapBigInt());
- RELEASE_AND_RETURN(scope, JSValue::encode(JSBigInt::asIntN(globalObject, numberOfBits, bigInt.asHeapBigInt())));
+ // FIXME: [ESNext][BigInt] Implement BigInt.asIntN and BigInt.asUintN
+ // https://bugs.webkit.org/show_bug.cgi?id=181144
+ return encodedJSUndefined();
}
} // namespace JSC
Modified: trunk/Source/_javascript_Core/runtime/JSBigInt.cpp (261166 => 261167)
--- trunk/Source/_javascript_Core/runtime/JSBigInt.cpp 2020-05-05 14:39:16 UTC (rev 261166)
+++ trunk/Source/_javascript_Core/runtime/JSBigInt.cpp 2020-05-05 14:40:10 UTC (rev 261167)
@@ -55,6 +55,8 @@
#include <algorithm>
#include <wtf/MathExtras.h>
+#define STATIC_ASSERT(cond) static_assert(cond, "JSBigInt assumes " #cond)
+
namespace JSC {
const ClassInfo JSBigInt::s_info = { "BigInt", nullptr, nullptr, nullptr, CREATE_METHOD_TABLE(JSBigInt) };
@@ -393,16 +395,6 @@
return tryConvertToBigInt32(implResult.payload.asHeapBigInt());
}
-static ALWAYS_INLINE JSBigInt::ImplResult zeroImpl(VM& vm)
-{
-#if USE(BIGINT32)
- UNUSED_PARAM(vm);
- return jsBigInt32(0);
-#else
- return JSBigInt::createZero(vm);
-#endif
-}
-
// Multiplies {this} with {factor} and adds {summand} to the result.
void JSBigInt::inplaceMultiplyAdd(Digit factor, Digit summand)
{
@@ -574,8 +566,13 @@
// 2. Let quotient be the mathematical value of x divided by y.
// 3. Return a BigInt representing quotient rounded towards 0 to the next
// integral value.
- if (absoluteCompare(x, y) == ComparisonResult::LessThan)
- return zeroImpl(vm);
+ if (absoluteCompare(x, y) == ComparisonResult::LessThan) {
+#if USE(BIGINT32)
+ return jsBigInt32(0);
+#else
+ return JSBigInt::createZero(vm);
+#endif
+ }
JSBigInt* quotient = nullptr;
bool resultSign = x.sign() != y.sign();
@@ -625,8 +622,13 @@
template <typename BigIntImpl>
JSBigInt::ImplResult JSBigInt::unaryMinusImpl(VM& vm, BigIntImpl x)
{
- if (x.isZero())
- return zeroImpl(vm);
+ if (x.isZero()) {
+#if USE(BIGINT32)
+ return jsBigInt32(0);
+#else
+ return JSBigInt::createZero(vm);
+#endif
+ }
JSBigInt* result = copy(vm, x);
result->setSign(!x.sign());
@@ -658,13 +660,23 @@
JSBigInt* remainder;
if (y.length() == 1) {
Digit divisor = y.digit(0);
- if (divisor == 1)
- return zeroImpl(vm);
+ if (divisor == 1) {
+#if USE(BIGINT32)
+ return jsBigInt32(0);
+#else
+ return JSBigInt::createZero(vm);
+#endif
+ }
Digit remainderDigit;
absoluteDivWithDigitDivisor(vm, x, divisor, nullptr, remainderDigit);
- if (!remainderDigit)
- return zeroImpl(vm);
+ if (!remainderDigit) {
+#if USE(BIGINT32)
+ return jsBigInt32(0);
+#else
+ return JSBigInt::createZero(vm);
+#endif
+ }
remainder = createWithLengthUnchecked(vm, 1);
remainder->setDigit(0, remainderDigit);
@@ -1173,7 +1185,7 @@
// left operand". We mask the right operand of the shift by {shiftMask} (`digitBits - 1`), which makes `digitBits - 0` zero.
// This shifting produces a value which covers 0 < {s} <= (digitBits - 1) cases. {s} == digitBits never happen as we asserted.
// Since {sZeroMask} clears the value in the case of {s} == 0, {s} == 0 case is also covered.
- static_assert(sizeof(CPURegister) == sizeof(Digit));
+ STATIC_ASSERT(sizeof(CPURegister) == sizeof(Digit));
Digit sZeroMask = static_cast<Digit>((-static_cast<CPURegister>(s)) >> (digitBits - 1));
static constexpr unsigned shiftMask = digitBits - 1;
Digit un32 = (high << s) | ((low >> ((digitBits - s) & shiftMask)) & sZeroMask);
@@ -1413,7 +1425,7 @@
return resultSign == x.sign() ? ImplResult { x } : JSBigInt::unaryMinusImpl(vm, x);
if (comparisonResult == ComparisonResult::Equal)
- return zeroImpl(vm);
+ return JSBigInt::createZero(vm);
JSBigInt* result = JSBigInt::createWithLengthUnchecked(vm, x.length());
@@ -2719,205 +2731,4 @@
return jsNumber(bitwise_cast<double>(doubleBits));
}
-template <typename BigIntImpl>
-JSBigInt::ImplResult JSBigInt::asIntNImpl(JSGlobalObject* globalObject, uint64_t n, BigIntImpl bigInt)
-{
- VM& vm = globalObject->vm();
-
- if (bigInt.isZero())
- return bigInt;
- if (n == 0)
- return zeroImpl(vm);
-
- uint64_t neededLength = (n + digitBits - 1) / digitBits;
- uint64_t length = static_cast<uint64_t>(bigInt.length());
- // If bigInt has less than n bits, return it directly.
- if (length < neededLength)
- return bigInt;
- ASSERT(neededLength <= INT32_MAX);
- Digit topDigit = bigInt.digit(static_cast<int32_t>(neededLength) - 1);
- Digit compareDigit = static_cast<Digit>(1) << ((n - 1) % digitBits);
- if (length == neededLength && topDigit < compareDigit)
- return bigInt;
-
- // Otherwise we have to truncate (which is a no-op in the special case
- // of bigInt == -2^(n-1)), and determine the right sign. We also might have
- // to subtract from 2^n to simulate having two's complement representation.
- // In most cases, the result's sign is bigInt.sign() xor "(n-1)th bit present".
- // The only exception is when bigInt is negative, has the (n-1)th bit, and all
- // its bits below (n-1) are zero. In that case, the result is the minimum
- // n-bit integer (example: asIntN(3, -12n) => -4n).
- bool hasBit = (topDigit & compareDigit) == compareDigit;
- ASSERT(n <= INT32_MAX);
- int32_t N = static_cast<int32_t>(n);
- if (!hasBit)
- return truncateToNBits(vm, N, bigInt);
- if (!bigInt.sign())
- return truncateAndSubFromPowerOfTwo(vm, N, bigInt, true);
-
- // Negative numbers must subtract from 2^n, except for the special case
- // described above.
- if ((topDigit & (compareDigit - 1)) == 0) {
- for (int32_t i = static_cast<int32_t>(neededLength) - 2; i >= 0; i--) {
- if (bigInt.digit(i) != 0)
- return truncateAndSubFromPowerOfTwo(vm, N, bigInt, false);
- }
- // Truncation is no-op if bigInt == -2^(n-1).
- if (length == neededLength && topDigit == compareDigit)
- return bigInt;
- return truncateToNBits(vm, N, bigInt);
- }
- return truncateAndSubFromPowerOfTwo(vm, N, bigInt, false);
-}
-
-template <typename BigIntImpl>
-JSBigInt::ImplResult JSBigInt::asUintNImpl(JSGlobalObject* globalObject, uint64_t n, BigIntImpl bigInt)
-{
- VM& vm = globalObject->vm();
- auto scope = DECLARE_THROW_SCOPE(vm);
-
- if (bigInt.isZero())
- return bigInt;
- if (n == 0)
- return zeroImpl(vm);
-
- // If bigInt is negative, simulate two's complement representation.
- if (bigInt.sign()) {
- if (n > maxLengthBits) {
- throwOutOfMemoryError(globalObject, scope, "BigInt generated from this operation is too big"_s);
- return nullptr;
- }
- return truncateAndSubFromPowerOfTwo(vm, static_cast<int32_t>(n), bigInt, false);
- }
-
- // If bigInt is positive and has up to n bits, return it directly.
- if (n >= maxLengthBits)
- return bigInt;
- static_assert(maxLengthBits < INT32_MAX - digitBits);
- int32_t neededLength = static_cast<int32_t>((n + digitBits - 1) / digitBits);
- if (static_cast<int32_t>(bigInt.length()) < neededLength)
- return bigInt;
-
- int32_t bitsInTopDigit = n % digitBits;
- if (static_cast<int32_t>(bigInt.length()) == neededLength) {
- if (bitsInTopDigit == 0)
- return bigInt;
- Digit topDigit = bigInt.digit(neededLength - 1);
- if ((topDigit >> bitsInTopDigit) == 0)
- return bigInt;
- }
-
- // Otherwise, truncate.
- ASSERT(n <= INT32_MAX);
- return truncateToNBits(vm, static_cast<int32_t>(n), bigInt);
-}
-
-template <typename BigIntImpl>
-JSBigInt::ImplResult JSBigInt::truncateToNBits(VM& vm, int32_t n, BigIntImpl bigInt)
-{
- ASSERT(n != 0);
- ASSERT(bigInt.length() > n / digitBits);
-
- int32_t neededDigits = (n + (digitBits - 1)) / digitBits;
- ASSERT(neededDigits <= static_cast<int32_t>(bigInt.length()));
- JSBigInt* result = createWithLengthUnchecked(vm, neededDigits);
- ASSERT(result);
-
- // Copy all digits except the MSD.
- int32_t last = neededDigits - 1;
- for (int32_t i = 0; i < last; i++)
- result->setDigit(i, bigInt.digit(i));
-
- // The MSD might contain extra bits that we don't want.
- Digit msd = bigInt.digit(last);
- if (n % digitBits != 0) {
- int32_t drop = digitBits - (n % digitBits);
- msd = (msd << drop) >> drop;
- }
- result->setDigit(last, msd);
- result->setSign(bigInt.sign());
- return result->rightTrim(vm);
-}
-
-// Subtracts the least significant n bits of abs(bigInt) from 2^n.
-template <typename BigIntImpl>
-JSBigInt::ImplResult JSBigInt::truncateAndSubFromPowerOfTwo(VM& vm, int32_t n, BigIntImpl bigInt, bool resultSign)
-{
- ASSERT(n != 0);
- ASSERT(n <= static_cast<int32_t>(maxLengthBits));
-
- int32_t neededDigits = (n + (digitBits - 1)) / digitBits;
- ASSERT(neededDigits <= static_cast<int32_t>(maxLength)); // Follows from n <= maxLengthBits.
- JSBigInt* result = createWithLengthUnchecked(vm, neededDigits);
- ASSERT(result);
-
- // Process all digits except the MSD.
- int32_t i = 0;
- int32_t last = neededDigits - 1;
- int32_t length = bigInt.length();
- Digit borrow = 0;
- // Take digits from bigInt unless its length is exhausted.
- int32_t limit = std::min(last, length);
- for (; i < limit; i++) {
- Digit newBorrow = 0;
- Digit difference = digitSub(0, bigInt.digit(i), newBorrow);
- difference = digitSub(difference, borrow, newBorrow);
- result->setDigit(i, difference);
- borrow = newBorrow;
- }
- // Then simulate leading zeroes in {bigInt} as needed.
- for (; i < last; i++) {
- Digit newBorrow = 0;
- Digit difference = digitSub(0, borrow, newBorrow);
- result->setDigit(i, difference);
- borrow = newBorrow;
- }
-
- // The MSD might contain extra bits that we don't want.
- Digit msd = last < length ? bigInt.digit(last) : 0;
- int32_t msdBitsConsumed = n % digitBits;
- Digit resultMSD;
- if (msdBitsConsumed == 0) {
- Digit newBorrow = 0;
- resultMSD = digitSub(0, msd, newBorrow);
- resultMSD = digitSub(resultMSD, borrow, newBorrow);
- } else {
- int32_t drop = digitBits - msdBitsConsumed;
- msd = (msd << drop) >> drop;
- Digit minuendMSD = static_cast<Digit>(1) << (digitBits - drop);
- Digit newBorrow = 0;
- resultMSD = digitSub(minuendMSD, msd, newBorrow);
- resultMSD = digitSub(resultMSD, borrow, newBorrow);
- ASSERT(newBorrow == 0); // result < 2^n.
- // If all subtracted bits were zero, we have to get rid of the
- // materialized minuendMSD again.
- resultMSD &= (minuendMSD - 1);
- }
- result->setDigit(last, resultMSD);
- result->setSign(resultSign);
- return result->rightTrim(vm);
-}
-
-JSValue JSBigInt::asIntN(JSGlobalObject* globalObject, uint64_t n, JSBigInt* bigInt)
-{
- return tryConvertToBigInt32(asIntNImpl(globalObject, n, HeapBigIntImpl { bigInt }));
-}
-
-JSValue JSBigInt::asUintN(JSGlobalObject* globalObject, uint64_t n, JSBigInt* bigInt)
-{
- return tryConvertToBigInt32(asUintNImpl(globalObject, n, HeapBigIntImpl { bigInt }));
-}
-
-#if USE(BIGINT32)
-JSValue JSBigInt::asIntN(JSGlobalObject* globalObject, uint64_t n, int32_t bigInt)
-{
- return tryConvertToBigInt32(asIntNImpl(globalObject, n, Int32BigIntImpl { bigInt }));
-}
-
-JSValue JSBigInt::asUintN(JSGlobalObject* globalObject, uint64_t n, int32_t bigInt)
-{
- return tryConvertToBigInt32(asUintNImpl(globalObject, n, Int32BigIntImpl { bigInt }));
-}
-#endif
-
} // namespace JSC
Modified: trunk/Source/_javascript_Core/runtime/JSBigInt.h (261166 => 261167)
--- trunk/Source/_javascript_Core/runtime/JSBigInt.h 2020-05-05 14:39:16 UTC (rev 261166)
+++ trunk/Source/_javascript_Core/runtime/JSBigInt.h 2020-05-05 14:40:10 UTC (rev 261167)
@@ -412,14 +412,6 @@
return toNumberHeap(jsCast<JSBigInt*>(bigInt));
}
-
- static JSValue asIntN(JSGlobalObject*, uint64_t numberOfBits, JSBigInt*);
- static JSValue asUintN(JSGlobalObject*, uint64_t numberOfBits, JSBigInt*);
-#if USE(BIGINT32)
- static JSValue asIntN(JSGlobalObject*, uint64_t numberOfBits, int32_t bigIntAsInt32);
- static JSValue asUintN(JSGlobalObject*, uint64_t numberOfBits, int32_t bigIntAsInt32);
-#endif
-
Digit digit(unsigned);
void setDigit(unsigned, Digit); // Use only when initializing.
JS_EXPORT_PRIVATE JSBigInt* rightTrim(VM&);
@@ -549,15 +541,6 @@
template <typename BigIntImpl>
static Optional<Digit> toShiftAmount(BigIntImpl x);
- template <typename BigIntImpl>
- static ImplResult asIntNImpl(JSGlobalObject*, uint64_t, BigIntImpl);
- template <typename BigIntImpl>
- static ImplResult asUintNImpl(JSGlobalObject*, uint64_t, BigIntImpl);
- template <typename BigIntImpl>
- static ImplResult truncateToNBits(VM&, int32_t, BigIntImpl);
- template <typename BigIntImpl>
- static ImplResult truncateAndSubFromPowerOfTwo(VM&, int32_t, BigIntImpl, bool resultSign);
-
inline static size_t offsetOfData()
{
return OBJECT_OFFSETOF(JSBigInt, m_data);