mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-26 11:41:13 +08:00
fix: PlainTime 构造器负时间分量改抛 RangeError 不再饱和归零
This commit is contained in:
@@ -4625,12 +4625,26 @@ pub fn plain_time_constructor<H: VmHost>(vm: &mut H, args: &[u8]) -> NativeResul
|
|||||||
}
|
}
|
||||||
temporal_number_component(vm, raw)
|
temporal_number_component(vm, raw)
|
||||||
};
|
};
|
||||||
let hour = native_try!(get(1)) as u32;
|
// 负值在 u32 转换前检查:截断后为负的整分量(含负分数整数化为负)须先抛错,
|
||||||
let minute = native_try!(get(2)) as u32;
|
// 不能让 f64→u32 饱和把其静默归 0 而逃过范围检查。
|
||||||
let second = native_try!(get(3)) as u32;
|
let hour_value = native_try!(get(1));
|
||||||
let ms = native_try!(get(4)) as u32;
|
let minute_value = native_try!(get(2));
|
||||||
let us = native_try!(get(5)) as u32;
|
let second_value = native_try!(get(3));
|
||||||
let ns = native_try!(get(6)) as u32;
|
let ms_value = native_try!(get(4));
|
||||||
|
let us_value = native_try!(get(5));
|
||||||
|
let ns_value = native_try!(get(6));
|
||||||
|
if [hour_value, minute_value, second_value, ms_value, us_value, ns_value]
|
||||||
|
.iter()
|
||||||
|
.any(|value| *value < 0.0)
|
||||||
|
{
|
||||||
|
return NativeResult::Err(crate::error::create_range_error(vm, "invalid time component"));
|
||||||
|
}
|
||||||
|
let hour = hour_value as u32;
|
||||||
|
let minute = minute_value as u32;
|
||||||
|
let second = second_value as u32;
|
||||||
|
let ms = ms_value as u32;
|
||||||
|
let us = us_value as u32;
|
||||||
|
let ns = ns_value as u32;
|
||||||
if !valid_plain_time(hour, minute, second, ms, us, ns) {
|
if !valid_plain_time(hour, minute, second, ms, us, ns) {
|
||||||
return NativeResult::Err(crate::error::create_range_error(vm, "invalid time component"));
|
return NativeResult::Err(crate::error::create_range_error(vm, "invalid time component"));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3817,6 +3817,32 @@ fn plain_time_ctor_number_component_rejects_and_undefined_default() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn plain_time_ctor_negative_time_components_throw_range_error() {
|
||||||
|
let mut vm = Vm::new();
|
||||||
|
// 红形钉:六分量(时/分/秒/毫秒/微秒/纳秒)负值各一例均抛 RangeError,
|
||||||
|
// 消息复用既有范围错口径 "invalid time component"。
|
||||||
|
let r = eval(
|
||||||
|
&mut vm,
|
||||||
|
"(() => {
|
||||||
|
const kind = (fn) => { try { fn(); return 'no'; } catch (e) { return e.constructor.name + ':' + e.message; } };
|
||||||
|
return [
|
||||||
|
kind(() => new Temporal.PlainTime(-1, 0, 0, 0, 0, 0)),
|
||||||
|
kind(() => new Temporal.PlainTime(0, -1, 0, 0, 0, 0)),
|
||||||
|
kind(() => new Temporal.PlainTime(0, 0, -1, 0, 0, 0)),
|
||||||
|
kind(() => new Temporal.PlainTime(0, 0, 0, -1, 0, 0)),
|
||||||
|
kind(() => new Temporal.PlainTime(0, 0, 0, 0, -1, 0)),
|
||||||
|
kind(() => new Temporal.PlainTime(0, 0, 0, 0, 0, -1)),
|
||||||
|
].join('|');
|
||||||
|
})()",
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
assert_eq!(
|
||||||
|
str_val(&vm, r),
|
||||||
|
"RangeError:invalid time component|RangeError:invalid time component|RangeError:invalid time component|RangeError:invalid time component|RangeError:invalid time component|RangeError:invalid time component"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn plain_date_time_ctor_undefined_time_components_default() {
|
fn plain_date_time_ctor_undefined_time_components_default() {
|
||||||
let mut vm = Vm::new();
|
let mut vm = Vm::new();
|
||||||
|
|||||||
Reference in New Issue
Block a user