Revision: 9134
Author:   [email protected]
Date:     Mon Sep  5 04:08:57 2011
Log:      Optimize isFinite and isNaN.

Arithmetic on infinities and NaN is much slower than doing several exact comparisons.

Review URL: http://codereview.chromium.org/7830036
http://code.google.com/p/v8/source/detail?r=9134

Modified:
 /branches/bleeding_edge/src/macros.py
 /branches/bleeding_edge/src/v8natives.js

=======================================
--- /branches/bleeding_edge/src/macros.py       Thu Sep  1 04:57:02 2011
+++ /branches/bleeding_edge/src/macros.py       Mon Sep  5 04:08:57 2011
@@ -122,7 +122,7 @@

 # Inline macros. Use %IS_VAR to make sure arg is evaluated only once.
 macro NUMBER_IS_NAN(arg) = (!%_IsSmi(%IS_VAR(arg)) && !(arg == arg));
-macro NUMBER_IS_FINITE(arg) = (%_IsSmi(%IS_VAR(arg)) || arg - arg == 0);
+macro NUMBER_IS_FINITE(arg) = (%_IsSmi(%IS_VAR(arg)) || ((arg == arg) && (arg != 1/0) && (arg != -1/0))); macro TO_INTEGER(arg) = (%_IsSmi(%IS_VAR(arg)) ? arg : %NumberToInteger(ToNumber(arg))); macro TO_INTEGER_MAP_MINUS_ZERO(arg) = (%_IsSmi(%IS_VAR(arg)) ? arg : %NumberToIntegerMapMinusZero(ToNumber(arg)));
 macro TO_INT32(arg) = (%_IsSmi(%IS_VAR(arg)) ? arg : (arg >> 0));
=======================================
--- /branches/bleeding_edge/src/v8natives.js    Mon Sep  5 00:30:35 2011
+++ /branches/bleeding_edge/src/v8natives.js    Mon Sep  5 04:08:57 2011
@@ -41,7 +41,6 @@
 const $isNaN = GlobalIsNaN;
 const $isFinite = GlobalIsFinite;

-
// ----------------------------------------------------------------------------


@@ -122,17 +121,15 @@

 // ECMA 262 - 15.1.4
 function GlobalIsNaN(number) {
-  var n = ToNumber(number);
-  return NUMBER_IS_NAN(n);
+  if (!IS_NUMBER(number)) number = NonNumberToNumber(number);
+  return NUMBER_IS_NAN(number);
 }


 // ECMA 262 - 15.1.5
 function GlobalIsFinite(number) {
   if (!IS_NUMBER(number)) number = NonNumberToNumber(number);
-
- // NaN - NaN == NaN, Infinity - Infinity == NaN, -Infinity - -Infinity == NaN.
-  return %_IsSmi(number) || number - number == 0;
+  return NUMBER_IS_FINITE(number);
 }


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to