Chromium Code Reviews| Index: src/runtime.cc |
| =================================================================== |
| --- src/runtime.cc (revision 4138) |
| +++ src/runtime.cc (working copy) |
| @@ -5323,12 +5323,21 @@ |
| NoHandleAllocation ha; |
| ASSERT(args.length() == 1); |
| Counters::math_round.Increment(); |
| + CONVERT_DOUBLE_CHECKED(x, args[0]); |
| - CONVERT_DOUBLE_CHECKED(x, args[0]); |
| + if (x > 0 && x < Smi::kMaxValue) { |
| + return Smi::FromInt(static_cast<int>(x + 0.5)); |
| + } |
| + |
| if (signbit(x) && x >= -0.5) return Heap::minus_zero_value(); |
| - double integer = ceil(x); |
| - if (integer - x > 0.5) { integer -= 1.0; } |
| - return Heap::NumberFromDouble(integer); |
| + |
| + // if the magnitude is big enough, there's no place for fraction part. If we |
| + // try to add 0.5 to this number, 1.0 will be added instead. |
| + if (x >= 9007199254740991.0 || x <= -9007199254740991.0) { |
| + return Heap::NumberFromDouble(x); |
|
Erik Corry
2010/03/15 20:11:34
Seems like we could just return args[0] here and a
|
| + } |
| + |
| + return Heap::NumberFromDouble(floor(x + 0.5)); |
| } |