From ad6874cd23665e67ef87801032fe943725393e86 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Sat, 26 Sep 2026 21:26:11 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20Boolean=20=E6=9E=84=E9=80=A0=E5=99=A8?= =?UTF-8?q?=E5=AF=B9=E8=B1=A1=E8=87=82=E6=8C=89=20B.3.4=20=E7=89=B9?= =?UTF-8?q?=E5=88=A4=20DDA=20=E5=AE=BF=E4=B8=BB=E5=AF=B9=E8=B1=A1=E4=B8=BA?= =?UTF-8?q?=20falsy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_builtins/src/boolean.rs | 4 ++- crates/oxide_builtins/tests/boolean_tests.rs | 32 ++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 crates/oxide_builtins/tests/boolean_tests.rs diff --git a/crates/oxide_builtins/src/boolean.rs b/crates/oxide_builtins/src/boolean.rs index 924900c0..7dc08fb4 100644 --- a/crates/oxide_builtins/src/boolean.rs +++ b/crates/oxide_builtins/src/boolean.rs @@ -18,7 +18,9 @@ pub fn boolean_constructor(vm: &mut H, args: &[u8]) -> NativeResult { // SAFETY: arg 已确认是字符串值。 !unsafe { (*arg.as_string_ptr()).is_empty() } } else if arg.is_object() { - true + // [[IsHTMLDDA]] 宿主对象按 undefined 处理(B.3.4),falsy。 + // SAFETY: arg 已确认是对象值,借用即时消费。 + !unsafe { (*arg.as_js_object_ptr()).is_html_dda_obj() } } else if arg.is_int() { arg.as_int() != 0 } else if arg.is_double() { diff --git a/crates/oxide_builtins/tests/boolean_tests.rs b/crates/oxide_builtins/tests/boolean_tests.rs new file mode 100644 index 00000000..034c3ec5 --- /dev/null +++ b/crates/oxide_builtins/tests/boolean_tests.rs @@ -0,0 +1,32 @@ +use std::sync::Arc; + +use oxide_compiler::compiler::Compiler; +use oxide_types::value::JsValue; +use oxide_vm::vm::Vm; + +fn eval(source: &str) -> Result { + let allocator = oxide_parser::Allocator::default(); + let program = oxide_parser::parse(&allocator, source).map_err(|e| format!("Parse error: {:?}", e))?; + let module = Compiler::new().compile(&program).map_err(|e| format!("Compile error: {}", e))?; + let mut vm = Vm::new(); + vm.run(&Arc::new(module)) +} + +/// 求值一个应得布尔结果的表达式并断言其类型。 +fn eval_bool(source: &str) -> bool { + let result = eval(source).expect("eval should succeed"); + assert!(result.is_bool(), "expected boolean result, got {result:?}"); + result.as_bool() +} + +/// [[IsHTMLDDA]] 宿主对象按 undefined 处理(B.3.4),Boolean() 应返 false。 +#[test] +fn boolean_html_dda_is_falsy() { + assert!(!eval_bool("Boolean($262.IsHTMLDDA)")); +} + +/// 普通对象在 ToBoolean 下保持 truthy。 +#[test] +fn boolean_plain_object_is_truthy() { + assert!(eval_bool("Boolean({})")); +}