Commit 6d33cb89 authored by Frank Tang's avatar Frank Tang

[Temporal] Add Instant.(compare|prototype.equals)

Also implement AO: CompareEpochNanoseconds
Spec Text:
https://tc39.es/proposal-temporal/#sec-temporal.instant.compare
https://tc39.es/proposal-temporal/#sec-temporal.instant.prototype.equals

Bug: v8:11544
Change-Id: I953a890250ff0bf29cd24e4638bf17ceb5f9bb2f
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3382057
Commit-Queue: Frank Tang <ftang@chromium.org>
Reviewed-by: 's avatarAdam Klein <adamk@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80959}
parent 8436df4b
...@@ -104,8 +104,6 @@ TO_BE_IMPLEMENTED(TemporalDurationPrototypeToLocaleString) ...@@ -104,8 +104,6 @@ TO_BE_IMPLEMENTED(TemporalDurationPrototypeToLocaleString)
TO_BE_IMPLEMENTED(TemporalDurationPrototypeToString) TO_BE_IMPLEMENTED(TemporalDurationPrototypeToString)
/* Temporal.Instant */ /* Temporal.Instant */
/* Temporal #sec-temporal.instant.compare */
TO_BE_IMPLEMENTED(TemporalInstantCompare)
/* Temporal #sec-temporal.instant.prototype.add */ /* Temporal #sec-temporal.instant.prototype.add */
TO_BE_IMPLEMENTED(TemporalInstantPrototypeAdd) TO_BE_IMPLEMENTED(TemporalInstantPrototypeAdd)
/* Temporal #sec-temporal.instant.prototype.subtract */ /* Temporal #sec-temporal.instant.prototype.subtract */
...@@ -116,8 +114,6 @@ TO_BE_IMPLEMENTED(TemporalInstantPrototypeUntil) ...@@ -116,8 +114,6 @@ TO_BE_IMPLEMENTED(TemporalInstantPrototypeUntil)
TO_BE_IMPLEMENTED(TemporalInstantPrototypeSince) TO_BE_IMPLEMENTED(TemporalInstantPrototypeSince)
/* Temporal #sec-temporal.instant.prototype.round */ /* Temporal #sec-temporal.instant.prototype.round */
TO_BE_IMPLEMENTED(TemporalInstantPrototypeRound) TO_BE_IMPLEMENTED(TemporalInstantPrototypeRound)
/* Temporal #sec-temporal.instant.prototype.equals */
TO_BE_IMPLEMENTED(TemporalInstantPrototypeEquals)
/* Temporal #sec-temporal.instant.prototype.tolocalestring */ /* Temporal #sec-temporal.instant.prototype.tolocalestring */
TO_BE_IMPLEMENTED(TemporalInstantPrototypeToLocaleString) TO_BE_IMPLEMENTED(TemporalInstantPrototypeToLocaleString)
/* Temporal #sec-temporal.instant.prototype.tostring */ /* Temporal #sec-temporal.instant.prototype.tostring */
...@@ -244,6 +240,15 @@ TO_BE_IMPLEMENTED(TemporalZonedDateTimePrototypeToLocaleString) ...@@ -244,6 +240,15 @@ TO_BE_IMPLEMENTED(TemporalZonedDateTimePrototypeToLocaleString)
JSTemporal##T ::METHOD(isolate, args.atOrUndefined(isolate, 1))); \ JSTemporal##T ::METHOD(isolate, args.atOrUndefined(isolate, 1))); \
} }
#define TEMPORAL_METHOD2(T, METHOD) \
BUILTIN(Temporal##T##METHOD) { \
HandleScope scope(isolate); \
RETURN_RESULT_OR_FAILURE( \
isolate, \
JSTemporal##T ::METHOD(isolate, args.atOrUndefined(isolate, 1), \
args.atOrUndefined(isolate, 2))); \
}
#define TEMPORAL_GET(T, METHOD, field) \ #define TEMPORAL_GET(T, METHOD, field) \
BUILTIN(Temporal##T##Prototype##METHOD) { \ BUILTIN(Temporal##T##Prototype##METHOD) { \
HandleScope scope(isolate); \ HandleScope scope(isolate); \
...@@ -645,6 +650,8 @@ TEMPORAL_METHOD1(Instant, FromEpochMilliseconds) ...@@ -645,6 +650,8 @@ TEMPORAL_METHOD1(Instant, FromEpochMilliseconds)
TEMPORAL_METHOD1(Instant, FromEpochMicroseconds) TEMPORAL_METHOD1(Instant, FromEpochMicroseconds)
TEMPORAL_METHOD1(Instant, FromEpochNanoseconds) TEMPORAL_METHOD1(Instant, FromEpochNanoseconds)
TEMPORAL_METHOD1(Instant, From) TEMPORAL_METHOD1(Instant, From)
TEMPORAL_METHOD2(Instant, Compare)
TEMPORAL_PROTOTYPE_METHOD1(Instant, Equals, equals)
TEMPORAL_VALUE_OF(Instant) TEMPORAL_VALUE_OF(Instant)
TEMPORAL_GET(Instant, EpochNanoseconds, nanoseconds) TEMPORAL_GET(Instant, EpochNanoseconds, nanoseconds)
TEMPORAL_GET_NUMBER_AFTER_DIVID(Instant, EpochSeconds, nanoseconds, 1000000000, TEMPORAL_GET_NUMBER_AFTER_DIVID(Instant, EpochSeconds, nanoseconds, 1000000000,
......
...@@ -2816,10 +2816,18 @@ MaybeHandle<JSTemporalZonedDateTime> SystemZonedDateTime( ...@@ -2816,10 +2816,18 @@ MaybeHandle<JSTemporalZonedDateTime> SystemZonedDateTime(
return CreateTemporalZonedDateTime(isolate, ns, time_zone, calendar); return CreateTemporalZonedDateTime(isolate, ns, time_zone, calendar);
} }
#define COMPARE_RESULT_TO_SIGN(r) \ int CompareResultToSign(ComparisonResult r) {
((r) == ComparisonResult::kEqual \ switch (r) {
? 0 \ case ComparisonResult::kEqual:
: ((r) == ComparisonResult::kLessThan ? -1 : 1)) return 0;
case ComparisonResult::kLessThan:
return -1;
case ComparisonResult::kGreaterThan:
return 1;
case ComparisonResult::kUndefined:
UNREACHABLE();
}
}
// #sec-temporal-formattimezoneoffsetstring // #sec-temporal-formattimezoneoffsetstring
Handle<String> FormatTimeZoneOffsetString(Isolate* isolate, Handle<String> FormatTimeZoneOffsetString(Isolate* isolate,
...@@ -5027,7 +5035,7 @@ Maybe<NanosecondsToDaysResult> NanosecondsToDays(Isolate* isolate, ...@@ -5027,7 +5035,7 @@ Maybe<NanosecondsToDaysResult> NanosecondsToDays(Isolate* isolate,
// 3. Let sign be ! ℝ(Sign(𝔽(nanoseconds))). // 3. Let sign be ! ℝ(Sign(𝔽(nanoseconds))).
ComparisonResult compare_result = ComparisonResult compare_result =
BigInt::CompareToBigInt(nanoseconds, BigInt::FromInt64(isolate, 0)); BigInt::CompareToBigInt(nanoseconds, BigInt::FromInt64(isolate, 0));
double sign = COMPARE_RESULT_TO_SIGN(compare_result); double sign = CompareResultToSign(compare_result);
// 4. Let dayLengthNs be 8.64 × 10^13. // 4. Let dayLengthNs be 8.64 × 10^13.
Handle<BigInt> day_length_ns = BigInt::FromInt64(isolate, 86400000000000LLU); Handle<BigInt> day_length_ns = BigInt::FromInt64(isolate, 86400000000000LLU);
// 5. If sign is 0, then // 5. If sign is 0, then
...@@ -5197,7 +5205,7 @@ Maybe<NanosecondsToDaysResult> NanosecondsToDays(Isolate* isolate, ...@@ -5197,7 +5205,7 @@ Maybe<NanosecondsToDaysResult> NanosecondsToDays(Isolate* isolate,
// c. If (nanoseconds − dayLengthNs) × sign ≥ 0, then // c. If (nanoseconds − dayLengthNs) × sign ≥ 0, then
compare_result = BigInt::CompareToBigInt(nanoseconds, day_length_ns); compare_result = BigInt::CompareToBigInt(nanoseconds, day_length_ns);
if (sign * COMPARE_RESULT_TO_SIGN(compare_result) >= 0) { if (sign * CompareResultToSign(compare_result) >= 0) {
// i. Set nanoseconds to nanoseconds − dayLengthNs. // i. Set nanoseconds to nanoseconds − dayLengthNs.
ASSIGN_RETURN_ON_EXCEPTION_VALUE( ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, nanoseconds, isolate, nanoseconds,
...@@ -10612,8 +10620,6 @@ MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainTime::ToPlainDateTime( ...@@ -10612,8 +10620,6 @@ MaybeHandle<JSTemporalPlainDateTime> JSTemporalPlainTime::ToPlainDateTime(
namespace { namespace {
enum class Arithmetic { kAdd, kSubtract };
// #sec-temporal-adddurationtoorsubtractdurationfromplaintime // #sec-temporal-adddurationtoorsubtractdurationfromplaintime
MaybeHandle<JSTemporalPlainTime> AddDurationToOrSubtractDurationFromPlainTime( MaybeHandle<JSTemporalPlainTime> AddDurationToOrSubtractDurationFromPlainTime(
Isolate* isolate, Arithmetic operation, Isolate* isolate, Arithmetic operation,
...@@ -11081,6 +11087,19 @@ Maybe<StringPrecision> ToSecondsStringPrecision( ...@@ -11081,6 +11087,19 @@ Maybe<StringPrecision> ToSecondsStringPrecision(
} }
} }
// #sec-temporal-compareepochnanoseconds
MaybeHandle<Smi> CompareEpochNanoseconds(Isolate* isolate, Handle<BigInt> one,
Handle<BigInt> two) {
TEMPORAL_ENTER_FUNC();
// 1. If epochNanosecondsOne > epochNanosecondsTwo, return 1.
// 2. If epochNanosecondsOne < epochNanosecondsTwo, return -1.
// 3. Return 0.
return handle(
Smi::FromInt(CompareResultToSign(BigInt::CompareToBigInt(one, two))),
isolate);
}
} // namespace } // namespace
// #sec-temporal.plaintime.prototype.tostring // #sec-temporal.plaintime.prototype.tostring
...@@ -11764,14 +11783,13 @@ MaybeHandle<JSTemporalInstant> JSTemporalInstant::Constructor( ...@@ -11764,14 +11783,13 @@ MaybeHandle<JSTemporalInstant> JSTemporalInstant::Constructor(
Isolate* isolate, Handle<JSFunction> target, Handle<HeapObject> new_target, Isolate* isolate, Handle<JSFunction> target, Handle<HeapObject> new_target,
Handle<Object> epoch_nanoseconds_obj) { Handle<Object> epoch_nanoseconds_obj) {
TEMPORAL_ENTER_FUNC(); TEMPORAL_ENTER_FUNC();
const char* method_name = "Temporal.Instant";
// 1. If NewTarget is undefined, then // 1. If NewTarget is undefined, then
if (new_target->IsUndefined()) { if (new_target->IsUndefined()) {
// a. Throw a TypeError exception. // a. Throw a TypeError exception.
THROW_NEW_ERROR(isolate, THROW_NEW_ERROR(isolate,
NewTypeError(MessageTemplate::kMethodInvokedOnWrongType, NewTypeError(MessageTemplate::kMethodInvokedOnWrongType,
isolate->factory()->NewStringFromAsciiChecked( isolate->factory()->NewStringFromAsciiChecked(
method_name)), "Temporal.Instant")),
JSTemporalInstant); JSTemporalInstant);
} }
// 2. Let epochNanoseconds be ? ToBigInt(epochNanoseconds). // 2. Let epochNanoseconds be ? ToBigInt(epochNanoseconds).
...@@ -11877,6 +11895,46 @@ MaybeHandle<JSTemporalInstant> JSTemporalInstant::FromEpochNanoseconds( ...@@ -11877,6 +11895,46 @@ MaybeHandle<JSTemporalInstant> JSTemporalInstant::FromEpochNanoseconds(
return ScaleToNanosecondsVerifyAndMake(isolate, epoch_nanoseconds, 1); return ScaleToNanosecondsVerifyAndMake(isolate, epoch_nanoseconds, 1);
} }
// #sec-temporal.instant.compare
MaybeHandle<Smi> JSTemporalInstant::Compare(Isolate* isolate,
Handle<Object> one_obj,
Handle<Object> two_obj) {
TEMPORAL_ENTER_FUNC();
const char* method_name = "Temporal.Instant.compare";
// 1. Set one to ? ToTemporalInstant(one).
Handle<JSTemporalInstant> one;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, one, ToTemporalInstant(isolate, one_obj, method_name), Smi);
// 2. Set two to ? ToTemporalInstant(two).
Handle<JSTemporalInstant> two;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, two, ToTemporalInstant(isolate, two_obj, method_name), Smi);
// 3. Return 𝔽(! CompareEpochNanoseconds(one.[[Nanoseconds]],
// two.[[Nanoseconds]])).
return CompareEpochNanoseconds(isolate, handle(one->nanoseconds(), isolate),
handle(two->nanoseconds(), isolate));
}
// #sec-temporal.instant.prototype.equals
MaybeHandle<Oddball> JSTemporalInstant::Equals(Isolate* isolate,
Handle<JSTemporalInstant> handle,
Handle<Object> other_obj) {
TEMPORAL_ENTER_FUNC();
// 1. Let instant be the this value.
// 2. Perform ? RequireInternalSlot(instant, [[InitializedTemporalInstant]]).
// 3. Set other to ? ToTemporalInstant(other).
Handle<JSTemporalInstant> other;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, other,
ToTemporalInstant(isolate, other_obj,
"Temporal.Instant.prototype.equals"),
Oddball);
// 4. If instant.[[Nanoseconds]] ≠ other.[[Nanoseconds]], return false.
// 5. Return true.
return isolate->factory()->ToBoolean(
BigInt::EqualToBigInt(handle->nanoseconds(), other->nanoseconds()));
}
// #sec-temporal.instant.from // #sec-temporal.instant.from
MaybeHandle<JSTemporalInstant> JSTemporalInstant::From(Isolate* isolate, MaybeHandle<JSTemporalInstant> JSTemporalInstant::From(Isolate* isolate,
Handle<Object> item) { Handle<Object> item) {
......
...@@ -246,6 +246,16 @@ class JSTemporalInstant ...@@ -246,6 +246,16 @@ class JSTemporalInstant
ToZonedDateTimeISO(Isolate* isolate, Handle<JSTemporalInstant> instant, ToZonedDateTimeISO(Isolate* isolate, Handle<JSTemporalInstant> instant,
Handle<Object> item); Handle<Object> item);
// #sec-temporal.instant.compare
V8_WARN_UNUSED_RESULT static MaybeHandle<Smi> Compare(Isolate* isolate,
Handle<Object> one,
Handle<Object> two);
// #sec-temporal.instant.prototype.equals
V8_WARN_UNUSED_RESULT static MaybeHandle<Oddball> Equals(
Isolate* isolate, Handle<JSTemporalInstant> instant,
Handle<Object> other);
DECL_PRINTER(JSTemporalInstant) DECL_PRINTER(JSTemporalInstant)
TQ_OBJECT_CONSTRUCTORS(JSTemporalInstant) TQ_OBJECT_CONSTRUCTORS(JSTemporalInstant)
......
...@@ -49,9 +49,7 @@ ...@@ -49,9 +49,7 @@
'temporal/duration-add': [FAIL], 'temporal/duration-add': [FAIL],
'temporal/duration-to-json': [FAIL], 'temporal/duration-to-json': [FAIL],
'temporal/instant-add': [FAIL], 'temporal/instant-add': [FAIL],
'temporal/instant-compare': [FAIL],
'temporal/instant-constructor': [FAIL], 'temporal/instant-constructor': [FAIL],
'temporal/instant-equals': [FAIL],
'temporal/instant-from-epoch-microseconds': [FAIL], 'temporal/instant-from-epoch-microseconds': [FAIL],
'temporal/instant-from-epoch-milliseconds': [FAIL], 'temporal/instant-from-epoch-milliseconds': [FAIL],
'temporal/instant-from-epoch-nanoseconds': [FAIL], 'temporal/instant-from-epoch-nanoseconds': [FAIL],
......
...@@ -347,8 +347,6 @@ ...@@ -347,8 +347,6 @@
'built-ins/Temporal/Duration/prototype/round/timezone-getpossibleinstantsfor-iterable': [FAIL], 'built-ins/Temporal/Duration/prototype/round/timezone-getpossibleinstantsfor-iterable': [FAIL],
'built-ins/Temporal/Duration/prototype/total/timezone-getpossibleinstantsfor-iterable': [FAIL], 'built-ins/Temporal/Duration/prototype/total/timezone-getpossibleinstantsfor-iterable': [FAIL],
'built-ins/Temporal/Instant/from/instant-string-multiple-offsets': [SKIP],
# https://github.com/tc39/test262/issues/3262 # https://github.com/tc39/test262/issues/3262
'built-ins/Temporal/Duration/prototype/add/calendar-dateadd-called-with-options-undefined': [FAIL], 'built-ins/Temporal/Duration/prototype/add/calendar-dateadd-called-with-options-undefined': [FAIL],
'built-ins/Temporal/Duration/prototype/subtract/calendar-dateadd-called-with-options-undefined': [FAIL], 'built-ins/Temporal/Duration/prototype/subtract/calendar-dateadd-called-with-options-undefined': [FAIL],
...@@ -541,9 +539,7 @@ ...@@ -541,9 +539,7 @@
'built-ins/Temporal/Duration/prototype/total/unit-plurals-accepted-string': [FAIL], 'built-ins/Temporal/Duration/prototype/total/unit-plurals-accepted-string': [FAIL],
'built-ins/Temporal/Duration/prototype/total/unit-string-shorthand-string': [FAIL], 'built-ins/Temporal/Duration/prototype/total/unit-string-shorthand-string': [FAIL],
'built-ins/Temporal/Duration/prototype/total/unit-wrong-type': [FAIL], 'built-ins/Temporal/Duration/prototype/total/unit-wrong-type': [FAIL],
'built-ins/Temporal/Instant/compare/argument-zoneddatetime': [FAIL],
'built-ins/Temporal/Instant/compare/instant-string': [FAIL], 'built-ins/Temporal/Instant/compare/instant-string': [FAIL],
'built-ins/Temporal/Instant/compare/instant-string-multiple-offsets': [FAIL],
'built-ins/Temporal/Instant/from/instant-string': [FAIL], 'built-ins/Temporal/Instant/from/instant-string': [FAIL],
'built-ins/Temporal/Instant/from/timezone-custom': [FAIL], 'built-ins/Temporal/Instant/from/timezone-custom': [FAIL],
'built-ins/Temporal/Instant/prototype/add/argument-string': [FAIL], 'built-ins/Temporal/Instant/prototype/add/argument-string': [FAIL],
...@@ -556,10 +552,7 @@ ...@@ -556,10 +552,7 @@
'built-ins/Temporal/Instant/prototype/add/result-out-of-range': [FAIL], 'built-ins/Temporal/Instant/prototype/add/result-out-of-range': [FAIL],
'built-ins/Temporal/Instant/prototype/add/subclassing-ignored': [FAIL], 'built-ins/Temporal/Instant/prototype/add/subclassing-ignored': [FAIL],
'built-ins/Temporal/Instant/prototype/equals/argument-wrong-type': [FAIL], 'built-ins/Temporal/Instant/prototype/equals/argument-wrong-type': [FAIL],
'built-ins/Temporal/Instant/prototype/equals/argument-zoneddatetime': [FAIL],
'built-ins/Temporal/Instant/prototype/equals/branding': [FAIL],
'built-ins/Temporal/Instant/prototype/equals/instant-string': [FAIL], 'built-ins/Temporal/Instant/prototype/equals/instant-string': [FAIL],
'built-ins/Temporal/Instant/prototype/equals/instant-string-multiple-offsets': [FAIL],
'built-ins/Temporal/Instant/prototype/round/branding': [FAIL], 'built-ins/Temporal/Instant/prototype/round/branding': [FAIL],
'built-ins/Temporal/Instant/prototype/round/options-wrong-type': [FAIL], 'built-ins/Temporal/Instant/prototype/round/options-wrong-type': [FAIL],
'built-ins/Temporal/Instant/prototype/round/roundingincrement-nan': [FAIL], 'built-ins/Temporal/Instant/prototype/round/roundingincrement-nan': [FAIL],
...@@ -1470,9 +1463,7 @@ ...@@ -1470,9 +1463,7 @@
'built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-exact-number-of-digits': [FAIL], 'built-ins/Temporal/Duration/prototype/toString/fractionalseconddigits-exact-number-of-digits': [FAIL],
'built-ins/Temporal/Duration/prototype/total/calendar-possibly-required': [FAIL], 'built-ins/Temporal/Duration/prototype/total/calendar-possibly-required': [FAIL],
'built-ins/Temporal/Duration/prototype/total/year-zero': [FAIL], 'built-ins/Temporal/Duration/prototype/total/year-zero': [FAIL],
'built-ins/Temporal/Instant/compare/year-zero': [FAIL],
'built-ins/Temporal/Instant/prototype/add/argument-string-fractional-units-rounding-mode': [FAIL], 'built-ins/Temporal/Instant/prototype/add/argument-string-fractional-units-rounding-mode': [FAIL],
'built-ins/Temporal/Instant/prototype/equals/year-zero': [FAIL],
'built-ins/Temporal/Instant/prototype/since/largestunit-smallestunit-mismatch': [FAIL], 'built-ins/Temporal/Instant/prototype/since/largestunit-smallestunit-mismatch': [FAIL],
'built-ins/Temporal/Instant/prototype/since/year-zero': [FAIL], 'built-ins/Temporal/Instant/prototype/since/year-zero': [FAIL],
'built-ins/Temporal/Instant/prototype/subtract/argument-string-fractional-units-rounding-mode': [FAIL], 'built-ins/Temporal/Instant/prototype/subtract/argument-string-fractional-units-rounding-mode': [FAIL],
...@@ -1857,12 +1848,8 @@ ...@@ -1857,12 +1848,8 @@
'built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-wrong-type': [FAIL], 'built-ins/Temporal/Duration/prototype/total/relativeto-propertybag-calendar-wrong-type': [FAIL],
'built-ins/Temporal/Duration/prototype/total/relativeto-wrong-type': [FAIL], 'built-ins/Temporal/Duration/prototype/total/relativeto-wrong-type': [FAIL],
'built-ins/Temporal/Duration/prototype/total/timezone-wrong-type': [FAIL], 'built-ins/Temporal/Duration/prototype/total/timezone-wrong-type': [FAIL],
'built-ins/Temporal/Instant/compare/argument-object-tostring': [FAIL],
'built-ins/Temporal/Instant/compare/argument-wrong-type': [FAIL], 'built-ins/Temporal/Instant/compare/argument-wrong-type': [FAIL],
'built-ins/Temporal/Instant/compare/instant-string-sub-minute-offset': [FAIL],
'built-ins/Temporal/Instant/from/argument-wrong-type': [FAIL], 'built-ins/Temporal/Instant/from/argument-wrong-type': [FAIL],
'built-ins/Temporal/Instant/prototype/equals/argument-object-tostring': [FAIL],
'built-ins/Temporal/Instant/prototype/equals/instant-string-sub-minute-offset': [FAIL],
'built-ins/Temporal/Instant/prototype/since/argument-object-tostring': [FAIL], 'built-ins/Temporal/Instant/prototype/since/argument-object-tostring': [FAIL],
'built-ins/Temporal/Instant/prototype/since/argument-wrong-type': [FAIL], 'built-ins/Temporal/Instant/prototype/since/argument-wrong-type': [FAIL],
'built-ins/Temporal/Instant/prototype/since/instant-string-sub-minute-offset': [FAIL], 'built-ins/Temporal/Instant/prototype/since/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