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)); }