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

[Temporal] Add Instant.prototype.toZonedDateTime(ISO)?

Spec Text:
https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.tozoneddatetime
https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.tozoneddatetimeiso

Bug: v8:11544
Change-Id: I452dfbf027e5d58edde9f9691519204ff29d8082
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3382058
Commit-Queue: Frank Tang <ftang@chromium.org>
Reviewed-by: 's avatarAdam Klein <adamk@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80684}
parent 4cf30172
......@@ -194,10 +194,6 @@ TO_BE_IMPLEMENTED(TemporalInstantPrototypeToLocaleString)
TO_BE_IMPLEMENTED(TemporalInstantPrototypeToString)
/* Temporal #sec-temporal.instant.tojson */
TO_BE_IMPLEMENTED(TemporalInstantPrototypeToJSON)
/* Temporal #sec-temporal.instant.prototype.tozoneddatetime */
TO_BE_IMPLEMENTED(TemporalInstantPrototypeToZonedDateTime)
/* Temporal #sec-temporal.instant.prototype.tozoneddatetimeiso */
TO_BE_IMPLEMENTED(TemporalInstantPrototypeToZonedDateTimeISO)
/* Temporal.PlainYearMonth */
/* Temporal #sec-temporal.plainyearmonth.compare */
......@@ -696,6 +692,8 @@ TEMPORAL_GET_NUMBER_AFTER_DIVID(Instant, EpochMilliseconds, nanoseconds,
1000000, epochMilliseconds)
TEMPORAL_GET_BIGINT_AFTER_DIVID(Instant, EpochMicroseconds, nanoseconds, 1000,
epochMicroseconds)
TEMPORAL_PROTOTYPE_METHOD1(Instant, ToZonedDateTime, toZonedDateTime)
TEMPORAL_PROTOTYPE_METHOD1(Instant, ToZonedDateTimeISO, toZonedDateTimeISO)
// Calendar
TEMPORAL_CONSTRUCTOR1(Calendar)
......
......@@ -9553,7 +9553,6 @@ MaybeHandle<JSTemporalInstant> JSTemporalInstant::FromEpochNanoseconds(
MaybeHandle<JSTemporalInstant> JSTemporalInstant::From(Isolate* isolate,
Handle<Object> item) {
TEMPORAL_ENTER_FUNC();
const char* method_name = "Temporal.Instant.from";
// 1. If Type(item) is Object and item has an [[InitializedTemporalInstant]]
// internal slot, then
if (item->IsJSTemporalInstant()) {
......@@ -9562,7 +9561,109 @@ MaybeHandle<JSTemporalInstant> JSTemporalInstant::From(Isolate* isolate,
isolate, handle(JSTemporalInstant::cast(*item).nanoseconds(), isolate));
}
// 2. Return ? ToTemporalInstant(item).
return ToTemporalInstant(isolate, item, method_name);
return ToTemporalInstant(isolate, item, "Temporal.Instant.from");
}
// #sec-temporal.instant.prototype.tozoneddatetime
MaybeHandle<JSTemporalZonedDateTime> JSTemporalInstant::ToZonedDateTime(
Isolate* isolate, Handle<JSTemporalInstant> handle,
Handle<Object> item_obj) {
TEMPORAL_ENTER_FUNC();
const char* method_name = "Temporal.Instant.prototype.toZonedDateTime";
Factory* factory = isolate->factory();
// 1. Let instant be the this value.
// 2. Perform ? RequireInternalSlot(instant, [[InitializedTemporalInstant]]).
// 3. If Type(item) is not Object, then
if (!item_obj->IsJSReceiver()) {
// a. Throw a TypeError exception.
THROW_NEW_ERROR(isolate, NEW_TEMPORAL_INVALID_ARG_TYPE_ERROR(),
JSTemporalZonedDateTime);
}
Handle<JSReceiver> item = Handle<JSReceiver>::cast(item_obj);
// 4. Let calendarLike be ? Get(item, "calendar").
Handle<Object> calendar_like;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, calendar_like,
Object::GetPropertyOrElement(isolate, item, factory->calendar_string()),
JSTemporalZonedDateTime);
// 5. If calendarLike is undefined, then
if (calendar_like->IsUndefined()) {
// a. Throw a TypeError exception.
THROW_NEW_ERROR(isolate, NEW_TEMPORAL_INVALID_ARG_TYPE_ERROR(),
JSTemporalZonedDateTime);
}
// 6. Let calendar be ? ToTemporalCalendar(calendarLike).
Handle<JSReceiver> calendar;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, calendar,
temporal::ToTemporalCalendar(isolate, calendar_like, method_name),
JSTemporalZonedDateTime);
// 7. Let temporalTimeZoneLike be ? Get(item, "timeZone").
Handle<Object> temporal_time_zone_like;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, temporal_time_zone_like,
Object::GetPropertyOrElement(isolate, item, factory->timeZone_string()),
JSTemporalZonedDateTime);
// 8. If temporalTimeZoneLike is undefined, then
if (calendar_like->IsUndefined()) {
// a. Throw a TypeError exception.
THROW_NEW_ERROR(isolate, NEW_TEMPORAL_INVALID_ARG_TYPE_ERROR(),
JSTemporalZonedDateTime);
}
// 9. Let timeZone be ? ToTemporalTimeZone(temporalTimeZoneLike).
Handle<JSReceiver> time_zone;
ASSIGN_RETURN_ON_EXCEPTION(isolate, time_zone,
temporal::ToTemporalTimeZone(
isolate, temporal_time_zone_like, method_name),
JSTemporalZonedDateTime);
// 10. Return ? CreateTemporalZonedDateTime(instant.[[Nanoseconds]], timeZone,
// calendar).
return CreateTemporalZonedDateTime(
isolate, Handle<BigInt>(handle->nanoseconds(), isolate), time_zone,
calendar);
}
// #sec-temporal.instant.prototype.tozoneddatetimeiso
MaybeHandle<JSTemporalZonedDateTime> JSTemporalInstant::ToZonedDateTimeISO(
Isolate* isolate, Handle<JSTemporalInstant> handle,
Handle<Object> item_obj) {
TEMPORAL_ENTER_FUNC();
Factory* factory = isolate->factory();
// 1. Let instant be the this value.
// 2. Perform ? RequireInternalSlot(instant, [[InitializedTemporalInstant]]).
// 3. If Type(item) is Object, then
if (item_obj->IsJSReceiver()) {
Handle<JSReceiver> item = Handle<JSReceiver>::cast(item_obj);
// a. Let timeZoneProperty be ? Get(item, "timeZone").
Handle<Object> time_zone_property;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, time_zone_property,
Object::GetPropertyOrElement(isolate, item, factory->timeZone_string()),
JSTemporalZonedDateTime);
// b. If timeZoneProperty is not undefined, then
if (!time_zone_property->IsUndefined()) {
// i. Set item to timeZoneProperty.
item_obj = time_zone_property;
}
}
// 4. Let timeZone be ? ToTemporalTimeZone(item).
Handle<JSReceiver> time_zone;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, time_zone,
temporal::ToTemporalTimeZone(
isolate, item_obj, "Temporal.Instant.prototype.toZonedDateTimeISO"),
JSTemporalZonedDateTime);
// 5. Let calendar be ! GetISO8601Calendar().
Handle<JSTemporalCalendar> calendar;
ASSIGN_RETURN_ON_EXCEPTION(isolate, calendar,
temporal::GetISO8601Calendar(isolate),
JSTemporalZonedDateTime);
// 6. Return ? CreateTemporalZonedDateTime(instant.[[Nanoseconds]], timeZone,
// calendar).
return CreateTemporalZonedDateTime(
isolate, Handle<BigInt>(handle->nanoseconds(), isolate), time_zone,
calendar);
}
namespace temporal {
......
......@@ -231,6 +231,16 @@ class JSTemporalInstant
V8_WARN_UNUSED_RESULT static MaybeHandle<JSTemporalInstant> From(
Isolate* isolate, Handle<Object> item);
// #sec-temporal.instant.prototype.tozoneddatetime
V8_WARN_UNUSED_RESULT static MaybeHandle<JSTemporalZonedDateTime>
ToZonedDateTime(Isolate* isolate, Handle<JSTemporalInstant> instant,
Handle<Object> item);
// #sec-temporal.instant.prototype.tozoneddatetimeiso
V8_WARN_UNUSED_RESULT static MaybeHandle<JSTemporalZonedDateTime>
ToZonedDateTimeISO(Isolate* isolate, Handle<JSTemporalInstant> instant,
Handle<Object> item);
DECL_PRINTER(JSTemporalInstant)
TQ_OBJECT_CONSTRUCTORS(JSTemporalInstant)
......
......@@ -652,13 +652,7 @@
'built-ins/Temporal/Instant/prototype/toString/timezone-string-datetime': [FAIL],
'built-ins/Temporal/Instant/prototype/toString/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/Instant/prototype/toString/year-format': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTime/branding': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-temporal-object': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/branding': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-datetime': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTime/plain-custom-timezone': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-datetime': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/Instant/prototype/until/argument-zoneddatetime': [FAIL],
'built-ins/Temporal/Instant/prototype/until/branding': [FAIL],
......@@ -1808,8 +1802,6 @@
'intl402/Temporal/Duration/prototype/subtract/relativeto-string-datetime': [FAIL],
'intl402/Temporal/Duration/prototype/total/relativeto-string-datetime': [FAIL],
'intl402/Temporal/Instant/prototype/toString/timezone-string-datetime': [FAIL],
'intl402/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-string-datetime': [FAIL],
'intl402/Temporal/Instant/prototype/toZonedDateTime/timezone-string-datetime': [FAIL],
'intl402/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-datetime': [FAIL],
'intl402/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-datetime': [FAIL],
'intl402/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-datetime': [FAIL],
......@@ -2372,9 +2364,6 @@
'built-ins/Temporal/Instant/prototype/since/instant-string-sub-minute-offset': [FAIL],
'built-ins/Temporal/Instant/prototype/toString/timezone-wrong-type': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-number': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTime/calendar-wrong-type': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTimeISO/timezone-wrong-type': [FAIL],
'built-ins/Temporal/Instant/prototype/toZonedDateTime/timezone-wrong-type': [FAIL],
'built-ins/Temporal/Instant/prototype/until/argument-object-tostring': [FAIL],
'built-ins/Temporal/Instant/prototype/until/argument-wrong-type': [FAIL],
'built-ins/Temporal/Instant/prototype/until/instant-string-sub-minute-offset': [FAIL],
......
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