mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-24 02:31:13 +08:00
fix: 修复空字符串转布尔值为真问题
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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] };
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user