From a141d2a58d809aea958750c3cf4199a821983e76 Mon Sep 17 00:00:00 2001 From: Frank Tang Date: Thu, 3 Feb 2022 13:42:33 -0800 Subject: [PATCH] [Temporal] Add Temporal.*.prototype.withCalendar Bug: v8:11544 Change-Id: I59e5a448385b2e67927c18c9609f24f4d66f3756 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3380305 Reviewed-by: Shu-yu Guo Commit-Queue: Frank Tang Cr-Commit-Position: refs/heads/main@{#78933} --- src/builtins/builtins-temporal.cc | 19 +++++--- src/objects/js-temporal-objects.cc | 77 ++++++++++++++++++++++++++++++ src/objects/js-temporal-objects.h | 16 +++++++ test/mjsunit/mjsunit.status | 2 - test/test262/test262.status | 7 --- 5 files changed, 106 insertions(+), 15 deletions(-) diff --git a/src/builtins/builtins-temporal.cc b/src/builtins/builtins-temporal.cc index 70861f645f..7cec745c34 100644 --- a/src/builtins/builtins-temporal.cc +++ b/src/builtins/builtins-temporal.cc @@ -53,8 +53,6 @@ TO_BE_IMPLEMENTED(TemporalPlainDatePrototypeAdd) TO_BE_IMPLEMENTED(TemporalPlainDatePrototypeSubtract) /* Temporal #sec-temporal.plaindate.prototype.with */ TO_BE_IMPLEMENTED(TemporalPlainDatePrototypeWith) -/* Temporal #sec-temporal.plaindate.prototype.withcalendar */ -TO_BE_IMPLEMENTED(TemporalPlainDatePrototypeWithCalendar) /* Temporal #sec-temporal.plaindate.prototype.until */ TO_BE_IMPLEMENTED(TemporalPlainDatePrototypeUntil) /* Temporal #sec-temporal.plaindate.prototype.since */ @@ -133,8 +131,6 @@ TO_BE_IMPLEMENTED(TemporalPlainDateTimePrototypeWith) TO_BE_IMPLEMENTED(TemporalPlainDateTimePrototypeWithPlainTime) /* Temporal #sec-temporal.plaindatetime.prototype.withplainDate */ TO_BE_IMPLEMENTED(TemporalPlainDateTimePrototypeWithPlainDate) -/* Temporal #sec-temporal.plaindatetime.prototype.withcalendar */ -TO_BE_IMPLEMENTED(TemporalPlainDateTimePrototypeWithCalendar) /* Temporal #sec-temporal.plaindatetime.prototype.add */ TO_BE_IMPLEMENTED(TemporalPlainDateTimePrototypeAdd) /* Temporal #sec-temporal.plaindatetime.prototype.subtract */ @@ -205,8 +201,6 @@ TO_BE_IMPLEMENTED(TemporalZonedDateTimePrototypeWithPlainTime) TO_BE_IMPLEMENTED(TemporalZonedDateTimePrototypeWithPlainDate) /* Temporal #sec-temporal.zoneddatetime.prototype.withtimezone */ TO_BE_IMPLEMENTED(TemporalZonedDateTimePrototypeWithTimeZone) -/* Temporal #sec-temporal.zoneddatetime.prototype.withcalendar */ -TO_BE_IMPLEMENTED(TemporalZonedDateTimePrototypeWithCalendar) /* Temporal #sec-temporal.zoneddatetime.prototype.add */ TO_BE_IMPLEMENTED(TemporalZonedDateTimePrototypeAdd) /* Temporal #sec-temporal.zoneddatetime.prototype.subtract */ @@ -469,6 +463,16 @@ TO_BE_IMPLEMENTED(TemporalZonedDateTimePrototypeToLocaleString) RETURN_RESULT_OR_FAILURE(isolate, JSTemporal##T ::METHOD(isolate, obj)); \ } +#define TEMPORAL_PROTOTYPE_METHOD1(T, METHOD, name) \ + BUILTIN(Temporal##T##Prototype##METHOD) { \ + HandleScope scope(isolate); \ + const char* method = "Temporal." #T ".prototype." #name; \ + CHECK_RECEIVER(JSTemporal##T, obj, method); \ + RETURN_RESULT_OR_FAILURE( \ + isolate, \ + JSTemporal##T ::METHOD(isolate, obj, args.atOrUndefined(isolate, 1))); \ + } + #define TEMPORAL_PROTOTYPE_METHOD3(T, METHOD, name) \ BUILTIN(Temporal##T##Prototype##METHOD) { \ HandleScope scope(isolate); \ @@ -579,6 +583,7 @@ TEMPORAL_GET_BY_INVOKE_CALENDAR_METHOD(PlainDate, DaysInMonth, daysInMonth) TEMPORAL_GET_BY_INVOKE_CALENDAR_METHOD(PlainDate, DaysInYear, daysInYear) TEMPORAL_GET_BY_INVOKE_CALENDAR_METHOD(PlainDate, MonthsInYear, monthsInYear) TEMPORAL_GET_BY_INVOKE_CALENDAR_METHOD(PlainDate, InLeapYear, inLeapYear) +TEMPORAL_PROTOTYPE_METHOD1(PlainDate, WithCalendar, withCalendar) TEMPORAL_PROTOTYPE_METHOD0(PlainDate, GetISOFields, getISOFields) TEMPORAL_VALUE_OF(PlainDate) @@ -630,6 +635,7 @@ TEMPORAL_GET_BY_INVOKE_CALENDAR_METHOD(PlainDateTime, DaysInYear, daysInYear) TEMPORAL_GET_BY_INVOKE_CALENDAR_METHOD(PlainDateTime, MonthsInYear, monthsInYear) TEMPORAL_GET_BY_INVOKE_CALENDAR_METHOD(PlainDateTime, InLeapYear, inLeapYear) +TEMPORAL_PROTOTYPE_METHOD1(PlainDateTime, WithCalendar, withCalendar) TEMPORAL_PROTOTYPE_METHOD0(PlainDateTime, GetISOFields, getISOFields) TEMPORAL_VALUE_OF(PlainDateTime) @@ -737,6 +743,7 @@ TEMPORAL_ZONED_DATE_TIME_GET_INT_BY_FORWARD_TIME_ZONE(Microsecond, iso_microsecond) TEMPORAL_ZONED_DATE_TIME_GET_INT_BY_FORWARD_TIME_ZONE(Nanosecond, iso_nanosecond) +TEMPORAL_PROTOTYPE_METHOD1(ZonedDateTime, WithCalendar, withCalendar) TEMPORAL_PROTOTYPE_METHOD0(ZonedDateTime, GetISOFields, getISOFields) TEMPORAL_VALUE_OF(ZonedDateTime) diff --git a/src/objects/js-temporal-objects.cc b/src/objects/js-temporal-objects.cc index 3341e04652..d6340e3729 100644 --- a/src/objects/js-temporal-objects.cc +++ b/src/objects/js-temporal-objects.cc @@ -678,6 +678,15 @@ MaybeHandle CreateTemporalZonedDateTime( return object; } +MaybeHandle CreateTemporalZonedDateTime( + Isolate* isolate, Handle epoch_nanoseconds, + Handle time_zone, Handle calendar) { + TEMPORAL_ENTER_FUNC(); + return CreateTemporalZonedDateTime(isolate, CONSTRUCTOR(zoned_date_time), + CONSTRUCTOR(zoned_date_time), + epoch_nanoseconds, time_zone, calendar); +} + // #sec-temporal-createtemporalduration MaybeHandle CreateTemporalDuration( Isolate* isolate, Handle target, Handle new_target, @@ -3761,6 +3770,26 @@ MaybeHandle JSTemporalPlainDate::Constructor( iso_day, calendar); } +// #sec-temporal.plaindate.prototype.withcalendar +MaybeHandle JSTemporalPlainDate::WithCalendar( + Isolate* isolate, Handle temporal_date, + Handle calendar_like) { + const char* method = "Temporal.PlainDate.prototype.withCalendar"; + // 1. Let temporalDate be the this value. + // 2. Perform ? RequireInternalSlot(temporalDate, + // [[InitializedTemporalDate]]). + // 3. Let calendar be ? ToTemporalCalendar(calendar). + Handle calendar; + ASSIGN_RETURN_ON_EXCEPTION(isolate, calendar, + ToTemporalCalendar(isolate, calendar_like, method), + JSTemporalPlainDate); + // 4. Return ? CreateTemporalDate(temporalDate.[[ISOYear]], + // temporalDate.[[ISOMonth]], temporalDate.[[ISODay]], calendar). + return CreateTemporalDate(isolate, temporal_date->iso_year(), + temporal_date->iso_month(), + temporal_date->iso_day(), calendar); +} + #define DEFINE_INT_FIELD(obj, str, field, item) \ CHECK(JSReceiver::CreateDataProperty( \ isolate, obj, factory->str##_string(), \ @@ -3840,6 +3869,32 @@ MaybeHandle JSTemporalPlainDateTime::Constructor( millisecond, microsecond, nanosecond, calendar); } +// #sec-temporal.plaindatetime.prototype.withcalendar +MaybeHandle JSTemporalPlainDateTime::WithCalendar( + Isolate* isolate, Handle date_time, + Handle calendar_like) { + const char* method = "Temporal.PlainDateTime.prototype.withCalendar"; + // 1. Let temporalDateTime be the this value. + // 2. Perform ? RequireInternalSlot(temporalDateTime, + // [[InitializedTemporalDateTime]]). + // 3. Let calendar be ? ToTemporalCalendar(calendar). + Handle calendar; + ASSIGN_RETURN_ON_EXCEPTION(isolate, calendar, + ToTemporalCalendar(isolate, calendar_like, method), + JSTemporalPlainDateTime); + // 4. Return ? CreateTemporalDateTime(temporalDateTime.[[ISOYear]], + // temporalDateTime.[[ISOMonth]], temporalDateTime.[[ISODay]], + // temporalDateTime.[[ISOHour]], temporalDateTime.[[ISOMinute]], + // temporalDateTime.[[ISOSecond]], temporalDateTime.[[ISOMillisecond]], + // temporalDateTime.[[ISOMicrosecond]], temporalDateTime.[[ISONanosecond]], + // calendar). + return temporal::CreateTemporalDateTime( + isolate, date_time->iso_year(), date_time->iso_month(), + date_time->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.plaindatetime.prototype.getisofields MaybeHandle JSTemporalPlainDateTime::GetISOFields( Isolate* isolate, Handle date_time) { @@ -4151,6 +4206,28 @@ MaybeHandle JSTemporalZonedDateTime::Constructor( epoch_nanoseconds, time_zone, calendar); } +// #sec-temporal.zoneddatetime.prototype.withcalendar +MaybeHandle JSTemporalZonedDateTime::WithCalendar( + Isolate* isolate, Handle zoned_date_time, + Handle calendar_like) { + TEMPORAL_ENTER_FUNC(); + const char* method = "Temporal.ZonedDateTime.prototype.withCalendar"; + // 1. Let zonedDateTime be the this value. + // 2. Perform ? RequireInternalSlot(zonedDateTime, + // [[InitializedTemporalZonedDateTime]]). + // 3. Let calendar be ? ToTemporalCalendar(calendarLike). + Handle calendar; + ASSIGN_RETURN_ON_EXCEPTION(isolate, calendar, + ToTemporalCalendar(isolate, calendar_like, method), + JSTemporalZonedDateTime); + + // 4. Return ? CreateTemporalZonedDateTime(zonedDateTime.[[Nanoseconds]], + // zonedDateTime.[[TimeZone]], calendar). + Handle nanoseconds = handle(zoned_date_time->nanoseconds(), isolate); + Handle time_zone = handle(zoned_date_time->time_zone(), isolate); + return CreateTemporalZonedDateTime(isolate, nanoseconds, time_zone, calendar); +} + // #sec-temporal.zoneddatetime.prototype.getisofields MaybeHandle JSTemporalZonedDateTime::GetISOFields( Isolate* isolate, Handle zoned_date_time) { diff --git a/src/objects/js-temporal-objects.h b/src/objects/js-temporal-objects.h index 51ff6607db..068972f17c 100644 --- a/src/objects/js-temporal-objects.h +++ b/src/objects/js-temporal-objects.h @@ -114,6 +114,11 @@ class JSTemporalPlainDate Handle iso_month, Handle iso_day, Handle calendar_like); + // #sec-temporal.plaindate.prototype.withcalendar + V8_WARN_UNUSED_RESULT static MaybeHandle WithCalendar( + Isolate* isolate, Handle plain_date, + Handle calendar_like); + // #sec-temporal.plaindate.prototype.getisofields V8_WARN_UNUSED_RESULT static MaybeHandle GetISOFields( Isolate* isolate, Handle plain_date); @@ -140,6 +145,11 @@ class JSTemporalPlainDateTime Handle microsecond, Handle nanosecond, Handle calendar_like); + // #sec-temporal.plaindatetime.prototype.withcalendar + V8_WARN_UNUSED_RESULT static MaybeHandle + WithCalendar(Isolate* isolate, Handle date_time, + Handle calendar_like); + // #sec-temporal.plaindatetime.prototype.getisofields V8_WARN_UNUSED_RESULT static MaybeHandle GetISOFields( Isolate* isolate, Handle date_time); @@ -273,6 +283,12 @@ class JSTemporalZonedDateTime Handle new_target, Handle epoch_nanoseconds, Handle time_zone_like, Handle calendar_like); + // #sec-temporal.zoneddatetime.prototype.withcalendar + V8_WARN_UNUSED_RESULT static MaybeHandle + WithCalendar(Isolate* isolate, + Handle zoned_date_time, + Handle calendar_like); + // #sec-temporal.zoneddatetime.prototype.getisofields V8_WARN_UNUSED_RESULT static MaybeHandle GetISOFields( Isolate* isolate, Handle zoned_date_time); diff --git a/test/mjsunit/mjsunit.status b/test/mjsunit/mjsunit.status index ab67f99477..f0c0a86ab2 100644 --- a/test/mjsunit/mjsunit.status +++ b/test/mjsunit/mjsunit.status @@ -103,7 +103,6 @@ 'temporal/plain-date-time-to-plain-year-month': [FAIL], 'temporal/plain-date-time-valueOf': [FAIL], 'temporal/plain-date-time-with': [FAIL], - 'temporal/plain-date-time-with-calendar': [FAIL], 'temporal/plain-date-time-with-plain-date': [FAIL], 'temporal/plain-date-time-with-plain-time': [FAIL], 'temporal/plain-date-to-json': [FAIL], @@ -112,7 +111,6 @@ 'temporal/plain-date-to-plain-year-month': [FAIL], 'temporal/plain-date-valueOf': [FAIL], 'temporal/plain-date-with': [FAIL], - 'temporal/plain-date-with-calendar': [FAIL], ############################################################################## # Open bugs. diff --git a/test/test262/test262.status b/test/test262/test262.status index 00297065ce..8e2d682068 100644 --- a/test/test262/test262.status +++ b/test/test262/test262.status @@ -1264,12 +1264,9 @@ 'built-ins/Temporal/PlainDate/prototype/with/basic': [FAIL], 'built-ins/Temporal/PlainDate/prototype/with/branding': [FAIL], 'built-ins/Temporal/PlainDate/prototype/withCalendar/basic': [FAIL], - 'built-ins/Temporal/PlainDate/prototype/withCalendar/branding': [FAIL], - 'built-ins/Temporal/PlainDate/prototype/withCalendar/calendar-temporal-object': [FAIL], 'built-ins/Temporal/PlainDate/prototype/with/calendar-fields-iterable': [FAIL], 'built-ins/Temporal/PlainDate/prototype/with/calendar-merge-fields-returns-primitive': [FAIL], 'built-ins/Temporal/PlainDate/prototype/withCalendar/missing-argument': [FAIL], - 'built-ins/Temporal/PlainDate/prototype/withCalendar/subclassing-ignored': [FAIL], 'built-ins/Temporal/PlainDate/prototype/with/copies-merge-fields-object': [FAIL], 'built-ins/Temporal/PlainDate/prototype/with/infinity-throws-rangeerror': [FAIL], 'built-ins/Temporal/PlainDate/prototype/with/options-invalid': [FAIL], @@ -1501,8 +1498,6 @@ 'built-ins/Temporal/PlainDateTime/prototype/until/smallestunit-undefined': [FAIL], 'built-ins/Temporal/PlainDateTime/prototype/until/smallestunit-wrong-type': [FAIL], 'built-ins/Temporal/PlainDateTime/prototype/with/branding': [FAIL], - 'built-ins/Temporal/PlainDateTime/prototype/withCalendar/branding': [FAIL], - 'built-ins/Temporal/PlainDateTime/prototype/withCalendar/calendar-temporal-object': [FAIL], 'built-ins/Temporal/PlainDateTime/prototype/with/calendar-fields-iterable': [FAIL], 'built-ins/Temporal/PlainDateTime/prototype/with/calendar-merge-fields-returns-primitive': [FAIL], 'built-ins/Temporal/PlainDateTime/prototype/withCalendar/missing-argument': [FAIL], @@ -2380,8 +2375,6 @@ 'built-ins/Temporal/ZonedDateTime/prototype/weekOfYear/timezone-getoffsetnanosecondsfor-wrong-type': [FAIL], 'built-ins/Temporal/ZonedDateTime/prototype/with/balance-negative-time-units': [FAIL], 'built-ins/Temporal/ZonedDateTime/prototype/with/branding': [FAIL], - 'built-ins/Temporal/ZonedDateTime/prototype/withCalendar/branding': [FAIL], - 'built-ins/Temporal/ZonedDateTime/prototype/withCalendar/calendar-temporal-object': [FAIL], 'built-ins/Temporal/ZonedDateTime/prototype/with/calendar-fields-iterable': [FAIL], 'built-ins/Temporal/ZonedDateTime/prototype/with/calendar-merge-fields-returns-primitive': [FAIL], 'built-ins/Temporal/ZonedDateTime/prototype/withCalendar/missing-argument': [FAIL],