OLD | NEW |
1 // Copyright 2012 Google Inc. All Rights Reserved. | 1 // Copyright 2012 Google Inc. All Rights Reserved. |
2 | 2 |
3 #include "vm/bigint_operations.h" | 3 #include "vm/bigint_operations.h" |
4 | 4 |
5 #include "platform/assert.h" | 5 #include "platform/assert.h" |
6 #include "platform/utils.h" | 6 #include "platform/utils.h" |
7 | 7 |
8 #include "vm/double_internals.h" | 8 #include "vm/double_internals.h" |
9 #include "vm/exceptions.h" | 9 #include "vm/exceptions.h" |
10 #include "vm/object_store.h" | 10 #include "vm/object_store.h" |
(...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
351 const intptr_t kMaxAllowedDigitLength = | 351 const intptr_t kMaxAllowedDigitLength = |
352 (kIntptrMax - 10) / kLog2Dividend / kDigitBitSize * kLog2Divisor; | 352 (kIntptrMax - 10) / kLog2Dividend / kDigitBitSize * kLog2Divisor; |
353 | 353 |
354 const intptr_t length = bigint.Length(); | 354 const intptr_t length = bigint.Length(); |
355 Isolate* isolate = Isolate::Current(); | 355 Isolate* isolate = Isolate::Current(); |
356 if (length >= kMaxAllowedDigitLength) { | 356 if (length >= kMaxAllowedDigitLength) { |
357 // Use the preallocated out of memory exception to avoid calling | 357 // Use the preallocated out of memory exception to avoid calling |
358 // into dart code or allocating any code. | 358 // into dart code or allocating any code. |
359 const Instance& exception = | 359 const Instance& exception = |
360 Instance::Handle(isolate->object_store()->out_of_memory()); | 360 Instance::Handle(isolate->object_store()->out_of_memory()); |
361 Exceptions::Throw(exception); | 361 Exceptions::Throw(isolate, exception); |
362 UNREACHABLE(); | 362 UNREACHABLE(); |
363 } | 363 } |
364 | 364 |
365 // Approximate the size of the resulting string. We prefer overestimating | 365 // Approximate the size of the resulting string. We prefer overestimating |
366 // to not allocating enough. | 366 // to not allocating enough. |
367 int64_t bit_length = length * kDigitBitSize; | 367 int64_t bit_length = length * kDigitBitSize; |
368 ASSERT(bit_length > length || length == 0); | 368 ASSERT(bit_length > length || length == 0); |
369 int64_t decimal_length = (bit_length * kLog2Dividend / kLog2Divisor) + 1; | 369 int64_t decimal_length = (bit_length * kLog2Dividend / kLog2Divisor) + 1; |
370 // Add one byte for the trailing \0 character. | 370 // Add one byte for the trailing \0 character. |
371 int64_t required_size = decimal_length + 1; | 371 int64_t required_size = decimal_length + 1; |
(...skipping 1486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1858 intptr_t BigintOperations::CountBits(Chunk digit) { | 1858 intptr_t BigintOperations::CountBits(Chunk digit) { |
1859 intptr_t result = 0; | 1859 intptr_t result = 0; |
1860 while (digit != 0) { | 1860 while (digit != 0) { |
1861 digit >>= 1; | 1861 digit >>= 1; |
1862 result++; | 1862 result++; |
1863 } | 1863 } |
1864 return result; | 1864 return result; |
1865 } | 1865 } |
1866 | 1866 |
1867 } // namespace dart | 1867 } // namespace dart |
OLD | NEW |