feat: 最小化字符串方法依赖
This commit is contained in:
@@ -1,4 +1,5 @@
|
|||||||
use crate::vm::Vm;
|
use crate::vm::Vm;
|
||||||
|
use oxide_kernel::string_forge::StringForge;
|
||||||
use oxide_types::object::JsObject;
|
use oxide_types::object::JsObject;
|
||||||
use oxide_types::shape::EMPTY_SHAPE_ID;
|
use oxide_types::shape::EMPTY_SHAPE_ID;
|
||||||
use oxide_types::value::JsValue;
|
use oxide_types::value::JsValue;
|
||||||
@@ -32,7 +33,7 @@ pub fn to_number(val: JsValue) -> f64 {
|
|||||||
f64::NAN
|
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() {
|
if val.is_int() {
|
||||||
return val.as_int().to_string();
|
return val.as_int().to_string();
|
||||||
}
|
}
|
||||||
@@ -64,7 +65,9 @@ pub fn to_string(vm: &Vm, val: JsValue) -> String {
|
|||||||
return "undefined".to_string();
|
return "undefined".to_string();
|
||||||
}
|
}
|
||||||
if val.is_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() {
|
if val.is_object() {
|
||||||
panic_to_object();
|
panic_to_object();
|
||||||
@@ -173,10 +176,14 @@ fn strict_double_eq(a: f64, b: f64) -> bool {
|
|||||||
a == b
|
a == b
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn relational_compare(vm: &Vm, lhs: JsValue, rhs: JsValue) -> Option<bool> {
|
pub fn relational_compare(string_forge: &StringForge, lhs: JsValue, rhs: JsValue) -> Option<bool> {
|
||||||
if lhs.is_string() && rhs.is_string() {
|
if lhs.is_string() && rhs.is_string() {
|
||||||
let ls = vm.lookup_str(lhs).unwrap_or_default();
|
let ls = string_forge
|
||||||
let rs = vm.lookup_str(rhs).unwrap_or_default();
|
.lookup(lhs.as_string_index())
|
||||||
|
.unwrap_or_default();
|
||||||
|
let rs = string_forge
|
||||||
|
.lookup(rhs.as_string_index())
|
||||||
|
.unwrap_or_default();
|
||||||
return Some(ls < rs);
|
return Some(ls < rs);
|
||||||
}
|
}
|
||||||
let l = to_number(lhs);
|
let l = to_number(lhs);
|
||||||
|
|||||||
@@ -149,8 +149,8 @@ impl Vm {
|
|||||||
let lhs = self.regs[a];
|
let lhs = self.regs[a];
|
||||||
let rhs = self.regs[b];
|
let rhs = self.regs[b];
|
||||||
if lhs.is_string() || rhs.is_string() {
|
if lhs.is_string() || rhs.is_string() {
|
||||||
let ls = coercion::to_string(self, lhs);
|
let ls = coercion::to_string(self.kernel.string_forge().as_ref(), lhs);
|
||||||
let rs = coercion::to_string(self, rhs);
|
let rs = coercion::to_string(self.kernel.string_forge().as_ref(), rhs);
|
||||||
let concat = format!("{ls}{rs}");
|
let concat = format!("{ls}{rs}");
|
||||||
self.regs[rd] = self.intern(&concat);
|
self.regs[rd] = self.intern(&concat);
|
||||||
} else {
|
} else {
|
||||||
@@ -200,22 +200,38 @@ impl Vm {
|
|||||||
}
|
}
|
||||||
|
|
||||||
OpCode::LT => {
|
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));
|
self.regs[rd] = JsValue::bool(rel.unwrap_or(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
OpCode::GT => {
|
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));
|
self.regs[rd] = JsValue::bool(rel.unwrap_or(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
OpCode::LTE => {
|
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));
|
self.regs[rd] = JsValue::bool(!rel.unwrap_or(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
OpCode::GTE => {
|
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));
|
self.regs[rd] = JsValue::bool(!rel.unwrap_or(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user