Revision: 5013
Author: [email protected]
Date: Fri Jul  2 13:09:33 2010
Log: Fix bug in date code (issue 736) where -0 was not mapped to 0. This caused the
runtime system to throw an exception because it expected smi arguments.


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

Modified:
 /branches/bleeding_edge/src/date.js
 /branches/bleeding_edge/src/macros.py
 /branches/bleeding_edge/src/runtime.cc
 /branches/bleeding_edge/test/mjsunit/date.js

=======================================
--- /branches/bleeding_edge/src/date.js Mon May 10 02:27:37 2010
+++ /branches/bleeding_edge/src/date.js Fri Jul  2 13:09:33 2010
@@ -347,9 +347,10 @@
 function MakeDay(year, month, date) {
if (!$isFinite(year) || !$isFinite(month) || !$isFinite(date)) return $NaN;

-  year = TO_INTEGER(year);
-  month = TO_INTEGER(month);
-  date = TO_INTEGER(date);
+  // Convert to integer and map -0 to 0.
+  year = TO_INTEGER_MAP_MINUS_ZERO(year);
+  month = TO_INTEGER_MAP_MINUS_ZERO(month);
+  date = TO_INTEGER_MAP_MINUS_ZERO(date);

   if (year < kMinYear || year > kMaxYear ||
       month < kMinMonth || month > kMaxMonth ||
=======================================
--- /branches/bleeding_edge/src/macros.py       Thu May 27 00:43:43 2010
+++ /branches/bleeding_edge/src/macros.py       Fri Jul  2 13:09:33 2010
@@ -120,6 +120,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 TO_INTEGER(arg) = (%_IsSmi(%IS_VAR(arg)) ? arg : ToInteger(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));
 macro TO_UINT32(arg) = (arg >>> 0);
macro TO_STRING_INLINE(arg) = (IS_STRING(%IS_VAR(arg)) ? arg : NonStringToString(arg));
=======================================
--- /branches/bleeding_edge/src/runtime.cc      Fri Jul  2 07:36:34 2010
+++ /branches/bleeding_edge/src/runtime.cc      Fri Jul  2 13:09:33 2010
@@ -5366,9 +5366,6 @@
   }
   return Heap::NumberFromDouble(DoubleToInteger(number));
 }
-
-
-


 static Object* Runtime_NumberToIntegerMapMinusZero(Arguments args) {
=======================================
--- /branches/bleeding_edge/test/mjsunit/date.js        Tue Mar 23 08:28:58 2010
+++ /branches/bleeding_edge/test/mjsunit/date.js        Fri Jul  2 13:09:33 2010
@@ -154,6 +154,15 @@

 testToLocaleTimeString();

+// Test that -0 is treated correctly in MakeDay.
+var d = new Date();
+assertDoesNotThrow("d.setDate(-0)");
+assertDoesNotThrow("new Date(-0, -0, -0, -0, -0, -0. -0)");
+assertDoesNotThrow("new Date(0x40000000, 0x40000000, 0x40000000," +
+                   "0x40000000, 0x40000000, 0x40000000, 0x40000000)")
+assertDoesNotThrow("new Date(-0x40000001, -0x40000001, -0x40000001," +
+                   "-0x40000001, -0x40000001, -0x40000001, -0x40000001)")
+

 // Modified test from WebKit
 // LayoutTests/fast/js/script-tests/date-utc-timeclip.js:

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

Reply via email to