| 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/utils.h" | 5 #include "platform/utils.h" |
| 6 | 6 |
| 7 #include "vm/double_internals.h" | 7 #include "vm/double_internals.h" |
| 8 #include "vm/exceptions.h" | 8 #include "vm/exceptions.h" |
| 9 #include "vm/object_store.h" | 9 #include "vm/object_store.h" |
| 10 #include "vm/zone.h" | 10 #include "vm/zone.h" |
| (...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 | 200 |
| 201 RawBigint* BigintOperations::NewFromDouble(double d, Heap::Space space) { | 201 RawBigint* BigintOperations::NewFromDouble(double d, Heap::Space space) { |
| 202 if ((-1.0 < d) && (d < 1.0)) { | 202 if ((-1.0 < d) && (d < 1.0)) { |
| 203 // Shortcut for small numbers. Also makes the right-shift below | 203 // Shortcut for small numbers. Also makes the right-shift below |
| 204 // well specified. | 204 // well specified. |
| 205 Smi& zero = Smi::Handle(Smi::New(0)); | 205 Smi& zero = Smi::Handle(Smi::New(0)); |
| 206 return NewFromSmi(zero, space); | 206 return NewFromSmi(zero, space); |
| 207 } | 207 } |
| 208 DoubleInternals internals = DoubleInternals(d); | 208 DoubleInternals internals = DoubleInternals(d); |
| 209 if (internals.IsSpecial()) { | 209 if (internals.IsSpecial()) { |
| 210 GrowableArray<const Object*> exception_arguments; | 210 const Array& exception_arguments = Array::Handle(Array::New(1)); |
| 211 exception_arguments.Add( | 211 exception_arguments.SetAt( |
| 212 &Object::ZoneHandle(String::New("BigintOperations::NewFromDouble"))); | 212 0, Object::Handle(String::New("BigintOperations::NewFromDouble"))); |
| 213 Exceptions::ThrowByType(Exceptions::kInternalError, exception_arguments); | 213 Exceptions::ThrowByType(Exceptions::kInternalError, exception_arguments); |
| 214 } | 214 } |
| 215 uint64_t significand = internals.Significand(); | 215 uint64_t significand = internals.Significand(); |
| 216 int exponent = internals.Exponent(); | 216 int exponent = internals.Exponent(); |
| 217 int sign = internals.Sign(); | 217 int sign = internals.Sign(); |
| 218 if (exponent <= 0) { | 218 if (exponent <= 0) { |
| 219 significand >>= -exponent; | 219 significand >>= -exponent; |
| 220 exponent = 0; | 220 exponent = 0; |
| 221 } else if (exponent <= 10) { | 221 } else if (exponent <= 10) { |
| 222 // A double significand has at most 53 bits. The following shift will | 222 // A double significand has at most 53 bits. The following shift will |
| (...skipping 1439 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1662 int BigintOperations::CountBits(Chunk digit) { | 1662 int BigintOperations::CountBits(Chunk digit) { |
| 1663 int result = 0; | 1663 int result = 0; |
| 1664 while (digit != 0) { | 1664 while (digit != 0) { |
| 1665 digit >>= 1; | 1665 digit >>= 1; |
| 1666 result++; | 1666 result++; |
| 1667 } | 1667 } |
| 1668 return result; | 1668 return result; |
| 1669 } | 1669 } |
| 1670 | 1670 |
| 1671 } // namespace dart | 1671 } // namespace dart |
| OLD | NEW |