Skip to content

Commit 969b124

Browse files
committed
fix overflow bug
1 parent ea8ac98 commit 969b124

1 file changed

Lines changed: 42 additions & 2 deletions

File tree

src/builtins/core/zoneddatetime.rs

Lines changed: 42 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ impl ZonedDateTime {
529529
// 23. Let dateTimeResult be ? InterpretTemporalDateTimeFields(calendar, fields, overflow).
530530
let result_date = self.calendar.date_from_partial(
531531
&partial.date.with_fallback_zoneddatetime(self, provider)?,
532-
ArithmeticOverflow::Constrain,
532+
overflow,
533533
)?;
534534

535535
let original_iso = self.tz.get_iso_datetime_for(&self.instant, provider)?.time;
@@ -1272,7 +1272,9 @@ pub(crate) fn nanoseconds_to_formattable_offset_minutes(
12721272
mod tests {
12731273
use super::ZonedDateTime;
12741274
use crate::{
1275-
options::{DifferenceSettings, Disambiguation, OffsetDisambiguation, Unit},
1275+
options::{
1276+
ArithmeticOverflow, DifferenceSettings, Disambiguation, OffsetDisambiguation, Unit,
1277+
},
12761278
partial::{PartialDate, PartialTime, PartialZonedDateTime},
12771279
time::EpochNanoseconds,
12781280
tzdb::FsTzdbProvider,
@@ -1411,4 +1413,42 @@ mod tests {
14111413
assert_eq!(diff.microseconds(), 0);
14121414
assert_eq!(diff.nanoseconds(), 0);
14131415
}
1416+
1417+
// overflow-reject-throws.js
1418+
#[test]
1419+
fn overflow_reject_throws() {
1420+
// const zdt = new Temporal.PlainDateTime(1976, 11, 18, 15, 23, 30, 123, 456, 789).toZonedDateTime("UTC");
1421+
//
1422+
// const overflow = "reject";
1423+
// assert.throws(RangeError, () => zdt.with({ month: 29 }, { overflow }));
1424+
// assert.throws(RangeError, () => zdt.with({ day: 31 }, { overflow }));
1425+
// assert.throws(RangeError, () => zdt.with({ hour: 29 }, { overflow }));
1426+
// assert.throws(RangeError, () => zdt.with({ nanosecond: 9000 }, { overflow }));
1427+
1428+
let provider = &FsTzdbProvider::default();
1429+
1430+
let zdt =
1431+
ZonedDateTime::try_new(217178610123456789, Calendar::default(), TimeZone::default())
1432+
.unwrap();
1433+
1434+
let overflow = ArithmeticOverflow::Reject;
1435+
1436+
let result_2 = zdt.with(
1437+
PartialZonedDateTime {
1438+
date: PartialDate {
1439+
day: Some(31),
1440+
..Default::default()
1441+
},
1442+
time: PartialTime::default(),
1443+
offset: None,
1444+
timezone: None,
1445+
},
1446+
None,
1447+
None,
1448+
Some(overflow),
1449+
provider,
1450+
);
1451+
1452+
assert!(result_2.is_err()); // Fails
1453+
}
14141454
}

0 commit comments

Comments
 (0)