[Temporal] Sync PR 2266 add ISODateTimeWithinLimits to CreateTemporalMonthDay

PR https://github.com/tc39/proposal-temporal/pull/2266

Disallow arbitrary integers for the reference ISO year in PlainMonthDay
Spec text: https://tc39.es/proposal-temporal/#sec-temporal-createtemporalmonthday

Also add missed assertion of calling ISODateTimeWithinLimits

Bug: v8:11544
Change-Id: Idd18428f3e6e6af53c2c207652688af269746782
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3855703
Reviewed-by: Shu-yu Guo <syg@chromium.org>
Commit-Queue: Frank Tang <ftang@chromium.org>
Cr-Commit-Position: refs/heads/main@{#82804}
This commit is contained in:
Frank Tang 2022-08-29 22:13:53 -07:00 committed by V8 LUCI CQ
parent 91637c25fc
commit 87ba2e2e11
2 changed files with 51 additions and 31 deletions

View File

@ -352,7 +352,7 @@ BalancePossiblyInfiniteDuration(Isolate* isolate, Unit largest_unit,
V8_WARN_UNUSED_RESULT Maybe<DurationRecord> DifferenceISODateTime(
Isolate* isolate, const DateTimeRecordCommon& date_time1,
const DateTimeRecordCommon& date_time2, Handle<JSReceiver> calendar,
Unit largest_unit, Handle<Object> relative_to, const char* method_name);
Unit largest_unit, Handle<JSReceiver> relative_to, const char* method_name);
// #sec-temporal-adddatetime
V8_WARN_UNUSED_RESULT Maybe<DateTimeRecordCommon> AddDateTime(
@ -863,26 +863,34 @@ MaybeHandle<JSTemporalPlainMonthDay> CreateTemporalMonthDay(
// 1. Assert: isoMonth, isoDay, and referenceISOYear are integers.
// 2. Assert: Type(calendar) is Object.
// 3. If ! IsValidISODate(referenceISOYear, isoMonth, isoDay) is false, throw
// a RangeError exception.
if (!IsValidISODate(isolate, {reference_iso_year, iso_month, iso_day})) {
// a RangeError exception.
THROW_INVALID_RANGE(JSTemporalPlainMonthDay);
}
// 4. If newTarget is not present, set it to %Temporal.PlainMonthDay%.
// 5. Let object be ? OrdinaryCreateFromConstructor(newTarget,
// 4. If ISODateTimeWithinLimits(referenceISOYear, isoMonth, isoDay, 12, 0, 0,
// 0, 0, 0) is false, throw a RangeError exception.
if (!ISODateTimeWithinLimits(
isolate,
{{reference_iso_year, iso_month, iso_day}, {12, 0, 0, 0, 0, 0}})) {
THROW_INVALID_RANGE(JSTemporalPlainMonthDay);
}
// 5. If newTarget is not present, set it to %Temporal.PlainMonthDay%.
// 6. Let object be ? OrdinaryCreateFromConstructor(newTarget,
// "%Temporal.PlainMonthDay.prototype%", « [[InitializedTemporalMonthDay]],
// [[ISOMonth]], [[ISODay]], [[ISOYear]], [[Calendar]] »).
ORDINARY_CREATE_FROM_CONSTRUCTOR(object, target, new_target,
JSTemporalPlainMonthDay)
object->set_year_month_day(0);
// 6. Set object.[[ISOMonth]] to isoMonth.
// 7. Set object.[[ISOMonth]] to isoMonth.
object->set_iso_month(iso_month);
// 7. Set object.[[ISODay]] to isoDay.
// 8. Set object.[[ISODay]] to isoDay.
object->set_iso_day(iso_day);
// 8. Set object.[[Calendar]] to calendar.
// 9. Set object.[[Calendar]] to calendar.
object->set_calendar(*calendar);
// 9. Set object.[[ISOYear]] to referenceISOYear.
// 10. Set object.[[ISOYear]] to referenceISOYear.
object->set_iso_year(reference_iso_year);
// 10. Return object.
// 11. Return object.
return object;
}
@ -5048,8 +5056,9 @@ Maybe<DateTimeRecordCommon> AddDateTime(Isolate* isolate,
Handle<Object> options) {
TEMPORAL_ENTER_FUNC();
// 1. Assert: year, month, day, hour, minute, second, millisecond,
// microsecond, and nanosecond are integers.
// 1. Assert: ISODateTimeWithinLimits(year, month, day, hour, minute, second,
// millisecond, microsecond, nanosecond) is true.
DCHECK(ISODateTimeWithinLimits(isolate, date_time));
// 2. Let timeResult be ! AddTime(hour, minute, second, millisecond,
// microsecond, nanosecond, hours, minutes, seconds, milliseconds,
// microseconds, nanoseconds).
@ -5748,11 +5757,15 @@ Maybe<NanosecondsToDaysResult> NanosecondsToDays(Isolate* isolate,
Maybe<DurationRecord> DifferenceISODateTime(
Isolate* isolate, const DateTimeRecordCommon& date_time1,
const DateTimeRecordCommon& date_time2, Handle<JSReceiver> calendar,
Unit largest_unit, Handle<Object> options, const char* method_name) {
Unit largest_unit, Handle<JSReceiver> options, const char* method_name) {
TEMPORAL_ENTER_FUNC();
// 1. Assert: ISODateTimeWithinLimits(y1, mon1, d1, h1, min1, s1, ms1, mus1,
// ns1) is true.
DCHECK(ISODateTimeWithinLimits(isolate, date_time1));
// 2. Assert: ISODateTimeWithinLimits(y2, mon2, d2, h2, min2, s2, ms2, mus2,
// ns2) is true.
DCHECK(ISODateTimeWithinLimits(isolate, date_time2));
DurationRecord result;
// 2. Assert: Type(options) is Object or Undefined.
DCHECK(options->IsJSReceiver() || options->IsUndefined());
// 3. Let timeDifference be ! DifferenceTime(h1, min1, s1, ms1, mus1, ns1, h2,
// min2, s2, ms2, mus2, ns2).
TimeDurationRecord time_difference;
@ -6577,7 +6590,7 @@ Handle<BigInt> DifferenceInstant(Isolate* isolate, Handle<BigInt> ns1,
Maybe<DurationRecord> DifferenceZonedDateTime(
Isolate* isolate, Handle<BigInt> ns1, Handle<BigInt> ns2,
Handle<JSReceiver> time_zone, Handle<JSReceiver> calendar,
Unit largest_unit, Handle<Object> options, const char* method_name);
Unit largest_unit, Handle<JSReceiver> options, const char* method_name);
// #sec-temporal-addduration
Maybe<DurationRecord> AddDuration(Isolate* isolate, const DurationRecord& dur1,
@ -8318,7 +8331,7 @@ Unit DefaultTemporalLargestUnit(const DurationRecord& dur) {
Maybe<DurationRecord> DifferenceZonedDateTime(
Isolate* isolate, Handle<BigInt> ns1, Handle<BigInt> ns2,
Handle<JSReceiver> time_zone, Handle<JSReceiver> calendar,
Unit largest_unit, Handle<Object> options, const char* method_name) {
Unit largest_unit, Handle<JSReceiver> options, const char* method_name) {
TEMPORAL_ENTER_FUNC();
// 1. If ns1 is ns2, then
@ -12909,31 +12922,39 @@ MaybeHandle<String> JSTemporalPlainDateTime::ToLocaleString(
namespace {
DateTimeRecordCommon RoundTime(Isolate* isolate, const TimeRecordCommon& time,
double increment, Unit unit,
RoundingMode rounding_mode,
double day_length_ns = 8.64e13);
constexpr double kNsPerDay = 8.64e13;
DateTimeRecordCommon RoundTime(
Isolate* isolate, const TimeRecordCommon& time, double increment, Unit unit,
RoundingMode rounding_mode,
// 3.a a. If dayLengthNs is not present, set dayLengthNs to nsPerDay.
double day_length_ns = kNsPerDay);
// #sec-temporal-roundisodatetime
DateTimeRecordCommon RoundISODateTime(Isolate* isolate,
const DateTimeRecordCommon& date_time,
double increment, Unit unit,
RoundingMode rounding_mode,
double day_length_ns = 8.64e13) {
DateTimeRecordCommon RoundISODateTime(
Isolate* isolate, const DateTimeRecordCommon& date_time, double increment,
Unit unit, RoundingMode rounding_mode,
// 3. If dayLength is not present, set dayLength to nsPerDay.
double day_length_ns = kNsPerDay) {
// 1. Assert: year, month, day, hour, minute, second, millisecond,
// microsecond, and nanosecond are integers.
TEMPORAL_ENTER_FUNC();
// 2. Assert: ISODateTimeWithinLimits(year, month, day, hour, minute, second,
// millisecond, microsecond, nanosecond) is true.
DCHECK(ISODateTimeWithinLimits(isolate, date_time));
// 3. Let roundedTime be ! RoundTime(hour, minute, second, millisecond,
// 4. Let roundedTime be ! RoundTime(hour, minute, second, millisecond,
// microsecond, nanosecond, increment, unit, roundingMode, dayLength).
DateTimeRecordCommon rounded_time = RoundTime(
isolate, date_time.time, increment, unit, rounding_mode, day_length_ns);
// 4. Let balanceResult be ! BalanceISODate(year, month, day +
// 5. Let balanceResult be ! BalanceISODate(year, month, day +
// roundedTime.[[Days]]).
rounded_time.date.year = date_time.date.year;
rounded_time.date.month = date_time.date.month;
rounded_time.date.day += date_time.date.day;
DateRecordCommon balance_result = BalanceISODate(isolate, rounded_time.date);
// 5. Return the Record { [[Year]]: balanceResult.[[Year]], [[Month]]:
// 6. Return the Record { [[Year]]: balanceResult.[[Year]], [[Month]]:
// balanceResult.[[Month]], [[Day]]: balanceResult.[[Day]], [[Hour]]:
// roundedTime.[[Hour]], [[Minute]]: roundedTime.[[Minute]], [[Second]]:
// roundedTime.[[Second]], [[Millisecond]]: roundedTime.[[Millisecond]],
@ -18122,8 +18143,8 @@ MaybeHandle<JSTemporalInstant> JSTemporalInstant::Round(
break;
// 13. Else,
case Unit::kNanosecond:
// b. Let maximum be 8.64 × 10^13.
maximum = 8.64e13;
// b. Let maximum be nsPerDay.
maximum = kNsPerDay;
break;
// a. Assert: smallestUnit is "nanosecond".
default:

View File

@ -686,7 +686,6 @@
'built-ins/Temporal/Instant/prototype/add/minimum-maximum-instant': [FAIL],
'built-ins/Temporal/Instant/prototype/subtract/minimum-maximum-instant': [FAIL],
'built-ins/Temporal/PlainMonthDay/refisoyear-out-of-range': [FAIL],
'intl402/Temporal/TimeZone/from/etc-timezone': [FAIL],
'intl402/Temporal/TimeZone/from/iana-legacy-names': [FAIL],
'intl402/Temporal/TimeZone/prototype/getNextTransition/transition-at-instant-boundaries': [FAIL],