| Index: runtime/vm/object.cc
|
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
|
| index 339ade7e8fcf9abe5bb53adced2f57cc992e621f..aa2f340ee9b21715ad748a72dab7a7db0ed740cd 100644
|
| --- a/runtime/vm/object.cc
|
| +++ b/runtime/vm/object.cc
|
| @@ -8117,6 +8117,10 @@ RawLiteralToken* LiteralToken::New(Token::Kind kind, const String& literal) {
|
| result.set_literal(literal);
|
| if (kind == Token::kINTEGER) {
|
| const Integer& value = Integer::Handle(Integer::NewCanonical(literal));
|
| + if (value.IsNull()) {
|
| + // Integer is out of range.
|
| + return LiteralToken::null();
|
| + }
|
| ASSERT(value.IsSmi() || value.IsOld());
|
| result.set_value(value);
|
| } else if (kind == Token::kDOUBLE) {
|
| @@ -8498,6 +8502,18 @@ class CompressedTokenStreamData : public Scanner::TokenCollector {
|
| fresh_index_smi_ = Smi::New(fresh_index);
|
| const LiteralToken& lit = LiteralToken::Handle(
|
| LiteralToken::New(descriptor.kind, *descriptor.literal));
|
| + if (lit.IsNull()) {
|
| + // Convert token to an error.
|
| + ASSERT(descriptor.kind == Token::kINTEGER);
|
| + ASSERT(FLAG_limit_ints_to_64_bits);
|
| + Scanner::TokenDescriptor errorDesc = descriptor;
|
| + errorDesc.kind = Token::kERROR;
|
| + errorDesc.literal = &String::Handle(Symbols::NewFormatted(
|
| + Thread::Current(), "integer literal %s is out of range",
|
| + descriptor.literal->ToCString()));
|
| + AddLiteralToken(errorDesc);
|
| + return;
|
| + }
|
| index = Smi::Value(
|
| Smi::RawCast(tokens_->InsertOrGetValue(lit, fresh_index_smi_)));
|
| token_objects_.Add(lit);
|
| @@ -17827,15 +17843,15 @@ RawInteger* Integer::New(const String& str, Heap::Space space) {
|
| ASSERT(str.IsOneByteString());
|
| int64_t value;
|
| if (!OS::StringToInt64(str.ToCString(), &value)) {
|
| + if (FLAG_limit_ints_to_64_bits) {
|
| + // Out of range.
|
| + return Integer::null();
|
| + }
|
| const Bigint& big =
|
| Bigint::Handle(Bigint::NewFromCString(str.ToCString(), space));
|
| ASSERT(!big.FitsIntoSmi());
|
| ASSERT(!big.FitsIntoInt64());
|
| - if (!FLAG_limit_ints_to_64_bits) {
|
| - return big.raw();
|
| - }
|
| - // TODO(alexmarkov): Throw error in FLAG_limit_ints_to_64_bits mode.
|
| - value = big.AsTruncatedInt64Value();
|
| + return big.raw();
|
| }
|
| return Integer::New(value, space);
|
| }
|
| @@ -17845,14 +17861,14 @@ RawInteger* Integer::NewCanonical(const String& str) {
|
| ASSERT(str.IsOneByteString());
|
| int64_t value;
|
| if (!OS::StringToInt64(str.ToCString(), &value)) {
|
| + if (FLAG_limit_ints_to_64_bits) {
|
| + // Out of range.
|
| + return Integer::null();
|
| + }
|
| const Bigint& big = Bigint::Handle(Bigint::NewCanonical(str));
|
| ASSERT(!big.FitsIntoSmi());
|
| ASSERT(!big.FitsIntoInt64());
|
| - if (!FLAG_limit_ints_to_64_bits) {
|
| - return big.raw();
|
| - }
|
| - // TODO(alexmarkov): Throw error in FLAG_limit_ints_to_64_bits mode.
|
| - value = big.AsTruncatedInt64Value();
|
| + return big.raw();
|
| }
|
| if (Smi::IsValid(value)) {
|
| return Smi::New(static_cast<intptr_t>(value));
|
| @@ -17871,8 +17887,8 @@ RawInteger* Integer::New(int64_t value, Heap::Space space) {
|
| RawInteger* Integer::NewFromUint64(uint64_t value, Heap::Space space) {
|
| if (value > static_cast<uint64_t>(Mint::kMaxValue)) {
|
| if (FLAG_limit_ints_to_64_bits) {
|
| - // TODO(alexmarkov): Throw error in FLAG_limit_ints_to_64_bits mode.
|
| - return Integer::New(static_cast<int64_t>(value), space);
|
| + // Out of range.
|
| + return Integer::null();
|
| } else {
|
| return Bigint::NewFromUint64(value, space);
|
| }
|
| @@ -18073,7 +18089,7 @@ RawInteger* Integer::ArithmeticOp(Token::Kind operation,
|
| UNIMPLEMENTED();
|
| }
|
| }
|
| - ASSERT(!FLAG_limit_ints_to_64_bits);
|
| + ASSERT(!Bigint::IsDisabled());
|
| return Integer::null(); // Notify caller that a bigint operation is required.
|
| }
|
|
|
| @@ -18117,7 +18133,7 @@ RawInteger* Integer::BitOp(Token::Kind kind,
|
| UNIMPLEMENTED();
|
| }
|
| }
|
| - ASSERT(!FLAG_limit_ints_to_64_bits);
|
| + ASSERT(!Bigint::IsDisabled());
|
| return Integer::null(); // Notify caller that a bigint operation is required.
|
| }
|
|
|
| @@ -18530,7 +18546,7 @@ bool Bigint::CheckAndCanonicalizeFields(Thread* thread,
|
| }
|
|
|
| RawBigint* Bigint::New(Heap::Space space) {
|
| - // TODO(alexmarkov): Throw error or assert in --limit-ints-to-64-bits mode.
|
| + ASSERT(!Bigint::IsDisabled());
|
| Thread* thread = Thread::Current();
|
| Zone* zone = thread->zone();
|
| Isolate* isolate = thread->isolate();
|
| @@ -18553,7 +18569,7 @@ RawBigint* Bigint::New(bool neg,
|
| intptr_t used,
|
| const TypedData& digits,
|
| Heap::Space space) {
|
| - // TODO(alexmarkov): Throw error or assert in --limit-ints-to-64-bits mode.
|
| + ASSERT(!Bigint::IsDisabled());
|
| ASSERT((used == 0) ||
|
| (!digits.IsNull() && (digits.Length() >= (used + (used & 1)))));
|
| Thread* thread = Thread::Current();
|
| @@ -18590,9 +18606,7 @@ RawBigint* Bigint::New(bool neg,
|
| }
|
|
|
| RawBigint* Bigint::NewFromInt64(int64_t value, Heap::Space space) {
|
| - // Currently only used to convert Smi or Mint to hex String, therefore do
|
| - // not throw RangeError if --limit-ints-to-64-bits.
|
| - // TODO(alexmarkov): Throw error or assert in --limit-ints-to-64-bits mode.
|
| + ASSERT(!Bigint::IsDisabled());
|
| const TypedData& digits = TypedData::Handle(NewDigits(2, space));
|
| bool neg;
|
| uint64_t abs_value;
|
| @@ -18609,9 +18623,7 @@ RawBigint* Bigint::NewFromInt64(int64_t value, Heap::Space space) {
|
| }
|
|
|
| RawBigint* Bigint::NewFromUint64(uint64_t value, Heap::Space space) {
|
| - // TODO(alexmarkov): Revise this assertion if this factory method is used
|
| - // to explicitly allocate Bigint objects in --limit-ints-to-64-bits mode.
|
| - ASSERT(!FLAG_limit_ints_to_64_bits);
|
| + ASSERT(!Bigint::IsDisabled());
|
| const TypedData& digits = TypedData::Handle(NewDigits(2, space));
|
| SetDigitAt(digits, 0, static_cast<uint32_t>(value));
|
| SetDigitAt(digits, 1, static_cast<uint32_t>(value >> 32));
|
| @@ -18621,9 +18633,7 @@ RawBigint* Bigint::NewFromUint64(uint64_t value, Heap::Space space) {
|
| RawBigint* Bigint::NewFromShiftedInt64(int64_t value,
|
| intptr_t shift,
|
| Heap::Space space) {
|
| - // TODO(alexmarkov): Revise this assertion if this factory method is used
|
| - // to explicitly allocate Bigint objects in --limit-ints-to-64-bits mode.
|
| - ASSERT(!FLAG_limit_ints_to_64_bits);
|
| + ASSERT(!Bigint::IsDisabled());
|
| ASSERT(kBitsPerDigit == 32);
|
| ASSERT(shift >= 0);
|
| const intptr_t digit_shift = shift / kBitsPerDigit;
|
| @@ -18654,8 +18664,7 @@ RawBigint* Bigint::NewFromShiftedInt64(int64_t value,
|
| }
|
|
|
| RawBigint* Bigint::NewFromCString(const char* str, Heap::Space space) {
|
| - // Allow parser to scan Bigint literal, even with --limit-ints-to-64-bits.
|
| - // TODO(alexmarkov): Throw error or assert in --limit-ints-to-64-bits mode.
|
| + ASSERT(!Bigint::IsDisabled());
|
| ASSERT(str != NULL);
|
| bool neg = false;
|
| TypedData& digits = TypedData::Handle();
|
| @@ -18676,8 +18685,7 @@ RawBigint* Bigint::NewFromCString(const char* str, Heap::Space space) {
|
| }
|
|
|
| RawBigint* Bigint::NewCanonical(const String& str) {
|
| - // Allow parser to scan Bigint literal, even with --limit-ints-to-64-bits.
|
| - // TODO(alexmarkov): Throw error or assert in --limit-ints-to-64-bits mode.
|
| + ASSERT(!Bigint::IsDisabled());
|
| Thread* thread = Thread::Current();
|
| Zone* zone = thread->zone();
|
| Isolate* isolate = thread->isolate();
|
|
|