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)); |
} |