mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21: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()
|
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() {
|
if val.is_undefined() || val.is_null() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -96,7 +96,10 @@ pub fn to_boolean(val: JsValue) -> bool {
|
|||||||
return !(d == 0.0 || d == -0.0 || d.is_nan());
|
return !(d == 0.0 || d == -0.0 || d.is_nan());
|
||||||
}
|
}
|
||||||
if val.is_string() {
|
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() {
|
if val.is_object() {
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -259,7 +259,8 @@ impl Vm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
OpCode::JMP_IF_FALSE => {
|
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 {
|
if !cond {
|
||||||
let offset = opcode::offset16(instr) as isize;
|
let offset = opcode::offset16(instr) as isize;
|
||||||
self.pc = ((self.pc as isize) + offset - 1) as usize;
|
self.pc = ((self.pc as isize) + offset - 1) as usize;
|
||||||
@@ -267,7 +268,8 @@ impl Vm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
OpCode::JMP_IF_TRUE => {
|
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 {
|
if cond {
|
||||||
let offset = opcode::offset16(instr) as isize;
|
let offset = opcode::offset16(instr) as isize;
|
||||||
self.pc = ((self.pc as isize) + offset - 1) as usize;
|
self.pc = ((self.pc as isize) + offset - 1) as usize;
|
||||||
@@ -547,17 +549,20 @@ impl Vm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
OpCode::NOT => {
|
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);
|
self.regs[rd] = JsValue::bool(!cond);
|
||||||
}
|
}
|
||||||
|
|
||||||
OpCode::AND => {
|
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] };
|
self.regs[rd] = if cond { self.regs[b] } else { self.regs[a] };
|
||||||
}
|
}
|
||||||
|
|
||||||
OpCode::OR => {
|
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] };
|
self.regs[rd] = if cond { self.regs[a] } else { self.regs[b] };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user