From 1615f739d1fb5b24dd33e0be9e07a7f50abc5b18 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: Sat, 6 Jun 2026 14:16:34 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A9=BA=E5=AD=97?= =?UTF-8?q?=E7=AC=A6=E4=B8=B2=E8=BD=AC=E5=B8=83=E5=B0=94=E5=80=BC=E4=B8=BA?= =?UTF-8?q?=E7=9C=9F=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 | 7 +++++-- crates/oxide_vm/src/vm.rs | 15 ++++++++++----- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/crates/oxide_vm/src/coercion.rs b/crates/oxide_vm/src/coercion.rs index e07b811..d62f39b 100644 --- a/crates/oxide_vm/src/coercion.rs +++ b/crates/oxide_vm/src/coercion.rs @@ -81,7 +81,7 @@ pub fn to_string(string_forge: &StringForge, val: JsValue) -> String { String::new() } -pub fn to_boolean(val: JsValue) -> bool { +pub fn to_boolean(val: JsValue, string_forge: &StringForge) -> bool { if val.is_undefined() || val.is_null() { return false; } @@ -96,7 +96,10 @@ pub fn to_boolean(val: JsValue) -> bool { return !(d == 0.0 || d == -0.0 || d.is_nan()); } if val.is_string() { - return true; + let s = string_forge + .lookup(val.as_string_index()) + .unwrap_or_default(); + return !s.is_empty(); } if val.is_object() { return true; diff --git a/crates/oxide_vm/src/vm.rs b/crates/oxide_vm/src/vm.rs index e210187..f132a90 100644 --- a/crates/oxide_vm/src/vm.rs +++ b/crates/oxide_vm/src/vm.rs @@ -259,7 +259,8 @@ impl Vm { } OpCode::JMP_IF_FALSE => { - let cond = coercion::to_boolean(self.regs[rd]); + let cond = + coercion::to_boolean(self.regs[rd], self.kernel.string_forge().as_ref()); if !cond { let offset = opcode::offset16(instr) as isize; self.pc = ((self.pc as isize) + offset - 1) as usize; @@ -267,7 +268,8 @@ impl Vm { } OpCode::JMP_IF_TRUE => { - let cond = coercion::to_boolean(self.regs[rd]); + let cond = + coercion::to_boolean(self.regs[rd], self.kernel.string_forge().as_ref()); if cond { let offset = opcode::offset16(instr) as isize; self.pc = ((self.pc as isize) + offset - 1) as usize; @@ -547,17 +549,20 @@ impl Vm { } OpCode::NOT => { - let cond = coercion::to_boolean(self.regs[a]); + let cond = + coercion::to_boolean(self.regs[a], self.kernel.string_forge().as_ref()); self.regs[rd] = JsValue::bool(!cond); } OpCode::AND => { - let cond = coercion::to_boolean(self.regs[a]); + let cond = + coercion::to_boolean(self.regs[a], self.kernel.string_forge().as_ref()); self.regs[rd] = if cond { self.regs[b] } else { self.regs[a] }; } OpCode::OR => { - let cond = coercion::to_boolean(self.regs[a]); + let cond = + coercion::to_boolean(self.regs[a], self.kernel.string_forge().as_ref()); self.regs[rd] = if cond { self.regs[a] } else { self.regs[b] }; }