From 789ca29682b11149020c4b4722f622d14bd4b9c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=88=B1=E7=89=B9=E6=AF=8F=E7=BE=8A=E9=98=9F?= Date: Fri, 5 Jun 2026 19:51:02 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E4=B8=AD=E6=95=B4=E6=95=B0=E5=BC=BA=E8=BD=AC=E6=B5=AE?= =?UTF-8?q?=E7=82=B9=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_vm/src/coercion.rs | 10 +++++++++- crates/oxide_vm/src/vm.rs | 8 ++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/crates/oxide_vm/src/coercion.rs b/crates/oxide_vm/src/coercion.rs index babe3a2..bf05ae6 100644 --- a/crates/oxide_vm/src/coercion.rs +++ b/crates/oxide_vm/src/coercion.rs @@ -48,6 +48,9 @@ pub fn to_string(vm: &Vm, val: JsValue) -> String { "-Infinity".to_string() }; } + if d.is_finite() && d.fract() == 0.0 { + return (d as i64).to_string(); + } let mut buf = ryu::Buffer::new(); return buf.format(d).to_string(); } @@ -170,7 +173,12 @@ fn strict_double_eq(a: f64, b: f64) -> bool { a == b } -pub fn relational_compare(lhs: JsValue, rhs: JsValue) -> Option { +pub fn relational_compare(vm: &Vm, lhs: JsValue, rhs: JsValue) -> Option { + if lhs.is_string() && rhs.is_string() { + let ls = vm.lookup_str(lhs).unwrap_or(""); + let rs = vm.lookup_str(rhs).unwrap_or(""); + return Some(ls < rs); + } let l = to_number(lhs); let r = to_number(rhs); if l.is_nan() || r.is_nan() { diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index b3bfba5..9fb75de 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -205,22 +205,22 @@ impl Vm { } OpCode::LT => { - let rel = coercion::relational_compare(self.regs[a], self.regs[b]); + let rel = coercion::relational_compare(self, self.regs[a], self.regs[b]); self.regs[rd] = JsValue::bool(rel.unwrap_or(false)); } OpCode::GT => { - let rel = coercion::relational_compare(self.regs[b], self.regs[a]); + let rel = coercion::relational_compare(self, self.regs[b], self.regs[a]); self.regs[rd] = JsValue::bool(rel.unwrap_or(false)); } OpCode::LTE => { - let rel = coercion::relational_compare(self.regs[b], self.regs[a]); + let rel = coercion::relational_compare(self, self.regs[b], self.regs[a]); self.regs[rd] = JsValue::bool(!rel.unwrap_or(true)); } OpCode::GTE => { - let rel = coercion::relational_compare(self.regs[a], self.regs[b]); + let rel = coercion::relational_compare(self, self.regs[a], self.regs[b]); self.regs[rd] = JsValue::bool(!rel.unwrap_or(true)); }