Chromium Code Reviews| Index: runtime/vm/object.cc |
| diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
| index 339ade7e8fcf9abe5bb53adced2f57cc992e621f..e8012d5b2830d06db4596aa743857c151002b2d7 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,20 @@ 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. |
| + if (descriptor.kind == Token::kINTEGER) { |
|
zra
2017/07/14 17:36:30
Maybe ASSERT this instead of if {} else { UNREACHA
alexmarkov
2017/07/14 18:23:45
Done.
|
| + ASSERT(FLAG_limit_ints_to_64_bits); |
| + Scanner::TokenDescriptor errorDesc = descriptor; |
| + errorDesc.kind = Token::kERROR; |
| + errorDesc.literal = &String::Handle(Symbols::New( |
| + Thread::Current(), "integer literal is out of range")); |
|
zra
2017/07/14 17:36:30
Can you add the value to the error message from *d
alexmarkov
2017/07/14 18:23:45
Done.
|
| + AddLiteralToken(errorDesc); |
| + } else { |
| + UNREACHABLE(); |
| + } |
| + return; |
| + } |
| index = Smi::Value( |
| Smi::RawCast(tokens_->InsertOrGetValue(lit, fresh_index_smi_))); |
| token_objects_.Add(lit); |
| @@ -17827,15 +17845,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 +17863,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 +17889,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 +18091,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 +18135,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 +18548,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 +18571,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 +18608,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 +18625,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 +18635,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 +18666,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 +18687,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(); |