Revert r4146. Add a special case in Math.round for a SMI result. Also change the...
authorfschneider@chromium.org <fschneider@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 17 Mar 2010 09:58:28 +0000 (09:58 +0000)
committerfschneider@chromium.org <fschneider@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 17 Mar 2010 09:58:28 +0000 (09:58 +0000)
TBR=ager@chromium.org,
Review URL: http://codereview.chromium.org/1042006

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4156 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/runtime.cc

index 492bca79469cf16d8d5d3abc29612bc72b65e4b4..4e4856dd80ad71cb94532a74815a4b6946b7760d 100644 (file)
@@ -5325,21 +5325,12 @@ static Object* Runtime_Math_round(Arguments args) {
   NoHandleAllocation ha;
   ASSERT(args.length() == 1);
   Counters::math_round.Increment();
-  CONVERT_DOUBLE_CHECKED(x, args[0]);
-
-  if (x > 0 && x < Smi::kMaxValue) {
-    return Smi::FromInt(static_cast<int>(x + 0.5));
-  }
 
+  CONVERT_DOUBLE_CHECKED(x, args[0]);
   if (signbit(x) && x >= -0.5) return Heap::minus_zero_value();
-
-  // 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 args[0];
-  }
-
-  return Heap::NumberFromDouble(floor(x + 0.5));
+  double integer = ceil(x);
+  if (integer - x > 0.5) { integer -= 1.0; }
+  return Heap::NumberFromDouble(integer);
 }