Commit 1b13172d authored by Frank Tang's avatar Frank Tang Committed by V8 LUCI CQ

[Temporal] Add PlainDateTime.prototype.withPlainDate

Also add AO: ConsolidateCalendars

Spec Text:
https://tc39.es/proposal-temporal/#sec-temporal.plaindatetime.prototype.withplaindate
https://tc39.es/proposal-temporal/#sec-temporal-consolidatecalendars

Bug: v8:11544
Change-Id: I98084f7cc92a837f6401a88ad10389a7c5df8b3d
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3563541
Commit-Queue: Frank Tang <ftang@chromium.org>
Reviewed-by: 's avatarAdam Klein <adamk@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80764}
parent 495cc46b
......@@ -74,8 +74,6 @@ TO_BE_IMPLEMENTED(TemporalPlainTimePrototypeToString)
TO_BE_IMPLEMENTED(TemporalPlainDateTimeCompare)
/* Temporal #sec-temporal.plaindatetime.prototype.with */
TO_BE_IMPLEMENTED(TemporalPlainDateTimePrototypeWith)
/* Temporal #sec-temporal.plaindatetime.prototype.withplainDate */
TO_BE_IMPLEMENTED(TemporalPlainDateTimePrototypeWithPlainDate)
/* Temporal #sec-temporal.plaindatetime.prototype.add */
TO_BE_IMPLEMENTED(TemporalPlainDateTimePrototypeAdd)
/* Temporal #sec-temporal.plaindatetime.prototype.subtract */
......@@ -478,6 +476,7 @@ TEMPORAL_PROTOTYPE_METHOD0(PlainDateTime, ToPlainYearMonth, toPlainYearMonth)
TEMPORAL_PROTOTYPE_METHOD0(PlainDateTime, ToPlainMonthDay, toPlainMonthDay)
TEMPORAL_PROTOTYPE_METHOD2(PlainDateTime, ToZonedDateTime, toZonedDateTime)
TEMPORAL_PROTOTYPE_METHOD0(PlainDateTime, GetISOFields, getISOFields)
TEMPORAL_PROTOTYPE_METHOD1(PlainDateTime, WithPlainDate, withPlainDate)
TEMPORAL_VALUE_OF(PlainDateTime)
TEMPORAL_PROTOTYPE_METHOD0(PlainDateTime, ToPlainDate, toPlainDate)
TEMPORAL_PROTOTYPE_METHOD0(PlainDateTime, ToPlainTime, toPlainTime)
......
......@@ -8558,7 +8558,6 @@ MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainDateTime::WithPlainTime(
MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainDateTime::WithCalendar(
Isolate* isolate, Handle<JSTemporalPlainDateTime> date_time,
Handle<Object> calendar_like) {
const char* method_name = "Temporal.PlainDateTime.prototype.withCalendar";
// 1. Let temporalDateTime be the this value.
// 2. Perform ? RequireInternalSlot(temporalDateTime,
// [[InitializedTemporalDateTime]]).
......@@ -8566,7 +8565,9 @@ MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainDateTime::WithCalendar(
Handle<JSReceiver> calendar;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, calendar,
temporal::ToTemporalCalendar(isolate, calendar_like, method_name),
temporal::ToTemporalCalendar(
isolate, calendar_like,
"Temporal.PlainDateTime.prototype.withCalendar"),
JSTemporalPlainDateTime);
// 4. Return ? CreateTemporalDateTime(temporalDateTime.[[ISOYear]],
// temporalDateTime.[[ISOMonth]], temporalDateTime.[[ISODay]],
......@@ -8643,6 +8644,78 @@ MaybeHandle<JSTemporalZonedDateTime> JSTemporalPlainDateTime::ToZonedDateTime(
Handle<JSReceiver>(date_time->calendar(), isolate));
}
namespace {
// #sec-temporal-consolidatecalendars
MaybeHandle<JSReceiver> ConsolidateCalendars(Isolate* isolate,
Handle<JSReceiver> one,
Handle<JSReceiver> two) {
Factory* factory = isolate->factory();
// 1. If one and two are the same Object value, return two.
if (one.is_identical_to(two)) return two;
// 2. Let calendarOne be ? ToString(one).
Handle<String> calendar_one;
ASSIGN_RETURN_ON_EXCEPTION(isolate, calendar_one,
Object::ToString(isolate, one), JSReceiver);
// 3. Let calendarTwo be ? ToString(two).
Handle<String> calendar_two;
ASSIGN_RETURN_ON_EXCEPTION(isolate, calendar_two,
Object::ToString(isolate, two), JSReceiver);
// 4. If calendarOne is calendarTwo, return two.
if (String::Equals(isolate, calendar_one, calendar_two)) {
return two;
}
// 5. If calendarOne is "iso8601", return two.
if (String::Equals(isolate, calendar_one, factory->iso8601_string())) {
return two;
}
// 6. If calendarTwo is "iso8601", return one.
if (String::Equals(isolate, calendar_two, factory->iso8601_string())) {
return one;
}
// 7. Throw a RangeError exception.
THROW_NEW_ERROR(isolate, NEW_TEMPORAL_INVALID_ARG_RANGE_ERROR(), JSReceiver);
}
} // namespace
// #sec-temporal.plaindatetime.prototype.withplaindate
MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainDateTime::WithPlainDate(
Isolate* isolate, Handle<JSTemporalPlainDateTime> date_time,
Handle<Object> temporal_date_like) {
// 1. Let temporalDateTime be the this value.
// 2. Perform ? RequireInternalSlot(temporalDateTime,
// [[InitializedTemporalDateTime]]).
// 3. Let plainDate be ? ToTemporalDate(plainDateLike).
Handle<JSTemporalPlainDate> plain_date;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, plain_date,
ToTemporalDate(isolate, temporal_date_like,
"Temporal.PlainDateTime.prototype.withPlainDate"),
JSTemporalPlainDateTime);
// 4. Let calendar be ? ConsolidateCalendars(temporalDateTime.[[Calendar]],
// plainDate.[[Calendar]]).
Handle<JSReceiver> calendar;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, calendar,
ConsolidateCalendars(isolate, handle(date_time->calendar(), isolate),
handle(plain_date->calendar(), isolate)),
JSTemporalPlainDateTime);
// 5. Return ? CreateTemporalDateTime(plainDate.[[ISOYear]],
// plainDate.[[ISOMonth]], plainDate.[[ISODay]], temporalDateTime.[[ISOHour]],
// temporalDateTime.[[ISOMinute]], temporalDateTime.[[ISOSecond]],
// temporalDateTime.[[ISOMillisecond]], temporalDateTime.[[ISOMicrosecond]],
// temporalDateTime.[[ISONanosecond]], calendar).
return temporal::CreateTemporalDateTime(
isolate,
{{plain_date->iso_year(), plain_date->iso_month(), plain_date->iso_day()},
{date_time->iso_hour(), date_time->iso_minute(), date_time->iso_second(),
date_time->iso_millisecond(), date_time->iso_microsecond(),
date_time->iso_nanosecond()}},
calendar);
}
// #sec-temporal.now.plaindatetime
MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainDateTime::Now(
Isolate* isolate, Handle<Object> calendar_like,
......
......@@ -365,6 +365,11 @@ class JSTemporalPlainDateTime
Handle<Object> temporal_time_zone_like,
Handle<Object> options_obj);
// #sec-temporal.plaindatetime.prototype.withplaindate
V8_WARN_UNUSED_RESULT static MaybeHandle<JSTemporalPlainDateTime>
WithPlainDate(Isolate* isolate, Handle<JSTemporalPlainDateTime> date_time,
Handle<Object> temporal_date_date_like);
// #sec-temporal.plaindatetime.prototype.getisofields
V8_WARN_UNUSED_RESULT static MaybeHandle<JSReceiver> GetISOFields(
Isolate* isolate, Handle<JSTemporalPlainDateTime> date_time);
......
......@@ -69,7 +69,6 @@
'temporal/plain-date-time-subtract': [FAIL],
'temporal/plain-date-time-to-json': [FAIL],
'temporal/plain-date-time-with': [FAIL],
'temporal/plain-date-time-with-plain-date': [FAIL],
'temporal/plain-date-to-plain-date-time': [FAIL],
'temporal/plain-date-with': [FAIL],
......
......@@ -1015,18 +1015,6 @@
'built-ins/Temporal/PlainDateTime/prototype/with/overflow-invalid-string': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/with/overflow-undefined': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/with/overflow-wrong-type': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindatetime': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-with-utc-designator': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-non-integer': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-not-callable': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-out-of-range': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-zoneddatetime-timezone-getoffsetnanosecondsfor-wrong-type': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/branding': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/calendar-datefromfields-called-with-options-undefined': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/calendar-fields-iterable': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/calendar-temporal-object': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/infinity-throws-rangeerror': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/subclassing-ignored': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-zoneddatetime-balance-negative-time-units': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/with/read-time-fields-before-datefromfields': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/with/subclassing-ignored': [FAIL],
......@@ -1643,7 +1631,6 @@
'intl402/Temporal/PlainDateTime/prototype/toLocaleString/resolved-time-zone': [FAIL],
'intl402/Temporal/PlainDateTime/prototype/toLocaleString/timezone-getoffsetnanosecondsfor-not-callable': [FAIL],
'intl402/Temporal/PlainDateTime/prototype/until/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/PlainDateTime/prototype/withPlainDate/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/PlainMonthDay/prototype/equals/infinity-throws-rangeerror': [FAIL],
'intl402/Temporal/PlainMonthDay/prototype/toLocaleString/locales-undefined': [FAIL],
'intl402/Temporal/PlainMonthDay/prototype/toLocaleString/options-undefined': [FAIL],
......@@ -1764,7 +1751,6 @@
'built-ins/Temporal/PlainDateTime/prototype/until/largestunit-smallestunit-mismatch': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/year-zero': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/with/copy-properties-not-undefined': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/year-zero': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-no-implicit-midnight': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-time-designator-required-for-disambiguation': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainTime/argument-string-with-time-designator': [FAIL],
......@@ -1990,12 +1976,6 @@
'built-ins/Temporal/PlainDateTime/prototype/with/multiple-unrecognized-properties-ignored': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/with/options-empty': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/with/options-invalid': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-invalid': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/non-compatible-calendars-throw': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/with/string-throws': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/with/timezone-throws': [FAIL],
'built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-string-invalid': [FAIL],
......@@ -2102,10 +2082,6 @@
'built-ins/Temporal/PlainDateTime/prototype/with/calendar-temporal-object-throws': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/with/options-wrong-type': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-object-insufficient-data': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object': [FAIL],
'built-ins/Temporal/PlainTime/prototype/round/options-wrong-type': [FAIL],
'built-ins/Temporal/PlainTime/prototype/round/roundto-invalid-string': [FAIL],
'built-ins/Temporal/PlainTime/prototype/since/options-wrong-type': [FAIL],
......@@ -2241,10 +2217,7 @@
'built-ins/Temporal/PlainDateTime/prototype/until/argument-propertybag-calendar-wrong-type': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/argument-wrong-type': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-number': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-number': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-number': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-propertybag-calendar-wrong-type': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-wrong-type': [FAIL],
'built-ins/Temporal/PlainMonthDay/calendar-number': [FAIL],
'built-ins/Temporal/PlainMonthDay/from/argument-propertybag-calendar-number': [FAIL],
'built-ins/Temporal/PlainMonthDay/prototype/equals/argument-number': [FAIL],
......@@ -2516,6 +2489,14 @@
'language/identifiers/start-unicode-7*': [FAIL],
'language/identifiers/start-unicode-8*': [FAIL],
'language/identifiers/start-unicode-9*': [FAIL],
# Temporal
# https://github.com/tc39/test262/pull/3517
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-string-iso-calendar': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-noniso': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-id': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar-same-object': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-plaindate-calendar': [FAIL],
}], # no_i18n == True
['arch == arm or arch == mipsel or arch == mips or arch == arm64 or arch == mips64 or arch == mips64el', {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment