mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-24 02:31:13 +08:00
feat: Date 严格 ISO 解析与 6 位年字符串输出
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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>;
|
||||
|
||||
// 调用基础设施
|
||||
|
||||
Reference in New Issue
Block a user