Reviewers: Mads Ager, Vladislav Kaznacheev, Vitaly,

Description:
Optimize three Number2Integer functions in runtime.cc: remove the check that was
already done in JavaScript, add simpler code in case we are getting a SMI
result.

Please review this at http://codereview.chromium.org/660084

SVN Base: http://v8.googlecode.com/svn/branches/bleeding_edge/

Affected files:
  M     src/runtime.cc


Index: src/runtime.cc
===================================================================
--- src/runtime.cc      (revision 3939)
+++ src/runtime.cc      (working copy)
@@ -4152,10 +4152,13 @@
   NoHandleAllocation ha;
   ASSERT(args.length() == 1);

-  Object* obj = args[0];
-  if (obj->IsSmi()) return obj;
-  CONVERT_DOUBLE_CHECKED(number, obj);
-  return Heap::NumberFromDouble(DoubleToInteger(number));
+  CONVERT_DOUBLE_CHECKED(number, args[0]);
+
+  // We do not include 0 so that we didn't have to treat +0 / -0 cases.
+  if (number > 0 && number <= Smi::kMaxValue)
+    return Smi::FromInt(static_cast<int>(number));
+  else
+    return Heap::NumberFromDouble(DoubleToInteger(number));
 }


@@ -4164,7 +4167,6 @@
   ASSERT(args.length() == 1);

   Object* obj = args[0];
-  if (obj->IsSmi() && Smi::cast(obj)->value() >= 0) return obj;
   CONVERT_NUMBER_CHECKED(int32_t, number, Uint32, obj);
   return Heap::NumberFromUint32(number);
 }
@@ -4174,10 +4176,11 @@
   NoHandleAllocation ha;
   ASSERT(args.length() == 1);

-  Object* obj = args[0];
-  if (obj->IsSmi()) return obj;
-  CONVERT_DOUBLE_CHECKED(number, obj);
-  return Heap::NumberFromInt32(DoubleToInt32(number));
+  CONVERT_DOUBLE_CHECKED(number, args[0]);
+  if (number > 0 && number <= Smi::kMaxValue)
+    return Smi::FromInt(static_cast<int>(number));
+  else
+    return Heap::NumberFromInt32(DoubleToInt32(number));
 }




--
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev

Reply via email to