Index: src/builtins.cc |
diff --git a/src/builtins.cc b/src/builtins.cc |
index 17548e0fd8bdace0e131a6c223f87bc6343de0e1..dcb4f2307e1c1da77eeb643332f51687d974074a 100644 |
--- a/src/builtins.cc |
+++ b/src/builtins.cc |
@@ -2122,25 +2122,55 @@ double ParseDateTimeString(Handle<String> str) { |
} |
+enum ToDateStringMode { kDateOnly, kTimeOnly, kDateAndTime }; |
+ |
+ |
// ES6 section 20.3.4.41.1 ToDateString(tv) |
-void ToDateString(double time_val, Vector<char> str, DateCache* date_cache) { |
+void ToDateString(double time_val, Vector<char> str, DateCache* date_cache, |
+ ToDateStringMode mode = kDateAndTime) { |
if (std::isnan(time_val)) { |
SNPrintF(str, "Invalid Date"); |
+ return; |
+ } |
+ int64_t time_ms = static_cast<int64_t>(time_val); |
+ int64_t local_time_ms = date_cache->ToLocal(time_ms); |
+ int year, month, day, weekday, hour, min, sec, ms; |
+ date_cache->BreakDownTime(local_time_ms, &year, &month, &day, &weekday, &hour, |
+ &min, &sec, &ms); |
+ int timezone_offset = -date_cache->TimezoneOffset(time_ms); |
+ int timezone_hour = std::abs(timezone_offset) / 60; |
+ int timezone_min = std::abs(timezone_offset) % 60; |
+ const char* local_timezone = date_cache->LocalTimezone(time_ms); |
+ switch (mode) { |
+ case kDateOnly: |
+ SNPrintF(str, "%s %s %02d %4d", kShortWeekDays[weekday], |
+ kShortMonths[month], day, year); |
+ return; |
+ case kTimeOnly: |
+ SNPrintF(str, "%02d:%02d:%02d GMT%c%02d%02d (%s)", hour, min, sec, |
+ (timezone_offset < 0) ? '-' : '+', timezone_hour, timezone_min, |
+ local_timezone); |
+ return; |
+ case kDateAndTime: |
+ SNPrintF(str, "%s %s %02d %4d %02d:%02d:%02d GMT%c%02d%02d (%s)", |
+ kShortWeekDays[weekday], kShortMonths[month], day, year, hour, |
+ min, sec, (timezone_offset < 0) ? '-' : '+', timezone_hour, |
+ timezone_min, local_timezone); |
+ return; |
+ } |
+ UNREACHABLE(); |
+} |
+ |
+ |
+Object* SetLocalDateValue(Handle<JSDate> date, double time_val) { |
+ if (time_val >= -DateCache::kMaxTimeBeforeUTCInMs && |
+ time_val <= DateCache::kMaxTimeBeforeUTCInMs) { |
+ Isolate* const isolate = date->GetIsolate(); |
+ time_val = isolate->date_cache()->ToUTC(static_cast<int64_t>(time_val)); |
} else { |
- int64_t time_ms = static_cast<int64_t>(time_val); |
- int64_t local_time_ms = date_cache->ToLocal(time_ms); |
- int year, month, day, weekday, hour, min, sec, ms; |
- date_cache->BreakDownTime(local_time_ms, &year, &month, &day, &weekday, |
- &hour, &min, &sec, &ms); |
- int timezone_offset = -date_cache->TimezoneOffset(time_ms); |
- int timezone_hour = std::abs(timezone_offset) / 60; |
- int timezone_min = std::abs(timezone_offset) % 60; |
- const char* local_timezone = date_cache->LocalTimezone(time_ms); |
- SNPrintF(str, "%s %s %02d %4d %02d:%02d:%02d GMT%c%02d%02d (%s)", |
- kShortWeekDays[weekday], kShortMonths[month], day, year, hour, min, |
- sec, (timezone_offset < 0) ? '-' : '+', timezone_hour, |
- timezone_min, local_timezone); |
+ time_val = std::numeric_limits<double>::quiet_NaN(); |
} |
+ return *JSDate::SetValue(date, TimeClip(time_val)); |
} |
} // namespace |
@@ -2320,6 +2350,423 @@ BUILTIN(DateUTC) { |
} |
+// ES6 section 20.3.4.20 Date.prototype.setDate ( date ) |
+BUILTIN(DatePrototypeSetDate) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setDate"); |
+ Handle<Object> value = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(value)); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms); |
+ int const days = isolate->date_cache()->DaysFromTime(local_time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(local_time_ms, days); |
+ int year, month, day; |
+ isolate->date_cache()->YearMonthDayFromDays(days, &year, &month, &day); |
+ time_val = MakeDate(MakeDay(year, month, value->Number()), time_within_day); |
+ } |
+ return SetLocalDateValue(date, time_val); |
+} |
+ |
+ |
+// ES6 section 20.3.4.21 Date.prototype.setFullYear (year, month, date) |
+BUILTIN(DatePrototypeSetFullYear) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setFullYear"); |
+ int const argc = args.length() - 1; |
+ Handle<Object> year = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, year, Object::ToNumber(year)); |
+ double y = year->Number(), m = 0.0, dt = 1.0; |
+ int time_within_day = 0; |
+ if (!std::isnan(date->value()->Number())) { |
+ int64_t const time_ms = static_cast<int64_t>(date->value()->Number()); |
+ int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms); |
+ int const days = isolate->date_cache()->DaysFromTime(local_time_ms); |
+ time_within_day = isolate->date_cache()->TimeInDay(local_time_ms, days); |
+ int year, month, day; |
+ isolate->date_cache()->YearMonthDayFromDays(days, &year, &month, &day); |
+ m = month; |
+ dt = day; |
+ } |
+ if (argc >= 2) { |
+ Handle<Object> month = args.at<Object>(2); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, month, Object::ToNumber(month)); |
+ m = month->Number(); |
+ if (argc >= 3) { |
+ Handle<Object> date = args.at<Object>(3); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, date, Object::ToNumber(date)); |
+ dt = date->Number(); |
+ } |
+ } |
+ double time_val = MakeDate(MakeDay(y, m, dt), time_within_day); |
+ return SetLocalDateValue(date, time_val); |
+} |
+ |
+ |
+// ES6 section 20.3.4.22 Date.prototype.setHours(hour, min, sec, ms) |
+BUILTIN(DatePrototypeSetHours) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setHours"); |
+ int const argc = args.length() - 1; |
+ Handle<Object> hour = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, hour, Object::ToNumber(hour)); |
+ double h = hour->Number(); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms); |
+ int day = isolate->date_cache()->DaysFromTime(local_time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(local_time_ms, day); |
+ double m = (time_within_day / (60 * 1000)) % 60; |
+ double s = (time_within_day / 1000) % 60; |
+ double milli = time_within_day % 1000; |
+ if (argc >= 2) { |
+ Handle<Object> min = args.at<Object>(2); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, min, Object::ToNumber(min)); |
+ m = min->Number(); |
+ if (argc >= 3) { |
+ Handle<Object> sec = args.at<Object>(3); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, sec, Object::ToNumber(sec)); |
+ s = sec->Number(); |
+ if (argc >= 4) { |
+ Handle<Object> ms = args.at<Object>(4); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, ms, Object::ToNumber(ms)); |
+ milli = ms->Number(); |
+ } |
+ } |
+ } |
+ time_val = MakeDate(day, MakeTime(h, m, s, milli)); |
+ } |
+ return SetLocalDateValue(date, time_val); |
+} |
+ |
+ |
+// ES6 section 20.3.4.23 Date.prototype.setMilliseconds(ms) |
+BUILTIN(DatePrototypeSetMilliseconds) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setMilliseconds"); |
+ Handle<Object> ms = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, ms, Object::ToNumber(ms)); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms); |
+ int day = isolate->date_cache()->DaysFromTime(local_time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(local_time_ms, day); |
+ int h = time_within_day / (60 * 60 * 1000); |
+ int m = (time_within_day / (60 * 1000)) % 60; |
+ int s = (time_within_day / 1000) % 60; |
+ time_val = MakeDate(day, MakeTime(h, m, s, ms->Number())); |
+ } |
+ return SetLocalDateValue(date, time_val); |
+} |
+ |
+ |
+// ES6 section 20.3.4.24 Date.prototype.setMinutes ( min, sec, ms ) |
+BUILTIN(DatePrototypeSetMinutes) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setMinutes"); |
+ int const argc = args.length() - 1; |
+ Handle<Object> min = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, min, Object::ToNumber(min)); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms); |
+ int day = isolate->date_cache()->DaysFromTime(local_time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(local_time_ms, day); |
+ int h = time_within_day / (60 * 60 * 1000); |
+ double m = min->Number(); |
+ double s = (time_within_day / 1000) % 60; |
+ double milli = time_within_day % 1000; |
+ if (argc >= 2) { |
+ Handle<Object> sec = args.at<Object>(2); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, sec, Object::ToNumber(sec)); |
+ s = sec->Number(); |
+ if (argc >= 3) { |
+ Handle<Object> ms = args.at<Object>(3); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, ms, Object::ToNumber(ms)); |
+ milli = ms->Number(); |
+ } |
+ } |
+ time_val = MakeDate(day, MakeTime(h, m, s, milli)); |
+ } |
+ return SetLocalDateValue(date, time_val); |
+} |
+ |
+ |
+// ES6 section 20.3.4.25 Date.prototype.setMonth ( month, date ) |
+BUILTIN(DatePrototypeSetMonth) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setMonth"); |
+ int const argc = args.length() - 1; |
+ Handle<Object> month = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, month, Object::ToNumber(month)); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms); |
+ int days = isolate->date_cache()->DaysFromTime(local_time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(local_time_ms, days); |
+ int year, unused, day; |
+ isolate->date_cache()->YearMonthDayFromDays(days, &year, &unused, &day); |
+ double m = month->Number(); |
+ double dt = day; |
+ if (argc >= 2) { |
+ Handle<Object> date = args.at<Object>(2); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, date, Object::ToNumber(date)); |
+ dt = date->Number(); |
+ } |
+ time_val = MakeDate(MakeDay(year, m, dt), time_within_day); |
+ } |
+ return SetLocalDateValue(date, time_val); |
+} |
+ |
+ |
+// ES6 section 20.3.4.26 Date.prototype.setSeconds ( sec, ms ) |
+BUILTIN(DatePrototypeSetSeconds) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setSeconds"); |
+ int const argc = args.length() - 1; |
+ Handle<Object> sec = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, sec, Object::ToNumber(sec)); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms); |
+ int day = isolate->date_cache()->DaysFromTime(local_time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(local_time_ms, day); |
+ int h = time_within_day / (60 * 60 * 1000); |
+ double m = (time_within_day / (60 * 1000)) % 60; |
+ double s = sec->Number(); |
+ double milli = time_within_day % 1000; |
+ if (argc >= 2) { |
+ Handle<Object> ms = args.at<Object>(2); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, ms, Object::ToNumber(ms)); |
+ milli = ms->Number(); |
+ } |
+ time_val = MakeDate(day, MakeTime(h, m, s, milli)); |
+ } |
+ return SetLocalDateValue(date, time_val); |
+} |
+ |
+ |
+// ES6 section 20.3.4.27 Date.prototype.setTime ( time ) |
+BUILTIN(DatePrototypeSetTime) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setTime"); |
+ Handle<Object> value = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(value)); |
+ return *JSDate::SetValue(date, TimeClip(value->Number())); |
+} |
+ |
+ |
+// ES6 section 20.3.4.28 Date.prototype.setUTCDate ( date ) |
+BUILTIN(DatePrototypeSetUTCDate) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setUTCDate"); |
+ Handle<Object> value = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, value, Object::ToNumber(value)); |
+ if (std::isnan(date->value()->Number())) return date->value(); |
+ int64_t const time_ms = static_cast<int64_t>(date->value()->Number()); |
+ int const days = isolate->date_cache()->DaysFromTime(time_ms); |
+ int const time_within_day = isolate->date_cache()->TimeInDay(time_ms, days); |
+ int year, month, day; |
+ isolate->date_cache()->YearMonthDayFromDays(days, &year, &month, &day); |
+ double const time_val = |
+ MakeDate(MakeDay(year, month, value->Number()), time_within_day); |
+ return *JSDate::SetValue(date, TimeClip(time_val)); |
+} |
+ |
+ |
+// ES6 section 20.3.4.29 Date.prototype.setUTCFullYear (year, month, date) |
+BUILTIN(DatePrototypeSetUTCFullYear) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setUTCFullYear"); |
+ int const argc = args.length() - 1; |
+ Handle<Object> year = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, year, Object::ToNumber(year)); |
+ double y = year->Number(), m = 0.0, dt = 1.0; |
+ int time_within_day = 0; |
+ if (!std::isnan(date->value()->Number())) { |
+ int64_t const time_ms = static_cast<int64_t>(date->value()->Number()); |
+ int const days = isolate->date_cache()->DaysFromTime(time_ms); |
+ time_within_day = isolate->date_cache()->TimeInDay(time_ms, days); |
+ int year, month, day; |
+ isolate->date_cache()->YearMonthDayFromDays(days, &year, &month, &day); |
+ m = month; |
+ dt = day; |
+ } |
+ if (argc >= 2) { |
+ Handle<Object> month = args.at<Object>(2); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, month, Object::ToNumber(month)); |
+ m = month->Number(); |
+ if (argc >= 3) { |
+ Handle<Object> date = args.at<Object>(3); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, date, Object::ToNumber(date)); |
+ dt = date->Number(); |
+ } |
+ } |
+ double const time_val = MakeDate(MakeDay(y, m, dt), time_within_day); |
+ return *JSDate::SetValue(date, TimeClip(time_val)); |
+} |
+ |
+ |
+// ES6 section 20.3.4.30 Date.prototype.setUTCHours(hour, min, sec, ms) |
+BUILTIN(DatePrototypeSetUTCHours) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setUTCHours"); |
+ int const argc = args.length() - 1; |
+ Handle<Object> hour = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, hour, Object::ToNumber(hour)); |
+ double h = hour->Number(); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int day = isolate->date_cache()->DaysFromTime(time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(time_ms, day); |
+ double m = (time_within_day / (60 * 1000)) % 60; |
+ double s = (time_within_day / 1000) % 60; |
+ double milli = time_within_day % 1000; |
+ if (argc >= 2) { |
+ Handle<Object> min = args.at<Object>(2); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, min, Object::ToNumber(min)); |
+ m = min->Number(); |
+ if (argc >= 3) { |
+ Handle<Object> sec = args.at<Object>(3); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, sec, Object::ToNumber(sec)); |
+ s = sec->Number(); |
+ if (argc >= 4) { |
+ Handle<Object> ms = args.at<Object>(4); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, ms, Object::ToNumber(ms)); |
+ milli = ms->Number(); |
+ } |
+ } |
+ } |
+ time_val = MakeDate(day, MakeTime(h, m, s, milli)); |
+ } |
+ return *JSDate::SetValue(date, TimeClip(time_val)); |
+} |
+ |
+ |
+// ES6 section 20.3.4.31 Date.prototype.setUTCMilliseconds(ms) |
+BUILTIN(DatePrototypeSetUTCMilliseconds) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setUTCMilliseconds"); |
+ Handle<Object> ms = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, ms, Object::ToNumber(ms)); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int day = isolate->date_cache()->DaysFromTime(time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(time_ms, day); |
+ int h = time_within_day / (60 * 60 * 1000); |
+ int m = (time_within_day / (60 * 1000)) % 60; |
+ int s = (time_within_day / 1000) % 60; |
+ time_val = MakeDate(day, MakeTime(h, m, s, ms->Number())); |
+ } |
+ return *JSDate::SetValue(date, TimeClip(time_val)); |
+} |
+ |
+ |
+// ES6 section 20.3.4.32 Date.prototype.setUTCMinutes ( min, sec, ms ) |
+BUILTIN(DatePrototypeSetUTCMinutes) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setUTCMinutes"); |
+ int const argc = args.length() - 1; |
+ Handle<Object> min = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, min, Object::ToNumber(min)); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int day = isolate->date_cache()->DaysFromTime(time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(time_ms, day); |
+ int h = time_within_day / (60 * 60 * 1000); |
+ double m = min->Number(); |
+ double s = (time_within_day / 1000) % 60; |
+ double milli = time_within_day % 1000; |
+ if (argc >= 2) { |
+ Handle<Object> sec = args.at<Object>(2); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, sec, Object::ToNumber(sec)); |
+ s = sec->Number(); |
+ if (argc >= 3) { |
+ Handle<Object> ms = args.at<Object>(3); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, ms, Object::ToNumber(ms)); |
+ milli = ms->Number(); |
+ } |
+ } |
+ time_val = MakeDate(day, MakeTime(h, m, s, milli)); |
+ } |
+ return *JSDate::SetValue(date, TimeClip(time_val)); |
+} |
+ |
+ |
+// ES6 section 20.3.4.31 Date.prototype.setUTCMonth ( month, date ) |
+BUILTIN(DatePrototypeSetUTCMonth) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setUTCMonth"); |
+ int const argc = args.length() - 1; |
+ Handle<Object> month = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, month, Object::ToNumber(month)); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int days = isolate->date_cache()->DaysFromTime(time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(time_ms, days); |
+ int year, unused, day; |
+ isolate->date_cache()->YearMonthDayFromDays(days, &year, &unused, &day); |
+ double m = month->Number(); |
+ double dt = day; |
+ if (argc >= 2) { |
+ Handle<Object> date = args.at<Object>(2); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, date, Object::ToNumber(date)); |
+ dt = date->Number(); |
+ } |
+ time_val = MakeDate(MakeDay(year, m, dt), time_within_day); |
+ } |
+ return *JSDate::SetValue(date, TimeClip(time_val)); |
+} |
+ |
+ |
+// ES6 section 20.3.4.34 Date.prototype.setUTCSeconds ( sec, ms ) |
+BUILTIN(DatePrototypeSetUTCSeconds) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setUTCSeconds"); |
+ int const argc = args.length() - 1; |
+ Handle<Object> sec = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, sec, Object::ToNumber(sec)); |
+ double time_val = date->value()->Number(); |
+ if (!std::isnan(time_val)) { |
+ int64_t const time_ms = static_cast<int64_t>(time_val); |
+ int day = isolate->date_cache()->DaysFromTime(time_ms); |
+ int time_within_day = isolate->date_cache()->TimeInDay(time_ms, day); |
+ int h = time_within_day / (60 * 60 * 1000); |
+ double m = (time_within_day / (60 * 1000)) % 60; |
+ double s = sec->Number(); |
+ double milli = time_within_day % 1000; |
+ if (argc >= 2) { |
+ Handle<Object> ms = args.at<Object>(2); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, ms, Object::ToNumber(ms)); |
+ milli = ms->Number(); |
+ } |
+ time_val = MakeDate(day, MakeTime(h, m, s, milli)); |
+ } |
+ return *JSDate::SetValue(date, TimeClip(time_val)); |
+} |
+ |
+ |
+// ES6 section 20.3.4.35 Date.prototype.toDateString ( ) |
+BUILTIN(DatePrototypeToDateString) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.toDateString"); |
+ char buffer[128]; |
+ Vector<char> str(buffer, arraysize(buffer)); |
+ ToDateString(date->value()->Number(), str, isolate->date_cache(), kDateOnly); |
+ return *isolate->factory()->NewStringFromAsciiChecked(str.start()); |
+} |
+ |
+ |
// ES6 section 20.3.4.36 Date.prototype.toISOString ( ) |
BUILTIN(DatePrototypeToISOString) { |
HandleScope scope(isolate); |
@@ -2349,6 +2796,48 @@ BUILTIN(DatePrototypeToISOString) { |
} |
+// ES6 section 20.3.4.41 Date.prototype.toString ( ) |
+BUILTIN(DatePrototypeToString) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.toString"); |
+ char buffer[128]; |
+ Vector<char> str(buffer, arraysize(buffer)); |
+ ToDateString(date->value()->Number(), str, isolate->date_cache()); |
+ return *isolate->factory()->NewStringFromAsciiChecked(str.start()); |
+} |
+ |
+ |
+// ES6 section 20.3.4.42 Date.prototype.toTimeString ( ) |
+BUILTIN(DatePrototypeToTimeString) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.toTimeString"); |
+ char buffer[128]; |
+ Vector<char> str(buffer, arraysize(buffer)); |
+ ToDateString(date->value()->Number(), str, isolate->date_cache(), kTimeOnly); |
+ return *isolate->factory()->NewStringFromAsciiChecked(str.start()); |
+} |
+ |
+ |
+// ES6 section 20.3.4.43 Date.prototype.toUTCString ( ) |
+BUILTIN(DatePrototypeToUTCString) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.toUTCString"); |
+ double const time_val = date->value()->Number(); |
+ if (std::isnan(time_val)) { |
+ return *isolate->factory()->NewStringFromAsciiChecked("Invalid Date"); |
+ } |
+ char buffer[128]; |
+ Vector<char> str(buffer, arraysize(buffer)); |
+ int64_t time_ms = static_cast<int64_t>(time_val); |
+ int year, month, day, weekday, hour, min, sec, ms; |
+ isolate->date_cache()->BreakDownTime(time_ms, &year, &month, &day, &weekday, |
+ &hour, &min, &sec, &ms); |
+ SNPrintF(str, "%s, %02d %s %4d %02d:%02d:%02d GMT", kShortWeekDays[weekday], |
+ day, kShortMonths[month], year, hour, min, sec); |
+ return *isolate->factory()->NewStringFromAsciiChecked(str.start()); |
+} |
+ |
+ |
// ES6 section 20.3.4.44 Date.prototype.valueOf ( ) |
BUILTIN(DatePrototypeValueOf) { |
HandleScope scope(isolate); |
@@ -2370,6 +2859,47 @@ BUILTIN(DatePrototypeToPrimitive) { |
} |
+// ES6 section B.2.4.1 Date.prototype.getYear ( ) |
+BUILTIN(DatePrototypeGetYear) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.getYear"); |
+ double time_val = date->value()->Number(); |
+ if (std::isnan(time_val)) return date->value(); |
+ int64_t time_ms = static_cast<int64_t>(time_val); |
+ int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms); |
+ int days = isolate->date_cache()->DaysFromTime(local_time_ms); |
+ int year, month, day; |
+ isolate->date_cache()->YearMonthDayFromDays(days, &year, &month, &day); |
+ return Smi::FromInt(year - 1900); |
+} |
+ |
+ |
+// ES6 section B.2.4.2 Date.prototype.setYear ( year ) |
+BUILTIN(DatePrototypeSetYear) { |
+ HandleScope scope(isolate); |
+ CHECK_RECEIVER(JSDate, date, "Date.prototype.setYear"); |
+ Handle<Object> year = args.atOrUndefined(isolate, 1); |
+ ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, year, Object::ToNumber(year)); |
+ double m = 0.0, dt = 1.0, y = year->Number(); |
+ if (0.0 <= y && y <= 99.0) { |
+ y = 1900.0 + DoubleToInteger(y); |
+ } |
+ int time_within_day = 0; |
+ if (!std::isnan(date->value()->Number())) { |
+ int64_t const time_ms = static_cast<int64_t>(date->value()->Number()); |
+ int64_t local_time_ms = isolate->date_cache()->ToLocal(time_ms); |
+ int const days = isolate->date_cache()->DaysFromTime(local_time_ms); |
+ time_within_day = isolate->date_cache()->TimeInDay(local_time_ms, days); |
+ int year, month, day; |
+ isolate->date_cache()->YearMonthDayFromDays(days, &year, &month, &day); |
+ m = month; |
+ dt = day; |
+ } |
+ double time_val = MakeDate(MakeDay(y, m, dt), time_within_day); |
+ return SetLocalDateValue(date, time_val); |
+} |
+ |
+ |
// static |
void Builtins::Generate_DatePrototypeGetDate(MacroAssembler* masm) { |
Generate_DatePrototype_GetField(masm, JSDate::kDay); |