[Temporal] Fix AddInstant and AddZonedDateTime

Change AddInstant to use BigInt::FromNumber(isolate, factory->NewNumber
instead of BigInt::FromInt64 to convert from double to BigInt.
Sync AddZonedDateTime with https://github.com/tc39/proposal-temporal/pull/2303 which call AddInstant as ? instead of ! marking.

Spec Text:
https://tc39.es/proposal-temporal/#sec-temporal-addinstant
https://tc39.es/proposal-temporal/#sec-temporal-addzoneddatetime

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

Bug: v8:11544
Change-Id: I4bd176294780f761341c25a5f71643b437f99c82
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3859165
Commit-Queue: Frank Tang <ftang@chromium.org>
Reviewed-by: Adam Klein <adamk@chromium.org>
Cr-Commit-Position: refs/heads/main@{#83088}
This commit is contained in:
Frank Tang 2022-09-07 21:34:11 -07:00 committed by V8 LUCI CQ
parent 33806ecad7
commit 95b02431bd
2 changed files with 55 additions and 63 deletions

View File

@ -5448,10 +5448,9 @@ MaybeHandle<BigInt> AddZonedDateTime(Isolate* isolate,
// 2. If all of years, months, weeks, and days are 0, then
if (duration.years == 0 && duration.months == 0 && duration.weeks == 0 &&
time_duration.days == 0) {
// a. Return ! AddInstant(epochNanoseconds, hours, minutes, seconds,
// a. Return ? AddInstant(epochNanoseconds, hours, minutes, seconds,
// milliseconds, microseconds, nanoseconds).
return AddInstant(isolate, epoch_nanoseconds, time_duration)
.ToHandleChecked();
return AddInstant(isolate, epoch_nanoseconds, time_duration);
}
// 3. Let instant be ! CreateTemporalInstant(epochNanoseconds).
Handle<JSTemporalInstant> instant =
@ -5522,13 +5521,12 @@ MaybeHandle<BigInt> AddZonedDateTime(Isolate* isolate,
BuiltinTimeZoneGetInstantFor(isolate, time_zone, intermediate_date_time,
Disambiguation::kCompatible, method_name),
BigInt);
// 10. Return ! AddInstant(intermediateInstant.[[Nanoseconds]], hours,
// 10. Return ? AddInstant(intermediateInstant.[[Nanoseconds]], hours,
// minutes, seconds, milliseconds, microseconds, nanoseconds).
time_duration.days = 0;
return AddInstant(isolate,
handle(intermediate_instant->nanoseconds(), isolate),
time_duration)
.ToHandleChecked();
time_duration);
}
Maybe<NanosecondsToDaysResult> NanosecondsToDays(Isolate* isolate,
@ -5854,65 +5852,67 @@ MaybeHandle<BigInt> AddInstant(Isolate* isolate,
Handle<BigInt> epoch_nanoseconds,
const TimeDurationRecord& addend) {
TEMPORAL_ENTER_FUNC();
Factory* factory = isolate->factory();
// 1. Assert: hours, minutes, seconds, milliseconds, microseconds, and
// nanoseconds are integer Number values.
// 2. Let result be epochNanoseconds + (nanoseconds) +
// (microseconds) × 1000 + (milliseconds) × 10^6 + (seconds) × 10^9 +
// (minutes) × 60 × 10^9 + (hours) × 3600 × 10^9.
Handle<BigInt> result;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, result,
BigInt::Add(isolate, epoch_nanoseconds,
BigInt::FromInt64(isolate, addend.nanoseconds)),
BigInt);
Handle<BigInt> temp;
ASSIGN_RETURN_ON_EXCEPTION(
isolate, temp,
BigInt::Multiply(isolate, BigInt::FromInt64(isolate, addend.microseconds),
BigInt::FromInt64(isolate, 1000)),
BigInt);
ASSIGN_RETURN_ON_EXCEPTION(isolate, result,
BigInt::Add(isolate, result, temp), BigInt);
ASSIGN_RETURN_ON_EXCEPTION(
isolate, temp,
BigInt::Multiply(isolate, BigInt::FromInt64(isolate, addend.milliseconds),
BigInt::FromInt64(isolate, 1000000)),
BigInt);
ASSIGN_RETURN_ON_EXCEPTION(isolate, result,
BigInt::Add(isolate, result, temp), BigInt);
// epochNanoseconds + (nanoseconds)
Handle<BigInt> result =
BigInt::Add(
isolate, epoch_nanoseconds,
BigInt::FromNumber(isolate, factory->NewNumber(addend.nanoseconds))
.ToHandleChecked())
.ToHandleChecked();
ASSIGN_RETURN_ON_EXCEPTION(
isolate, temp,
BigInt::Multiply(isolate, BigInt::FromInt64(isolate, addend.seconds),
BigInt::FromInt64(isolate, 1000000000)),
BigInt);
ASSIGN_RETURN_ON_EXCEPTION(isolate, result,
BigInt::Add(isolate, result, temp), BigInt);
// + (microseconds) × 1000
Handle<BigInt> temp =
BigInt::Multiply(
isolate,
BigInt::FromNumber(isolate, factory->NewNumber(addend.microseconds))
.ToHandleChecked(),
BigInt::FromInt64(isolate, 1000))
.ToHandleChecked();
result = BigInt::Add(isolate, result, temp).ToHandleChecked();
ASSIGN_RETURN_ON_EXCEPTION(
isolate, temp,
BigInt::Multiply(isolate, BigInt::FromInt64(isolate, addend.minutes),
BigInt::FromInt64(isolate, 1000000000)),
BigInt);
ASSIGN_RETURN_ON_EXCEPTION(
isolate, temp,
BigInt::Multiply(isolate, temp, BigInt::FromInt64(isolate, 60)), BigInt);
ASSIGN_RETURN_ON_EXCEPTION(isolate, result,
BigInt::Add(isolate, result, temp), BigInt);
// + (milliseconds) × 10^6
temp = BigInt::Multiply(isolate,
BigInt::FromNumber(
isolate, factory->NewNumber(addend.milliseconds))
.ToHandleChecked(),
BigInt::FromInt64(isolate, 1000000))
.ToHandleChecked();
result = BigInt::Add(isolate, result, temp).ToHandleChecked();
ASSIGN_RETURN_ON_EXCEPTION(
isolate, temp,
BigInt::Multiply(isolate, BigInt::FromInt64(isolate, addend.hours),
BigInt::FromInt64(isolate, 1000000000)),
BigInt);
ASSIGN_RETURN_ON_EXCEPTION(
isolate, temp,
BigInt::Multiply(isolate, temp, BigInt::FromInt64(isolate, 3600)),
BigInt);
ASSIGN_RETURN_ON_EXCEPTION(isolate, result,
BigInt::Add(isolate, result, temp), BigInt);
// + (seconds) × 10^9
temp = BigInt::Multiply(
isolate,
BigInt::FromNumber(isolate, factory->NewNumber(addend.seconds))
.ToHandleChecked(),
BigInt::FromInt64(isolate, 1000000000))
.ToHandleChecked();
result = BigInt::Add(isolate, result, temp).ToHandleChecked();
// + (minutes) × 60 × 10^9.
temp = BigInt::Multiply(
isolate,
BigInt::FromNumber(isolate, factory->NewNumber(addend.minutes))
.ToHandleChecked(),
BigInt::FromInt64(isolate, 60000000000))
.ToHandleChecked();
result = BigInt::Add(isolate, result, temp).ToHandleChecked();
// + (hours) × 3600 × 10^9.
temp = BigInt::Multiply(
isolate,
BigInt::FromNumber(isolate, factory->NewNumber(addend.hours))
.ToHandleChecked(),
BigInt::FromInt64(isolate, 3600000000000))
.ToHandleChecked();
result = BigInt::Add(isolate, result, temp).ToHandleChecked();
// 3. If ! IsValidEpochNanoseconds(result) is false, throw a RangeError
// exception.

View File

@ -583,9 +583,7 @@
'intl402/Temporal/Calendar/prototype/yearMonthFromFields/order-of-operations': [FAIL],
'intl402/Temporal/Duration/compare/relativeto-hour': [FAIL],
'built-ins/Temporal/PlainTime/prototype/equals/argument-string-no-implicit-midnight': [FAIL],
'built-ins/Temporal/Duration/prototype/add/nanoseconds-is-number-max-value-1': [FAIL],
'built-ins/Temporal/Duration/prototype/round/total-duration-nanoseconds-too-large-with-zoned-datetime': [PASS, FAIL],
'built-ins/Temporal/Duration/prototype/subtract/nanoseconds-is-number-max-value-1': [FAIL],
'built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-with-fractional-days-different-sign': [FAIL],
'built-ins/Temporal/Duration/prototype/total/relativeto-zoneddatetime-with-fractional-days': [FAIL],
'built-ins/Temporal/PlainTime/prototype/add/argument-string-duration-too-large': [FAIL],
@ -593,8 +591,6 @@
'intl402/Temporal/TimeZone/prototype/getNextTransition/subtract-second-and-nanosecond-from-last-transition': [FAIL],
'intl402/Temporal/TimeZone/prototype/getPreviousTransition/nanoseconds-subtracted-or-added-at-dst-transition': [FAIL],
'built-ins/Temporal/Instant/prototype/add/minimum-maximum-instant': [FAIL],
'built-ins/Temporal/Instant/prototype/subtract/minimum-maximum-instant': [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],
@ -629,10 +625,6 @@
# UBSan complain about static_cast<int32_t> from double in AddISODate()
'built-ins/Temporal/Calendar/prototype/dateAdd/argument-duration-years-and-months-number-max-value': [SKIP],
# Flaky and cause timeout sometimes
'built-ins/Temporal/Duration/prototype/add/days-is-number-max-value-with-zoneddatetime': [SKIP],
'built-ins/Temporal/Duration/prototype/subtract/days-is-number-max-value-with-zoneddatetime': [SKIP],
'harness/temporalHelpers-one-shift-time-zone': [SKIP],
'built-ins/Temporal/Instant/compare/instant-string': [FAIL],