| Index: runtime/vm/object.cc
|
| ===================================================================
|
| --- runtime/vm/object.cc (revision 41816)
|
| +++ runtime/vm/object.cc (working copy)
|
| @@ -16408,7 +16408,7 @@
|
|
|
|
|
| RawBigint* Bigint::NewFromShiftedInt64(int64_t value, intptr_t shift,
|
| - Heap::Space space) {
|
| + Heap::Space space) {
|
| ASSERT(kBitsPerDigit == 32);
|
| ASSERT(shift >= 0);
|
| const Bigint& result = Bigint::Handle(New(space));
|
| @@ -16439,17 +16439,17 @@
|
|
|
|
|
| void Bigint::EnsureLength(intptr_t length, Heap::Space space) const {
|
| - ASSERT(length >= 0);
|
| + ASSERT(length > 0);
|
| TypedData& old_digits = TypedData::Handle(digits());
|
| - if ((length > 0) && (length > old_digits.Length())) {
|
| + if (length > old_digits.Length()) {
|
| TypedData& new_digits = TypedData::Handle(
|
| TypedData::New(kTypedDataUint32ArrayCid, length + kExtraDigits, space));
|
| - if (old_digits.Length() > 0) {
|
| + set_digits(new_digits);
|
| + if (Used() > 0) {
|
| TypedData::Copy(new_digits, TypedData::data_offset(),
|
| old_digits, TypedData::data_offset(),
|
| - old_digits.LengthInBytes());
|
| + (Used() + 1)*kBytesPerDigit); // Copy leading zero.
|
| }
|
| - set_digits(new_digits);
|
| }
|
| }
|
|
|
| @@ -16456,10 +16456,15 @@
|
|
|
| void Bigint::Clamp() const {
|
| intptr_t used = Used();
|
| - while ((used > 0) && (DigitAt(used - 1) == 0)) {
|
| - --used;
|
| + if (used > 0) {
|
| + if (DigitAt(used - 1) == 0) {
|
| + do {
|
| + --used;
|
| + } while ((used > 0) && (DigitAt(used - 1) == 0));
|
| + SetUsed(used);
|
| + }
|
| + SetDigitAt(used, 0); // Set leading zero for 64-bit processing.
|
| }
|
| - SetUsed(used);
|
| }
|
|
|
|
|
|
|