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( ...@@ -5764,65 +5764,50 @@ Maybe<DurationRecord> DifferenceISODateTime(
// 2. Assert: ISODateTimeWithinLimits(y2, mon2, d2, h2, min2, s2, ms2, mus2, // 2. Assert: ISODateTimeWithinLimits(y2, mon2, d2, h2, min2, s2, ms2, mus2,
// ns2) is true. // ns2) is true.
DCHECK(ISODateTimeWithinLimits(isolate, date_time2)); DCHECK(ISODateTimeWithinLimits(isolate, date_time2));
DurationRecord result;
// 3. Let timeDifference be ! DifferenceTime(h1, min1, s1, ms1, mus1, ns1, h2, // 3. Let timeDifference be ! DifferenceTime(h1, min1, s1, ms1, mus1, ns1, h2,
// min2, s2, ms2, mus2, ns2). // min2, s2, ms2, mus2, ns2).
TimeDurationRecord time_difference; TimeDurationRecord time_difference =
MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE( DifferenceTime(isolate, date_time1.time, date_time2.time).ToChecked();
isolate, time_difference,
DifferenceTime(isolate, date_time1.time, date_time2.time),
Nothing<DurationRecord>());
result.time_duration = time_difference;
result.time_duration.days = 0;
// 4. Let timeSign be ! DurationSign(0, 0, 0, timeDifference.[[Days]], // 4. Let timeSign be ! DurationSign(0, 0, 0, 0, timeDifference.[[Hours]],
// timeDifference.[[Hours]], timeDifference.[[Minutes]], // timeDifference.[[Minutes]], timeDifference.[[Seconds]],
// timeDifference.[[Seconds]], timeDifference.[[Milliseconds]], // timeDifference.[[Milliseconds]], timeDifference.[[Microseconds]],
// timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]]). // timeDifference.[[Nanoseconds]]).
time_difference.days = 0;
double time_sign = DurationSign(isolate, {0, 0, 0, time_difference}); double time_sign = DurationSign(isolate, {0, 0, 0, time_difference});
// 5. Let dateSign be ! CompareISODate(y2, mon2, d2, y1, mon1, d1). // 5. Let dateSign be ! CompareISODate(y2, mon2, d2, y1, mon1, d1).
double date_sign = CompareISODate(date_time2.date, date_time1.date); double date_sign = CompareISODate(date_time2.date, date_time1.date);
// 6. Let balanceResult be ! BalanceISODate(y1, mon1, d1 +
// timeDifference.[[Days]]). // 6. Let adjustedDate be CreateISODateRecord(y1, mon1, d1).
DateRecordCommon balanced = BalanceISODate( DateRecordCommon adjusted_date = date_time1.date;
isolate, CHECK(IsValidISODate(isolate, adjusted_date));
{date_time1.date.year, date_time1.date.month,
date_time1.date.day + static_cast<int32_t>(time_difference.days)});
// 7. If timeSign is -dateSign, then // 7. If timeSign is -dateSign, then
if (time_sign == -date_sign) { if (time_sign == -date_sign) {
// a. Set balanceResult be ! BalanceISODate(balanceResult.[[Year]], adjusted_date.day -= time_sign;
// balanceResult.[[Month]], balanceResult.[[Day]] - timeSign). // a. Set adjustedDate to BalanceISODate(adjustedDate.[[Year]],
balanced.day -= time_sign; // adjustedDate.[[Month]], adjustedDate.[[Day]] - timeSign).
balanced = BalanceISODate(isolate, balanced); adjusted_date = BalanceISODate(isolate, adjusted_date);
// b. Set timeDifference to ? BalanceDuration(-timeSign, // b. Set timeDifference to ! BalanceDuration(-timeSign,
// timeDifference.[[Hours]], timeDifference.[[Minutes]], // timeDifference.[[Hours]], timeDifference.[[Minutes]],
// timeDifference.[[Seconds]], timeDifference.[[Milliseconds]], // timeDifference.[[Seconds]], timeDifference.[[Milliseconds]],
// timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]], // timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]],
// largestUnit). // largestUnit).
time_difference.days = -time_sign;
MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE( time_difference =
isolate, result.time_duration, BalanceDuration(isolate, largest_unit, time_difference, method_name)
BalanceDuration( .ToChecked();
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>());
} }
// 8. Let date1 be ? CreateTemporalDate(balanceResult.[[Year]],
// balanceResult.[[Month]], balanceResult.[[Day]], calendar). // 8. Let date1 be ! CreateTemporalDate(adjustedDate.[[Year]],
Handle<JSTemporalPlainDate> date1; // adjustedDate.[[Month]], adjustedDate.[[Day]], calendar).
ASSIGN_RETURN_ON_EXCEPTION_VALUE( Handle<JSTemporalPlainDate> date1 =
isolate, date1, CreateTemporalDate(isolate, balanced, calendar), CreateTemporalDate(isolate, adjusted_date, calendar).ToHandleChecked();
Nothing<DurationRecord>());
// 9. Let date2 be ? CreateTemporalDate(y2, mon2, d2, calendar). // 9. Let date2 be ! CreateTemporalDate(y2, mon2, d2, calendar).
Handle<JSTemporalPlainDate> date2; Handle<JSTemporalPlainDate> date2 =
ASSIGN_RETURN_ON_EXCEPTION_VALUE( CreateTemporalDate(isolate, date_time2.date, calendar).ToHandleChecked();
isolate, date2, CreateTemporalDate(isolate, date_time2.date, calendar),
Nothing<DurationRecord>());
// 10. Let dateLargestUnit be ! LargerOfTwoTemporalUnits("day", largestUnit). // 10. Let dateLargestUnit be ! LargerOfTwoTemporalUnits("day", largestUnit).
Unit date_largest_unit = LargerOfTwoTemporalUnits(Unit::kDay, largest_unit); Unit date_largest_unit = LargerOfTwoTemporalUnits(Unit::kDay, largest_unit);
...@@ -5845,30 +5830,23 @@ Maybe<DurationRecord> DifferenceISODateTime( ...@@ -5845,30 +5830,23 @@ Maybe<DurationRecord> DifferenceISODateTime(
// timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]], // timeDifference.[[Microseconds]], timeDifference.[[Nanoseconds]],
// largestUnit). // largestUnit).
TimeDurationRecord balance_result; time_difference.days = date_difference->days().Number();
MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE( MAYBE_ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, balance_result, isolate, time_difference,
BalanceDuration( BalanceDuration(isolate, largest_unit, time_difference, method_name),
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),
Nothing<DurationRecord>()); Nothing<DurationRecord>());
result.time_duration = balance_result; // 14. Return ! CreateDurationRecord(dateDifference.[[Years]],
// 14. Return the Record { [[Years]]: dateDifference.[[Years]], [[Months]]: // dateDifference.[[Months]], dateDifference.[[Weeks]],
// dateDifference.[[Months]], [[Weeks]]: dateDifference.[[Weeks]], [[Days]]: // balanceResult.[[Days]], balanceResult.[[Hours]], balanceResult.[[Minutes]],
// balanceResult.[[Days]], [[Hours]]: balanceResult.[[Hours]], [[Minutes]]: // balanceResult.[[Seconds]], balanceResult.[[Milliseconds]],
// balanceResult.[[Minutes]], [[Seconds]]: balanceResult.[[Seconds]], // balanceResult.[[Microseconds]], balanceResult.[[Nanoseconds]]).
// [[Milliseconds]]: balanceResult.[[Milliseconds]], [[Microseconds]]:
// balanceResult.[[Microseconds]], [[Nanoseconds]]: return Just(CreateDurationRecord(
// balanceResult.[[Nanoseconds]] }. isolate, {date_difference->years().Number(),
result.years = date_difference->years().Number(); date_difference->months().Number(),
result.months = date_difference->months().Number(); date_difference->weeks().Number(), time_difference})
result.weeks = date_difference->weeks().Number(); .ToChecked());
return Just(result);
} }
// #sec-temporal-addinstant // #sec-temporal-addinstant
......
...@@ -466,12 +466,7 @@ ...@@ -466,12 +466,7 @@
'built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-multiple-offsets': [FAIL], 'built-ins/Temporal/Now/zonedDateTimeISO/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/Now/zonedDateTime/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/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/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/PlainTime/prototype/toZonedDateTime/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/TimeZone/from/timezone-string-multiple-offsets': [FAIL], 'built-ins/Temporal/TimeZone/from/timezone-string-multiple-offsets': [FAIL],
'built-ins/Temporal/ZonedDateTime/compare/zoneddatetime-string': [FAIL], 'built-ins/Temporal/ZonedDateTime/compare/zoneddatetime-string': [FAIL],
...@@ -507,19 +502,10 @@ ...@@ -507,19 +502,10 @@
'built-ins/Temporal/PlainTime/prototype/until/argument-string-no-implicit-midnight': [FAIL], '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/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/round/rounding-direction': [FAIL],
'built-ins/Temporal/Instant/prototype/toString/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-ceil-basic': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/since/roundingmode-floor-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-ceil-basic': [FAIL],
'built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor-basic': [FAIL], 'built-ins/Temporal/PlainDateTime/prototype/until/roundingmode-floor-basic': [FAIL],
'built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-direction': [FAIL], 'built-ins/Temporal/ZonedDateTime/prototype/toString/rounding-direction': [FAIL],
...@@ -598,7 +584,6 @@ ...@@ -598,7 +584,6 @@
'intl402/Temporal/Duration/compare/relativeto-hour': [FAIL], 'intl402/Temporal/Duration/compare/relativeto-hour': [FAIL],
'built-ins/Temporal/PlainTime/prototype/equals/argument-string-no-implicit-midnight': [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/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/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/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-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