feat: Date 严格 ISO 解析与 6 位年字符串输出

This commit is contained in:
2026-10-15 15:51:40 +00:00
parent f0b0dda887
commit d4d5b578de
14 changed files with 1012 additions and 266 deletions
+14 -5
View File
@@ -543,7 +543,7 @@ pub fn abstract_eq<H: VmHost>(lhs: JsValue, rhs: JsValue, host: &mut H) -> Resul
} else {
rhs
};
let prim = to_primitive(lhs, ToPrimitiveHint::Default, host)?;
let prim = to_primitive(lhs, ToPrimitiveHint::Number, host)?;
abstract_eq(prim, rhs, host)
}
(
@@ -556,7 +556,7 @@ pub fn abstract_eq<H: VmHost>(lhs: JsValue, rhs: JsValue, host: &mut H) -> Resul
} else {
lhs
};
let prim = to_primitive(rhs, ToPrimitiveHint::Default, host)?;
let prim = to_primitive(rhs, ToPrimitiveHint::Number, host)?;
abstract_eq(lhs, prim, host)
}
// 其余组合不相等(含 null/undefined 与其它类型;Object/Object 已由同类型分支处理)。
@@ -872,13 +872,22 @@ pub enum ToPrimitiveHint {
}
impl ToPrimitiveHint {
/// OrdinaryToPrimitive 方法名顺序提示:`Default`/`Number` → "number",`String` → "string"。
/// 传给 `@@toPrimitive` 的 hint 字符串:`String` → "string",`Default` → "default",
/// `Number` → "number"。
pub fn as_str(self) -> &'static str {
match self {
ToPrimitiveHint::String => "string",
ToPrimitiveHint::Default | ToPrimitiveHint::Number => "number",
ToPrimitiveHint::Default => "default",
ToPrimitiveHint::Number => "number",
}
}
/// OrdinaryToPrimitive 回退方法序:`String` 先试 `toString`,
/// `Default`/`Number` 先试 `valueOf`。
#[inline]
pub fn prefer_string(self) -> bool {
self == ToPrimitiveHint::String
}
}
/// ToPrimitive(input, hint) per ECMA-262 §7.1.1.
@@ -890,7 +899,7 @@ pub fn to_primitive<H: VmHost>(val: JsValue, hint: ToPrimitiveHint, host: &mut H
if !val.is_object() {
return Ok(val);
}
host.coerce_primitive_bounded(val, hint == ToPrimitiveHint::String)
host.coerce_primitive_bounded(val, hint)
}
/// 带完整对象强制转换的 ToNumber(input):对象经 ToPrimitive(number hint)
+3 -1
View File
@@ -311,7 +311,9 @@ pub trait VmHost {
// 查找 / 强制转换
fn lookup_str(&self, val: JsValue) -> Option<String>;
fn coerce_primitive_bounded(&mut self, value: JsValue, prefer_string: bool) -> Result<JsValue, String>;
fn coerce_primitive_bounded(
&mut self, value: JsValue, hint: crate::ToPrimitiveHint,
) -> Result<JsValue, String>;
fn coerce_number_bounded(&mut self, value: JsValue) -> Result<f64, String>;
// 调用基础设施