Chromium Code Reviews| Index: src/runtime.cc | 
| diff --git a/src/runtime.cc b/src/runtime.cc | 
| index d9c5bedc8ba216c5792bd9faed371f235bf174f5..d05ab96dfafbc6c5c2009a0f42b1f99465b14eca 100644 | 
| --- a/src/runtime.cc | 
| +++ b/src/runtime.cc | 
| @@ -40,6 +40,7 @@ | 
| #include "dateparser-inl.h" | 
| #include "debug.h" | 
| #include "deoptimizer.h" | 
| +#include "date.h" | 
| #include "execution.h" | 
| #include "global-handles.h" | 
| #include "isolate-inl.h" | 
| @@ -7510,51 +7511,6 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_Math_tan) { | 
| } | 
| -static int MakeDay(int year, int month) { | 
| - static const int day_from_month[] = {0, 31, 59, 90, 120, 151, | 
| - 181, 212, 243, 273, 304, 334}; | 
| - static const int day_from_month_leap[] = {0, 31, 60, 91, 121, 152, | 
| - 182, 213, 244, 274, 305, 335}; | 
| - | 
| - year += month / 12; | 
| - month %= 12; | 
| - if (month < 0) { | 
| - year--; | 
| - month += 12; | 
| - } | 
| - | 
| - ASSERT(month >= 0); | 
| - ASSERT(month < 12); | 
| - | 
| - // year_delta is an arbitrary number such that: | 
| - // a) year_delta = -1 (mod 400) | 
| - // b) year + year_delta > 0 for years in the range defined by | 
| - // ECMA 262 - 15.9.1.1, i.e. upto 100,000,000 days on either side of | 
| - // Jan 1 1970. This is required so that we don't run into integer | 
| - // division of negative numbers. | 
| - // c) there shouldn't be an overflow for 32-bit integers in the following | 
| - // operations. | 
| - static const int year_delta = 399999; | 
| - static const int base_day = 365 * (1970 + year_delta) + | 
| - (1970 + year_delta) / 4 - | 
| - (1970 + year_delta) / 100 + | 
| - (1970 + year_delta) / 400; | 
| - | 
| - int year1 = year + year_delta; | 
| - int day_from_year = 365 * year1 + | 
| - year1 / 4 - | 
| - year1 / 100 + | 
| - year1 / 400 - | 
| - base_day; | 
| - | 
| - if ((year % 4 != 0) || (year % 100 == 0 && year % 400 != 0)) { | 
| - return day_from_year + day_from_month[month]; | 
| - } | 
| - | 
| - return day_from_year + day_from_month_leap[month]; | 
| -} | 
| - | 
| - | 
| RUNTIME_FUNCTION(MaybeObject*, Runtime_DateMakeDay) { | 
| NoHandleAllocation ha; | 
| ASSERT(args.length() == 2); | 
| @@ -7562,319 +7518,39 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DateMakeDay) { | 
| CONVERT_SMI_ARG_CHECKED(year, 0); | 
| CONVERT_SMI_ARG_CHECKED(month, 1); | 
| - return Smi::FromInt(MakeDay(year, month)); | 
| -} | 
| - | 
| - | 
| -static const int kDays4Years[] = {0, 365, 2 * 365, 3 * 365 + 1}; | 
| -static const int kDaysIn4Years = 4 * 365 + 1; | 
| -static const int kDaysIn100Years = 25 * kDaysIn4Years - 1; | 
| -static const int kDaysIn400Years = 4 * kDaysIn100Years + 1; | 
| -static const int kDays1970to2000 = 30 * 365 + 7; | 
| -static const int kDaysOffset = 1000 * kDaysIn400Years + 5 * kDaysIn400Years - | 
| - kDays1970to2000; | 
| -static const int kYearsOffset = 400000; | 
| - | 
| -static const char kDayInYear[] = { | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, | 
| - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, | 
| - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31}; | 
| - | 
| -static const char kMonthInYear[] = { | 
| - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
| - 0, 0, 0, 0, 0, 0, | 
| - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
| - 1, 1, 1, | 
| - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | 
| - 2, 2, 2, 2, 2, 2, | 
| - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | 
| - 3, 3, 3, 3, 3, | 
| - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | 
| - 4, 4, 4, 4, 4, 4, | 
| - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | 
| - 5, 5, 5, 5, 5, | 
| - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | 
| - 6, 6, 6, 6, 6, 6, | 
| - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | 
| - 7, 7, 7, 7, 7, 7, | 
| - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | 
| - 8, 8, 8, 8, 8, | 
| - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, | 
| - 9, 9, 9, 9, 9, 9, | 
| - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | 
| - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | 
| - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | 
| - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | 
| - | 
| - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
| - 0, 0, 0, 0, 0, 0, | 
| - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
| - 1, 1, 1, | 
| - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | 
| - 2, 2, 2, 2, 2, 2, | 
| - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | 
| - 3, 3, 3, 3, 3, | 
| - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | 
| - 4, 4, 4, 4, 4, 4, | 
| - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | 
| - 5, 5, 5, 5, 5, | 
| - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | 
| - 6, 6, 6, 6, 6, 6, | 
| - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | 
| - 7, 7, 7, 7, 7, 7, | 
| - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | 
| - 8, 8, 8, 8, 8, | 
| - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, | 
| - 9, 9, 9, 9, 9, 9, | 
| - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | 
| - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | 
| - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | 
| - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | 
| - | 
| - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
| - 0, 0, 0, 0, 0, 0, | 
| - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
| - 1, 1, 1, 1, | 
| - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | 
| - 2, 2, 2, 2, 2, 2, | 
| - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | 
| - 3, 3, 3, 3, 3, | 
| - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | 
| - 4, 4, 4, 4, 4, 4, | 
| - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | 
| - 5, 5, 5, 5, 5, | 
| - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | 
| - 6, 6, 6, 6, 6, 6, | 
| - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | 
| - 7, 7, 7, 7, 7, 7, | 
| - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | 
| - 8, 8, 8, 8, 8, | 
| - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, | 
| - 9, 9, 9, 9, 9, 9, | 
| - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | 
| - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | 
| - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | 
| - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | 
| - | 
| - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 
| - 0, 0, 0, 0, 0, 0, | 
| - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, | 
| - 1, 1, 1, | 
| - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, | 
| - 2, 2, 2, 2, 2, 2, | 
| - 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, | 
| - 3, 3, 3, 3, 3, | 
| - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | 
| - 4, 4, 4, 4, 4, 4, | 
| - 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, | 
| - 5, 5, 5, 5, 5, | 
| - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, | 
| - 6, 6, 6, 6, 6, 6, | 
| - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, | 
| - 7, 7, 7, 7, 7, 7, | 
| - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, | 
| - 8, 8, 8, 8, 8, | 
| - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, | 
| - 9, 9, 9, 9, 9, 9, | 
| - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | 
| - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, | 
| - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, | 
| - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11}; | 
| - | 
| - | 
| -// This function works for dates from 1970 to 2099. | 
| -static inline void DateYMDFromTimeAfter1970(int date, | 
| - int& year, int& month, int& day) { | 
| -#ifdef DEBUG | 
| - int save_date = date; // Need this for ASSERT in the end. | 
| -#endif | 
| - | 
| - year = 1970 + (4 * date + 2) / kDaysIn4Years; | 
| - date %= kDaysIn4Years; | 
| - | 
| - month = kMonthInYear[date]; | 
| - day = kDayInYear[date]; | 
| - | 
| - ASSERT(MakeDay(year, month) + day - 1 == save_date); | 
| + return Smi::FromInt(isolate->date_cache()->DaysFromYearMonth(year, month)); | 
| } | 
| -static inline void DateYMDFromTimeSlow(int date, | 
| - int& year, int& month, int& day) { | 
| -#ifdef DEBUG | 
| - int save_date = date; // Need this for ASSERT in the end. | 
| -#endif | 
| - | 
| - date += kDaysOffset; | 
| - year = 400 * (date / kDaysIn400Years) - kYearsOffset; | 
| - date %= kDaysIn400Years; | 
| - | 
| - ASSERT(MakeDay(year, 0) + date == save_date); | 
| - | 
| - date--; | 
| - int yd1 = date / kDaysIn100Years; | 
| - date %= kDaysIn100Years; | 
| - year += 100 * yd1; | 
| - | 
| - date++; | 
| - int yd2 = date / kDaysIn4Years; | 
| - date %= kDaysIn4Years; | 
| - year += 4 * yd2; | 
| - | 
| - date--; | 
| - int yd3 = date / 365; | 
| - date %= 365; | 
| - year += yd3; | 
| - | 
| - bool is_leap = (!yd1 || yd2) && !yd3; | 
| - | 
| - ASSERT(date >= -1); | 
| - ASSERT(is_leap || (date >= 0)); | 
| - ASSERT((date < 365) || (is_leap && (date < 366))); | 
| - ASSERT(is_leap == ((year % 4 == 0) && (year % 100 || (year % 400 == 0)))); | 
| - ASSERT(is_leap || ((MakeDay(year, 0) + date) == save_date)); | 
| - ASSERT(!is_leap || ((MakeDay(year, 0) + date + 1) == save_date)); | 
| - | 
| - if (is_leap) { | 
| - day = kDayInYear[2*365 + 1 + date]; | 
| - month = kMonthInYear[2*365 + 1 + date]; | 
| - } else { | 
| - day = kDayInYear[date]; | 
| - month = kMonthInYear[date]; | 
| - } | 
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_DateSetValue) { | 
| + HandleScope scope(isolate); | 
| + ASSERT(args.length() == 3); | 
| - ASSERT(MakeDay(year, month) + day - 1 == save_date); | 
| -} | 
| + CONVERT_ARG_HANDLE_CHECKED(JSDate, date, 0); | 
| + CONVERT_DOUBLE_ARG_CHECKED(time, 1); | 
| + CONVERT_SMI_ARG_CHECKED(is_utc, 2); | 
| + DateCache* date_cache = isolate->date_cache(); | 
| -static inline void DateYMDFromTime(int date, | 
| - int& year, int& month, int& day) { | 
| - if (date >= 0 && date < 32 * kDaysIn4Years) { | 
| - DateYMDFromTimeAfter1970(date, year, month, day); | 
| + Object* value = NULL; | 
| + bool is_value_nan = false; | 
| + if (isnan(time)) { | 
| + value = isolate->heap()->nan_value(); | 
| + is_value_nan = true; | 
| } else { | 
| - DateYMDFromTimeSlow(date, year, month, day); | 
| + time = is_utc ? time : date_cache->ToUTC(time); | 
| + if (time < -DateCache::kMaxTimeInMs || | 
| + time > DateCache::kMaxTimeInMs) { | 
| + value = isolate->heap()->nan_value(); | 
| + is_value_nan = true; | 
| 
 
rossberg
2012/03/06 15:55:50
Indentation.
 
ulan
2012/03/07 10:55:21
Done.
 
 | 
| + } else { | 
| + MaybeObject* maybe_result = | 
| + isolate->heap()->AllocateHeapNumber(DoubleToInteger(time)); | 
| 
 
rossberg
2012/03/06 15:55:50
If is_utc is true, this allocation seems redundant
 
ulan
2012/03/07 10:55:21
Unfortunately we need to truncate the time (Double
 
 | 
| + if (!maybe_result->ToObject(&value)) return maybe_result; | 
| + } | 
| } | 
| -} | 
| - | 
| - | 
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_DateYMDFromTime) { | 
| - NoHandleAllocation ha; | 
| - ASSERT(args.length() == 2); | 
| - | 
| - CONVERT_DOUBLE_ARG_CHECKED(t, 0); | 
| - CONVERT_ARG_CHECKED(JSArray, res_array, 1); | 
| - | 
| - int year, month, day; | 
| - DateYMDFromTime(static_cast<int>(floor(t / 86400000)), year, month, day); | 
| - | 
| - FixedArrayBase* elms_base = FixedArrayBase::cast(res_array->elements()); | 
| - RUNTIME_ASSERT(elms_base->length() == 3); | 
| - RUNTIME_ASSERT(res_array->HasFastTypeElements()); | 
| - | 
| - MaybeObject* maybe = res_array->EnsureWritableFastElements(); | 
| - if (maybe->IsFailure()) return maybe; | 
| - FixedArray* elms = FixedArray::cast(res_array->elements()); | 
| - elms->set(0, Smi::FromInt(year)); | 
| - elms->set(1, Smi::FromInt(month)); | 
| - elms->set(2, Smi::FromInt(day)); | 
| - | 
| - return isolate->heap()->undefined_value(); | 
| + date->SetValue(value, is_value_nan); | 
| 
 
rossberg
2012/03/06 15:55:50
Why do you need the extra flag? Can't the function
 
ulan
2012/03/07 10:55:21
Saving one isnan computation.
 
 | 
| + return *date; | 
| } | 
| @@ -9350,25 +9026,20 @@ RUNTIME_FUNCTION(MaybeObject*, Runtime_DateLocalTimezone) { | 
| ASSERT(args.length() == 1); | 
| CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 
| - const char* zone = OS::LocalTimezone(x); | 
| + int64_t time = isolate->date_cache()->EquivalentTime(static_cast<int64_t>(x)); | 
| + const char* zone = OS::LocalTimezone(static_cast<double>(time)); | 
| 
 
rossberg
2012/03/06 15:55:50
Do these conversions (here and below) actually req
 
ulan
2012/03/07 10:55:21
Done.
 
 | 
| return isolate->heap()->AllocateStringFromUtf8(CStrVector(zone)); | 
| } | 
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_DateLocalTimeOffset) { | 
| - NoHandleAllocation ha; | 
| - ASSERT(args.length() == 0); | 
| - | 
| - return isolate->heap()->NumberFromDouble(OS::LocalTimeOffset()); | 
| -} | 
| - | 
| - | 
| -RUNTIME_FUNCTION(MaybeObject*, Runtime_DateDaylightSavingsOffset) { | 
| +RUNTIME_FUNCTION(MaybeObject*, Runtime_DateToUTC) { | 
| NoHandleAllocation ha; | 
| ASSERT(args.length() == 1); | 
| CONVERT_DOUBLE_ARG_CHECKED(x, 0); | 
| - return isolate->heap()->NumberFromDouble(OS::DaylightSavingsOffset(x)); | 
| + int64_t time_ms = isolate->date_cache()->ToUTC(static_cast<int64_t>(x)); | 
| + | 
| + return isolate->heap()->NumberFromDouble(static_cast<double>(time_ms)); | 
| } |