From 91946f3fe3b1cffb5138fbac9e4f213cec2d2d09 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Mon, 14 Sep 2026 13:40:32 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20PlainDateTime=20=E6=9E=84=E9=80=A0?= =?UTF-8?q?=E5=99=A8=E6=98=BE=E5=BC=8F=20undefined=20=E6=97=B6=E9=97=B4?= =?UTF-8?q?=E5=88=86=E9=87=8F=E5=8F=96=E9=BB=98=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_builtins/src/temporal.rs | 6 +++++ .../oxide_vm/tests/builtins_temporal_tests.rs | 27 +++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/crates/oxide_builtins/src/temporal.rs b/crates/oxide_builtins/src/temporal.rs index eeed8f0f..2eb1d28b 100644 --- a/crates/oxide_builtins/src/temporal.rs +++ b/crates/oxide_builtins/src/temporal.rs @@ -5111,6 +5111,12 @@ pub fn plain_date_time_constructor(vm: &mut H, args: &[u8]) -> Native let mut component = |index: usize, default: f64| -> Result { if args.len() > index { let raw = vm.reg(args[index]); + // 时间分量(缺省臂为有限值):显式 undefined 与缺参同义,取缺省值; + // 日期分量无缺省臂(缺省值为 NaN),undefined 仍经 NaN 统一抛 + // RangeError。 + if raw.is_undefined() && default.is_finite() { + return Ok(default); + } temporal_option_number(vm, raw).map(f64::trunc) } else { Ok(default) diff --git a/crates/oxide_vm/tests/builtins_temporal_tests.rs b/crates/oxide_vm/tests/builtins_temporal_tests.rs index e3e4afb0..3347032a 100644 --- a/crates/oxide_vm/tests/builtins_temporal_tests.rs +++ b/crates/oxide_vm/tests/builtins_temporal_tests.rs @@ -3816,3 +3816,30 @@ fn plain_time_ctor_number_component_rejects_and_undefined_default() { "TypeError|TypeError|RangeError|RangeError|RangeError|0|01:00:00.001|02:00:00" ); } + +#[test] +fn plain_date_time_ctor_undefined_time_components_default() { + let mut vm = Vm::new(); + // 红形钉:显式 undefined 时间分量(时/分/秒/毫秒)与缺参同义取默认 0, + // 与全缺省构造等值;旧形为 RangeError。日期分量无缺省臂:undefined 仍抛 + // RangeError。 + let r = eval( + &mut vm, + "(() => { + const kind = (fn) => { try { fn(); return 'no'; } catch (e) { return e.constructor.name; } }; + return [ + new Temporal.PlainDateTime(2020, 1, 1, undefined, undefined, undefined).toString(), + new Temporal.PlainDateTime(2020, 1, 1, 10, undefined, undefined, 5, undefined, undefined).toString(), + new Temporal.PlainDateTime(2020, 1, 1).toString(), + kind(() => new Temporal.PlainDateTime(undefined, 1, 1)), + kind(() => new Temporal.PlainDateTime(2020, undefined, 1)), + kind(() => new Temporal.PlainDateTime(2020, 1, undefined)), + ].join('|'); + })()", + ) + .unwrap(); + assert_eq!( + str_val(&vm, r), + "2020-01-01T00:00:00|2020-01-01T10:00:00.005|2020-01-01T00:00:00|RangeError|RangeError|RangeError" + ); +}