From b1334f6321ac595b72233ecbf8121d6462ac58fe 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 23:25:18 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9C=80=E5=B0=8F=E5=8C=96=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E6=96=B9=E6=B3=95=E4=BE=9D=E8=B5=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates/oxide_vm/src/coercion.rs | 17 ++++++++++++----- crates/oxide_vm/src/vm.rs | 28 ++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/crates/oxide_vm/src/coercion.rs b/crates/oxide_vm/src/coercion.rs index c000a12..d267562 100644 --- a/crates/oxide_vm/src/coercion.rs +++ b/crates/oxide_vm/src/coercion.rs @@ -1,4 +1,5 @@ use crate::vm::Vm; +use oxide_kernel::string_forge::StringForge; use oxide_types::object::JsObject; use oxide_types::shape::EMPTY_SHAPE_ID; use oxide_types::value::JsValue; @@ -32,7 +33,7 @@ pub fn to_number(val: JsValue) -> f64 { f64::NAN } -pub fn to_string(vm: &Vm, val: JsValue) -> String { +pub fn to_string(string_forge: &StringForge, val: JsValue) -> String { if val.is_int() { return val.as_int().to_string(); } @@ -64,7 +65,9 @@ pub fn to_string(vm: &Vm, val: JsValue) -> String { return "undefined".to_string(); } if val.is_string() { - return vm.lookup_str(val).unwrap_or_default(); + return string_forge + .lookup(val.as_string_index()) + .unwrap_or_default(); } if val.is_object() { panic_to_object(); @@ -173,10 +176,14 @@ fn strict_double_eq(a: f64, b: f64) -> bool { a == b } -pub fn relational_compare(vm: &Vm, lhs: JsValue, rhs: JsValue) -> Option { +pub fn relational_compare(string_forge: &StringForge, lhs: JsValue, rhs: JsValue) -> Option { if lhs.is_string() && rhs.is_string() { - let ls = vm.lookup_str(lhs).unwrap_or_default(); - let rs = vm.lookup_str(rhs).unwrap_or_default(); + let ls = string_forge + .lookup(lhs.as_string_index()) + .unwrap_or_default(); + let rs = string_forge + .lookup(rhs.as_string_index()) + .unwrap_or_default(); return Some(ls < rs); } let l = to_number(lhs); diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index 43b300f..dcf080a 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -149,8 +149,8 @@ impl Vm { let lhs = self.regs[a]; let rhs = self.regs[b]; if lhs.is_string() || rhs.is_string() { - let ls = coercion::to_string(self, lhs); - let rs = coercion::to_string(self, rhs); + let ls = coercion::to_string(self.kernel.string_forge().as_ref(), lhs); + let rs = coercion::to_string(self.kernel.string_forge().as_ref(), rhs); let concat = format!("{ls}{rs}"); self.regs[rd] = self.intern(&concat); } else { @@ -200,22 +200,38 @@ impl Vm { } OpCode::LT => { - let rel = coercion::relational_compare(self, self.regs[a], self.regs[b]); + let rel = coercion::relational_compare( + self.kernel.string_forge().as_ref(), + self.regs[a], + self.regs[b], + ); self.regs[rd] = JsValue::bool(rel.unwrap_or(false)); } OpCode::GT => { - let rel = coercion::relational_compare(self, self.regs[b], self.regs[a]); + let rel = coercion::relational_compare( + self.kernel.string_forge().as_ref(), + self.regs[b], + self.regs[a], + ); self.regs[rd] = JsValue::bool(rel.unwrap_or(false)); } OpCode::LTE => { - let rel = coercion::relational_compare(self, self.regs[b], self.regs[a]); + let rel = coercion::relational_compare( + self.kernel.string_forge().as_ref(), + self.regs[b], + self.regs[a], + ); self.regs[rd] = JsValue::bool(!rel.unwrap_or(true)); } OpCode::GTE => { - let rel = coercion::relational_compare(self, self.regs[a], self.regs[b]); + let rel = coercion::relational_compare( + self.kernel.string_forge().as_ref(), + self.regs[a], + self.regs[b], + ); self.regs[rd] = JsValue::bool(!rel.unwrap_or(true)); }