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