diff --git a/crates/oxide_emit/src/expr/operator/fold.rs b/crates/oxide_emit/src/expr/operator/fold.rs index e5e947cc..d3a7b27c 100644 --- a/crates/oxide_emit/src/expr/operator/fold.rs +++ b/crates/oxide_emit/src/expr/operator/fold.rs @@ -9,9 +9,7 @@ use oxide_bytecode::module::Constant; use oxide_parser::{BinaryOperator, Expression, UnaryOperator}; -use oxide_runtime_api::{ - abstract_eq_primitives, relational_compare, strict_equality, to_int32, to_number, to_uint32, -}; +use oxide_runtime_api::{abstract_eq_primitives, relational_compare, strict_equality, to_int32, to_number, to_uint32}; use oxide_types::value::JsValue; use crate::is_int_literal; diff --git a/crates/oxide_emit/tests/emit_ir_tests.rs b/crates/oxide_emit/tests/emit_ir_tests.rs index a84c8f05..6c459905 100644 --- a/crates/oxide_emit/tests/emit_ir_tests.rs +++ b/crates/oxide_emit/tests/emit_ir_tests.rs @@ -419,12 +419,6 @@ fn binary_literal_fold_entry() { let ir = emit_ir("var a = 2 * 3; var b = 1 + 2;"); assert_eq!(count_op(&ir.insts, OpCode::MUL), 0, "双字面量乘法应折叠,MUL 计数为 0"); assert_eq!(count_op(&ir.insts, OpCode::ADD), 0, "双字面量加法应折叠,ADD 计数为 0"); - assert!( - ir.constants.contains(&Constant::Number(6.0)), - "常量池应含乘法折值 Number(6.0)" - ); - assert!( - ir.constants.contains(&Constant::Int(3)), - "常量池应含加法折值 Int(3)" - ); + assert!(ir.constants.contains(&Constant::Number(6.0)), "常量池应含乘法折值 Number(6.0)"); + assert!(ir.constants.contains(&Constant::Int(3)), "常量池应含加法折值 Int(3)"); } diff --git a/crates/oxide_emit/tests/fold_tests.rs b/crates/oxide_emit/tests/fold_tests.rs index 37c7666b..deea3030 100644 --- a/crates/oxide_emit/tests/fold_tests.rs +++ b/crates/oxide_emit/tests/fold_tests.rs @@ -128,8 +128,7 @@ fn fold_deterministic() { let mut fingerprints: Vec<(String, String)> = Vec::new(); for _ in 0..8 { let alloc = oxide_parser::Allocator::default(); - let program = - oxide_parser::parse(&alloc, src).unwrap_or_else(|e| panic!("parse 失败 {src:?}: {e:?}")); + let program = oxide_parser::parse(&alloc, src).unwrap_or_else(|e| panic!("parse 失败 {src:?}: {e:?}")); let ir = Emitter::new() .emit_program(&program, false, false) .unwrap_or_else(|e| panic!("emit 失败 {src:?}: {e}")); diff --git a/crates/oxide_runtime_api/src/coercion.rs b/crates/oxide_runtime_api/src/coercion.rs index 74b0a3e1..38edd926 100644 --- a/crates/oxide_runtime_api/src/coercion.rs +++ b/crates/oxide_runtime_api/src/coercion.rs @@ -473,12 +473,8 @@ pub fn abstract_eq_primitives(lhs: JsValue, rhs: JsValue) -> bool { // Number 混合表示(int vs double):同属 ECMAScript Number,按严格相等。 (JsType::Int | JsType::Double, JsType::Int | JsType::Double) => strict_equality(lhs, rhs), // BigInt 与 Number:转 f64 比较(精度内精确;超出精度近似)。 - (JsType::BigInt, JsType::Int | JsType::Double) => { - bigint_to_f64(unsafe { bigint_data(lhs) }) == to_number(rhs) - } - (JsType::Int | JsType::Double, JsType::BigInt) => { - to_number(lhs) == bigint_to_f64(unsafe { bigint_data(rhs) }) - } + (JsType::BigInt, JsType::Int | JsType::Double) => bigint_to_f64(unsafe { bigint_data(lhs) }) == to_number(rhs), + (JsType::Int | JsType::Double, JsType::BigInt) => to_number(lhs) == bigint_to_f64(unsafe { bigint_data(rhs) }), // BigInt 与 String:字符串解析为数字后比较(lossy 文本口径,见 to_number)。 (JsType::BigInt, JsType::String) => { let r = parse_js_number(&unsafe { string_data(rhs) }); @@ -536,7 +532,10 @@ pub fn abstract_eq(lhs: JsValue, rhs: JsValue, host: &mut H) -> Resul // Object 与原始值:ToPrimitive 后重入。to_primitive 必返原始值, // 重入即收敛到原始值核心,与单次委托等价。 match (tl, tr) { - (JsType::Object, JsType::Int | JsType::Double | JsType::String | JsType::BigInt | JsType::Symbol | JsType::Bool) => { + ( + JsType::Object, + JsType::Int | JsType::Double | JsType::String | JsType::BigInt | JsType::Symbol | JsType::Bool, + ) => { let rhs = if tr == JsType::Bool { // Boolean 先 ToNumber(int(0/1) 轻量编码),与原始值核心 // 的 Boolean 重入口径一致。 @@ -547,7 +546,10 @@ pub fn abstract_eq(lhs: JsValue, rhs: JsValue, host: &mut H) -> Resul let prim = to_primitive(lhs, ToPrimitiveHint::Default, host)?; abstract_eq(prim, rhs, host) } - (JsType::Int | JsType::Double | JsType::String | JsType::BigInt | JsType::Symbol | JsType::Bool, JsType::Object) => { + ( + JsType::Int | JsType::Double | JsType::String | JsType::BigInt | JsType::Symbol | JsType::Bool, + JsType::Object, + ) => { let lhs = if tl == JsType::Bool { // 同上。 JsValue::int(lhs.as_bool() as i32) diff --git a/crates/oxide_runtime_api/src/lib.rs b/crates/oxide_runtime_api/src/lib.rs index 1a3ac4bf..654034e4 100644 --- a/crates/oxide_runtime_api/src/lib.rs +++ b/crates/oxide_runtime_api/src/lib.rs @@ -24,12 +24,11 @@ mod runtime_api_log; pub use coercion::{ abstract_eq, abstract_eq_primitives, bigint_data, bigint_to_f64, bigint_to_string, format_error_message, - js_number_to_string, - materialize_string_box, push_to_string, push_units_to, relational_compare, same_value, same_value_zero, - strict_equality, string_concat, string_value_eq, to_bigint_full, to_boolean, to_int32, to_integer_or_infinity, - to_length, to_number, to_number_full, to_object, to_primitive, to_string, to_string_for_string_constructor, - to_string_full, to_string_value_full, to_uint32, to_units_full, well_known_symbol_name, write_number_into, - ToPrimitiveHint, + js_number_to_string, materialize_string_box, push_to_string, push_units_to, relational_compare, same_value, + same_value_zero, strict_equality, string_concat, string_value_eq, to_bigint_full, to_boolean, to_int32, + to_integer_or_infinity, to_length, to_number, to_number_full, to_object, to_primitive, to_string, + to_string_for_string_constructor, to_string_full, to_string_value_full, to_uint32, to_units_full, + well_known_symbol_name, write_number_into, ToPrimitiveHint, }; pub use compiler_service::CompilerService; pub use event_target::{EventTargetState, ListenerEntry};