fix: Boolean 构造器对象臂按 B.3.4 特判 DDA 宿主对象为 falsy

This commit is contained in:
2026-09-26 21:26:11 +00:00
parent 631d430772
commit ad6874cd23
2 changed files with 35 additions and 1 deletions
@@ -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<JsValue, String> {
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({})"));
}