From 6a88f6b363f4760806ff56644e71ddbe7a97d2e8 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Fri, 25 Sep 2026 14:33:57 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20Boolean=20=E6=9E=84=E9=80=A0=E5=99=A8?= =?UTF-8?q?=E8=A1=A5=E9=BD=90=20NaN=20=E4=B8=8E=20Symbol/BigInt=20?= =?UTF-8?q?=E7=9A=84=20ToBoolean=20=E5=88=A4=E5=AE=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_builtins/src/boolean.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/crates/oxide_builtins/src/boolean.rs b/crates/oxide_builtins/src/boolean.rs index 200134fa..924900c0 100644 --- a/crates/oxide_builtins/src/boolean.rs +++ b/crates/oxide_builtins/src/boolean.rs @@ -1,3 +1,4 @@ +use num_traits::Zero; use oxide_types::object::JsObject; use oxide_types::value::JsValue; @@ -21,7 +22,13 @@ pub fn boolean_constructor(vm: &mut H, args: &[u8]) -> NativeResult { } else if arg.is_int() { arg.as_int() != 0 } else if arg.is_double() { - arg.as_double() != 0.0 + // NaN 按规范为 falsy(isNaN 与 != 0.0 的判定顺序即 ToBoolean 语义)。 + !arg.as_double().is_nan() && arg.as_double() != 0.0 + } else if arg.is_symbol() { + true + } else if arg.is_bigint() { + // SAFETY: arg 已确认是 BigInt 值,其 box 存活至 full_reset。 + !unsafe { oxide_runtime_api::bigint_data(arg) }.is_zero() } else { false }