refactor: 字符串值改用 JsString 指针表示,键与字面量改用 PermInterner

This commit is contained in:
爱特每羊队
2026-06-24 20:15:15 +08:00
parent 0de33f1a16
commit 466a0815ca
73 changed files with 768 additions and 860 deletions
+1 -4
View File
@@ -37,10 +37,7 @@ fn eval_val(source: &str) -> (Vm, Result<JsValue, String>) {
fn to_str(vm: &Vm, val: JsValue) -> String {
if val.is_string() {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
} else {
format!("{}", val)
}
@@ -10,10 +10,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn to_str(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
#[test]
@@ -13,10 +13,7 @@ fn eval(source: &str) -> Result<(Vm, JsValue), String> {
}
fn to_str(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
fn assert_num_eq(val: JsValue, expected: f64) {
@@ -14,10 +14,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn str_val(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
// -- direct native fn tests --
@@ -47,7 +44,7 @@ fn tboolean_call_true_false() {
#[test]
fn tboolean_call_empty_string() {
let mut vm = Vm::new();
let empty = vm.intern("");
let empty = vm.new_string("");
assert!(!bool_ctor_call(&mut vm, empty).as_bool());
}
@@ -10,10 +10,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn to_str(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
#[test]
+1 -4
View File
@@ -9,10 +9,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<oxide_types::value::JsValue, String
}
fn str_val(vm: &Vm, val: oxide_types::value::JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
// -- static methods --
@@ -25,7 +25,7 @@ fn error_constructor_creates_object() {
#[test]
fn error_has_message() {
let mut vm = make_vm();
let msg = vm.intern("test message");
let msg = vm.new_string("test message");
vm.set_reg(1, msg);
let result = error::error_constructor(&mut vm, &[0u8, 1u8]).unwrap();
assert!(result.is_object());
@@ -34,11 +34,7 @@ fn function_bind_creates_wrapper() {
fn function_constructor_is_global() {
let mut vm = Vm::new();
let result = eval(&mut vm, "typeof Function").unwrap();
let rendered = vm
.kernel_core()
.string_forge()
.lookup(result.as_string_index())
.unwrap_or_default();
let rendered = vm.lookup_str(result).unwrap_or_default();
assert_eq!(rendered, "function");
}
@@ -86,11 +82,7 @@ fn function_to_string_includes_function() {
let mut vm = Vm::new();
let result = eval(&mut vm, "Math.max.toString()").unwrap();
assert!(result.is_string());
let rendered = vm
.kernel_core()
.string_forge()
.lookup(result.as_string_index())
.unwrap_or_default();
let rendered = vm.lookup_str(result).unwrap_or_default();
assert_eq!(rendered, "function max() { [native code] }");
}
@@ -21,10 +21,7 @@ fn eval_with_vm(source: &str) -> (Vm, Result<JsValue, String>) {
}
fn str_val(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
#[test]
@@ -10,10 +10,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn to_str(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
#[test]
+1 -4
View File
@@ -11,10 +11,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn str_val(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
// -- direct native fn tests --
+4 -16
View File
@@ -76,11 +76,7 @@ fn number_constructor() {
fn to_string_of_number() {
let mut vm = Vm::new();
let result = eval(&mut vm, "var n = 42; n.toString()").unwrap();
let s = vm
.kernel_core()
.string_forge()
.lookup(result.as_string_index())
.unwrap_or_default();
let s = vm.lookup_str(result).unwrap_or_default();
assert_eq!(s, "42");
}
@@ -88,11 +84,7 @@ fn to_string_of_number() {
fn to_fixed_of_number() {
let mut vm = Vm::new();
let result = eval(&mut vm, "var n = 3.14159; n.toFixed(2)").unwrap();
let s = vm
.kernel_core()
.string_forge()
.lookup(result.as_string_index())
.unwrap_or_default();
let s = vm.lookup_str(result).unwrap_or_default();
assert_eq!(s, "3.14");
}
@@ -121,11 +113,7 @@ fn number_epsilon_is_positive() {
fn number_to_exponential() {
let mut vm = Vm::new();
let result = eval(&mut vm, "var n = 123.456; n.toExponential(2)").unwrap();
let s = vm
.kernel_core()
.string_forge()
.lookup(result.as_string_index())
.unwrap_or_default();
let s = vm.lookup_str(result).unwrap_or_default();
assert_eq!(s, "1.23e2");
}
@@ -155,7 +143,7 @@ fn boxed_number_valueof_preserves_int_and_float() {
fn boxed_number_is_object_and_call_stays_primitive() {
let mut vm = Vm::new();
let ty = eval(&mut vm, "typeof new Number(5)").unwrap();
assert_eq!(vm.kernel_core().string_forge().lookup(ty.as_string_index()).unwrap(), "object");
assert_eq!(vm.lookup_str(ty).unwrap(), "object");
let n = eval(&mut vm, "Number('7')").unwrap();
assert_eq!(n.as_int(), 7);
@@ -63,11 +63,7 @@ fn object_assign_copies() {
fn object_assign_boxes_primitive_target() {
let (_vm, result) = eval("var result = Object.assign('a'); result.valueOf()").unwrap();
assert!(result.is_string());
let rendered = _vm
.kernel_core()
.string_forge()
.lookup(result.as_string_index())
.unwrap_or_default();
let rendered = _vm.lookup_str(result).unwrap_or_default();
assert_eq!(rendered, "a");
}
@@ -10,10 +10,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn to_str(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
#[test]
@@ -10,10 +10,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn to_str(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
// --- RegExp constructor ---
@@ -10,10 +10,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn to_str(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
fn assert_num_eq(val: JsValue, expected: f64) {
@@ -10,10 +10,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn to_str(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
// --- Symbol constructor ---
@@ -10,10 +10,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn to_str(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
#[test]
+11 -18
View File
@@ -85,25 +85,18 @@ fn test_strict_equality_null_undefined() {
#[test]
fn test_to_int32_and_to_uint32() {
let vm = Vm::new();
let sf = vm.kernel_core().string_forge().as_ref();
let string_three = {
let (idx, hash) = vm.kernel_core().string_forge().intern("3");
JsValue::string(idx, hash)
};
let string_bad = {
let (idx, hash) = vm.kernel_core().string_forge().intern("x");
JsValue::string(idx, hash)
};
let mut vm = Vm::new();
let string_three = vm.new_string("3");
let string_bad = vm.new_string("x");
assert_eq!(coercion::to_int32(string_three, sf), 3);
assert_eq!(coercion::to_int32(string_bad, sf), 0);
assert_eq!(coercion::to_int32(JsValue::undefined(), sf), 0);
assert_eq!(coercion::to_int32(JsValue::float(1.9), sf), 1);
assert_eq!(coercion::to_int32(JsValue::float(-1.9), sf), -1);
assert_eq!(coercion::to_int32(JsValue::float(f64::NAN), sf), 0);
assert_eq!(coercion::to_int32(JsValue::float(f64::INFINITY), sf), 0);
assert_eq!(coercion::to_uint32(JsValue::int(-1), sf), 4_294_967_295);
assert_eq!(coercion::to_int32(string_three), 3);
assert_eq!(coercion::to_int32(string_bad), 0);
assert_eq!(coercion::to_int32(JsValue::undefined()), 0);
assert_eq!(coercion::to_int32(JsValue::float(1.9)), 1);
assert_eq!(coercion::to_int32(JsValue::float(-1.9)), -1);
assert_eq!(coercion::to_int32(JsValue::float(f64::NAN)), 0);
assert_eq!(coercion::to_int32(JsValue::float(f64::INFINITY)), 0);
assert_eq!(coercion::to_uint32(JsValue::int(-1)), 4_294_967_295);
}
#[test]
+1 -5
View File
@@ -204,10 +204,6 @@ fn function_default_prototype_accepts_member_assignment() {
"function Test262Error(message) { this.message = message || ''; } Test262Error.prototype.toString = function () { return this.message; }; new Test262Error('ok').toString()",
)
.unwrap();
let rendered = vm
.kernel_core()
.string_forge()
.lookup(result.as_string_index())
.unwrap_or_default();
let rendered = vm.lookup_str(result).unwrap_or_default();
assert_eq!(rendered, "ok");
}
+1 -4
View File
@@ -10,10 +10,7 @@ fn eval(vm: &mut Vm, source: &str) -> Result<JsValue, String> {
}
fn string_value(vm: &Vm, val: JsValue) -> String {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
}
// -- JSON.parse --
+1 -1
View File
@@ -11,7 +11,7 @@ fn run_source(vm: &mut Vm, source: &str) -> JsValue {
}
fn global_prop(vm: &Vm, name: &str) -> JsValue {
let si = vm.kernel_core().string_forge().intern(name).0;
let si = vm.kernel_core().perm_interner().intern(name).0;
let global = vm.session().global_object();
let pos = vm
.kernel_core()
+1 -4
View File
@@ -37,10 +37,7 @@ fn eval_val(source: &str) -> (Vm, Result<JsValue, String>) {
fn to_str(vm: &Vm, val: JsValue) -> String {
if val.is_string() {
vm.kernel_core()
.string_forge()
.lookup(val.as_string_index())
.unwrap_or_default()
vm.lookup_str(val).unwrap_or_default()
} else {
format!("{}", val)
}