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