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

[Temporal] Fix bug in DifferenceTemporalPlainDateTime

The days is passing incorrectly between calls.
Spec text:
https://tc39.es/proposal-temporal/#sec-temporal-differencetemporalplaindatetime

Bug: v8:11544
Change-Id: If818d0f42bdd3260e68eef2c6aba1c3781632c93
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3857869
Commit-Queue: Frank Tang <ftang@chromium.org>
Reviewed-by: 's avatarAdam Klein <adamk@chromium.org>
Cr-Commit-Position: refs/heads/main@{#83046}
parent edb902d9
......@@ -5764,65 +5764,50 @@ Maybe<DurationRecord> DifferenceISODateTime(
// 2. Assert: ISODateTimeWithinLimits(y2, mon2, d2, h2, min2, s2, ms2, mus2,
// ns2) is true.
DCHECK(ISODateTimeWithinLimits(isolate, date_time2));
DurationRecord result;
// 3. Let timeDifference be ! DifferenceTime(h1, min1, s1, ms1, mus1, ns1, h2,
// min2, s2, ms2, mus2, ns2).
TimeDurationRecord time_difference;
MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, time_difference,
DifferenceTime(isolate, date_time1.time, date_time2.time),
Nothing<DurationRecord>());
result.time_duration = time_difference;
result.time_duration.days = 0;
TimeDurationRecord time_difference =
DifferenceTime(isolate, date_time1.time, date_time2.time).ToChecked();
// 4. Let timeSign be ! DurationSign(0, 0, 0, timeDifference.[[Days]],
// timeDifference.[[Hours]], timeDifference.[[Minutes]],
// timeDifference.[[Seconds]], timeDifference.[[Milliseconds]],
// timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]]).
// 4. Let timeSign be ! DurationSign(0, 0, 0, 0, timeDifference.[[Hours]],
// timeDifference.[[Minutes]], timeDifference.[[Seconds]],
// timeDifference.[[Milliseconds]], timeDifference.[[Microseconds]],
// timeDifference.[[Nanoseconds]]).
time_difference.days = 0;
double time_sign = DurationSign(isolate, {0, 0, 0, time_difference});
// 5. Let dateSign be ! CompareISODate(y2, mon2, d2, y1, mon1, d1).
double date_sign = CompareISODate(date_time2.date, date_time1.date);
// 6. Let balanceResult be ! BalanceISODate(y1, mon1, d1 +
// timeDifference.[[Days]]).
DateRecordCommon balanced = BalanceISODate(
isolate,
{date_time1.date.year, date_time1.date.month,
date_time1.date.day + static_cast<int32_t>(time_difference.days)});
// 6. Let adjustedDate be CreateISODateRecord(y1, mon1, d1).
DateRecordCommon adjusted_date = date_time1.date;
CHECK(IsValidISODate(isolate, adjusted_date));
// 7. If timeSign is -dateSign, then
if (time_sign == -date_sign) {
// a. Set balanceResult be ! BalanceISODate(balanceResult.[[Year]],
// balanceResult.[[Month]], balanceResult.[[Day]] - timeSign).
balanced.day -= time_sign;
balanced = BalanceISODate(isolate, balanced);
// b. Set timeDifference to ? BalanceDuration(-timeSign,
adjusted_date.day -= time_sign;
// a. Set adjustedDate to BalanceISODate(adjustedDate.[[Year]],
// adjustedDate.[[Month]], adjustedDate.[[Day]] - timeSign).
adjusted_date = BalanceISODate(isolate, adjusted_date);
// b. Set timeDifference to ! BalanceDuration(-timeSign,
// timeDifference.[[Hours]], timeDifference.[[Minutes]],
// timeDifference.[[Seconds]], timeDifference.[[Milliseconds]],
// timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]],
// largestUnit).
MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, result.time_duration,
BalanceDuration(
isolate, largest_unit,
{-time_sign, time_difference.hours, time_difference.minutes,
time_difference.seconds, time_difference.milliseconds,
time_difference.microseconds, time_difference.nanoseconds},
method_name),
Nothing<DurationRecord>());
time_difference.days = -time_sign;
time_difference =
BalanceDuration(isolate, largest_unit, time_difference, method_name)
.ToChecked();
}
// 8. Let date1 be ? CreateTemporalDate(balanceResult.[[Year]],
// balanceResult.[[Month]], balanceResult.[[Day]], calendar).
Handle<JSTemporalPlainDate> date1;
ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, date1, CreateTemporalDate(isolate, balanced, calendar),
Nothing<DurationRecord>());
// 9. Let date2 be ? CreateTemporalDate(y2, mon2, d2, calendar).
Handle<JSTemporalPlainDate> date2;
ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, date2, CreateTemporalDate(isolate, date_time2.date, calendar),
Nothing<DurationRecord>());
// 8. Let date1 be ! CreateTemporalDate(adjustedDate.[[Year]],
// adjustedDate.[[Month]], adjustedDate.[[Day]], calendar).
Handle<JSTemporalPlainDate> date1 =
CreateTemporalDate(isolate, adjusted_date, calendar).ToHandleChecked();
// 9. Let date2 be ! CreateTemporalDate(y2, mon2, d2, calendar).
Handle<JSTemporalPlainDate> date2 =
CreateTemporalDate(isolate, date_time2.date, calendar).ToHandleChecked();
// 10. Let dateLargestUnit be ! LargerOfTwoTemporalUnits("day", largestUnit).
Unit date_largest_unit = LargerOfTwoTemporalUnits(Unit::kDay, largest_unit);
......@@ -5845,30 +5830,23 @@ Maybe<DurationRecord> DifferenceISODateTime(
// timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]],
// largestUnit).
TimeDurationRecord balance_result;
time_difference.days = date_difference->days().Number();
MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, balance_result,
BalanceDuration(
isolate, largest_unit,
{date_difference->days().Number(), time_difference.hours,
time_difference.minutes, time_difference.seconds,
time_difference.milliseconds, time_difference.microseconds,
time_difference.nanoseconds},
method_name),
isolate, time_difference,
BalanceDuration(isolate, largest_unit, time_difference, method_name),
Nothing<DurationRecord>());
result.time_duration = balance_result;
// 14. Return the Record { [[Years]]: dateDifference.[[Years]], [[Months]]:
// dateDifference.[[Months]], [[Weeks]]: dateDifference.[[Weeks]], [[Days]]:
// balanceResult.[[Days]], [[Hours]]: balanceResult.[[Hours]], [[Minutes]]:
// balanceResult.[[Minutes]], [[Seconds]]: balanceResult.[[Seconds]],
// [[Milliseconds]]: balanceResult.[[Milliseconds]], [[Microseconds]]:
// balanceResult.[[Microseconds]], [[Nanoseconds]]:
// balanceResult.[[Nanoseconds]] }.
result.years = date_difference->years().Number();
result.months = date_difference->months().Number();
result.weeks = date_difference->weeks().Number();
return Just(result);
// 14. Return ! CreateDurationRecord(dateDifference.[[Years]],
// dateDifference.[[Months]], dateDifference.[[Weeks]],
// balanceResult.[[Days]], balanceResult.[[Hours]], balanceResult.[[Minutes]],
// balanceResult.[[Seconds]], balanceResult.[[Milliseconds]],
// balanceResult.[[Microseconds]], balanceResult.[[Nanoseconds]]).
return Just(CreateDurationRecord(
isolate, {date_difference->years().Number(),
date_difference->months().Number(),
date_difference->weeks().Number(), time_difference})
.ToChecked());
}
// #sec-temporal-addinstant
......
......@@ -466,12 +466,7 @@
'built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/Now/zonedDateTime/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/PlainDate/prototype/toZonedDateTime/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/since/argument-zoneddatetime-negative-epochnanoseconds': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/since/balance-negative-duration': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/toZonedDateTime/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/argument-zoneddatetime-negative-epochnanoseconds': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/balance': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/balance-negative-duration': [FAIL],
'built-ins/Temporal/PlainTime/prototype/toZonedDateTime/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/TimeZone/from/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/ZonedDateTime/compare/zoneddatetime-string': [FAIL],
......@@ -507,19 +502,10 @@
'built-ins/Temporal/PlainTime/prototype/until/argument-string-no-implicit-midnight': [FAIL],
'built-ins/Temporal/ZonedDateTime/prototype/withPlainTime/argument-string-no-implicit-midnight': [FAIL],
'built-ins/Temporal/PlainDateTime/datetime-math': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/casts-argument': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/returns-days': [FAIL],
'built-ins/Temporal/Instant/prototype/round/rounding-direction': [FAIL],
'built-ins/Temporal/Instant/prototype/toString/rounding-direction': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/since/argument-object': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/since/argument-string': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/since/returns-days': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-ceil-basic': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-floor-basic': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/argument-object': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/argument-string': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-ceil-basic': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor-basic': [FAIL],
'built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-direction': [FAIL],
......@@ -598,7 +584,6 @@
'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/throws-in-balance-duration-when-sign-mismatched-with-zoned-date-time': [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],
......
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