refactor: StringForge 规范化类型命名

This commit is contained in:
爱特每羊队
2026-06-05 23:24:07 +08:00
parent 1a4487bf92
commit 48bfb24cc6
3 changed files with 41 additions and 41 deletions
+7 -7
View File
@@ -3,7 +3,7 @@ use oxide_types::object::JsObject;
use oxide_types::value::JsValue; use oxide_types::value::JsValue;
use crate::shape_forge::{ShapeForge, EMPTY_SHAPE_ID}; use crate::shape_forge::{ShapeForge, EMPTY_SHAPE_ID};
use crate::string_forge::Interner; use crate::string_forge::StringForge;
pub struct BuiltinWorld { pub struct BuiltinWorld {
pub object_proto: P<JsObject>, pub object_proto: P<JsObject>,
@@ -24,12 +24,12 @@ pub struct BuiltinWorld {
pub symbol_constructor: P<JsObject>, pub symbol_constructor: P<JsObject>,
} }
fn intern_label(interner: &Interner, label: &str) -> u32 { fn intern_label(string_forge: &StringForge, label: &str) -> u32 {
interner.intern(label).0 string_forge.intern(label).0
} }
fn make_pair( fn make_pair(
string_forge: &Interner, string_forge: &StringForge,
shape_forge: &ShapeForge, shape_forge: &ShapeForge,
name: &str, name: &str,
si_prototype: u32, si_prototype: u32,
@@ -59,7 +59,7 @@ fn make_pair(
} }
impl BuiltinWorld { impl BuiltinWorld {
pub fn new(string_forge: &Interner, shape_forge: &ShapeForge) -> Self { pub fn new(string_forge: &StringForge, shape_forge: &ShapeForge) -> Self {
let si_prototype = intern_label(string_forge, "prototype"); let si_prototype = intern_label(string_forge, "prototype");
let si_constructor = intern_label(string_forge, "constructor"); let si_constructor = intern_label(string_forge, "constructor");
let si_name = intern_label(string_forge, "name"); let si_name = intern_label(string_forge, "name");
@@ -157,10 +157,10 @@ impl BuiltinWorld {
mod tests { mod tests {
use super::*; use super::*;
use crate::shape_forge::{ShapeForge, EMPTY_SHAPE_ID}; use crate::shape_forge::{ShapeForge, EMPTY_SHAPE_ID};
use crate::string_forge::Interner; use crate::string_forge::StringForge;
fn make_world() -> BuiltinWorld { fn make_world() -> BuiltinWorld {
let sf = Interner::new(); let sf = StringForge::new();
let sh = ShapeForge::new(); let sh = ShapeForge::new();
BuiltinWorld::new(&sf, &sh) BuiltinWorld::new(&sf, &sh)
} }
+4 -4
View File
@@ -6,7 +6,7 @@ use crate::builtin::BuiltinWorld;
use crate::code_forge::CodeForge; use crate::code_forge::CodeForge;
use crate::prop_forge::PropForge; use crate::prop_forge::PropForge;
use crate::shape_forge::ShapeForge; use crate::shape_forge::ShapeForge;
use crate::string_forge::Interner; use crate::string_forge::StringForge;
pub struct KernelConfig { pub struct KernelConfig {
pub min_pool_size: usize, pub min_pool_size: usize,
@@ -60,7 +60,7 @@ impl Default for KernelConfig {
pub struct OxideKernel { pub struct OxideKernel {
pub config: KernelConfig, pub config: KernelConfig,
pub string_forge: Arc<Interner>, pub string_forge: Arc<StringForge>,
pub shape_forge: Arc<ShapeForge>, pub shape_forge: Arc<ShapeForge>,
pub code_forge: Arc<CodeForge>, pub code_forge: Arc<CodeForge>,
pub prop_forge: Arc<PropForge>, pub prop_forge: Arc<PropForge>,
@@ -69,7 +69,7 @@ pub struct OxideKernel {
impl OxideKernel { impl OxideKernel {
pub fn new(config: KernelConfig) -> Self { pub fn new(config: KernelConfig) -> Self {
let string_forge = Arc::new(Interner::new()); let string_forge = Arc::new(StringForge::new());
let shape_forge = Arc::new(ShapeForge::new()); let shape_forge = Arc::new(ShapeForge::new());
let builtin_world = Arc::new(BuiltinWorld::new(&string_forge, &shape_forge)); let builtin_world = Arc::new(BuiltinWorld::new(&string_forge, &shape_forge));
let code_forge = Arc::new(CodeForge::new()); let code_forge = Arc::new(CodeForge::new());
@@ -85,7 +85,7 @@ impl OxideKernel {
} }
} }
pub fn string_forge(&self) -> &Arc<Interner> { pub fn string_forge(&self) -> &Arc<StringForge> {
&self.string_forge &self.string_forge
} }
+30 -30
View File
@@ -17,19 +17,19 @@ pub struct StringEntry {
pub hash: u16, pub hash: u16,
} }
struct InternerInner { struct StringForgeInner {
map: HashMap<String, u32, FxBuildHasher>, map: HashMap<String, u32, FxBuildHasher>,
entries: Vec<StringEntry>, entries: Vec<StringEntry>,
} }
pub struct Interner { pub struct StringForge {
inner: RwLock<InternerInner>, inner: RwLock<StringForgeInner>,
} }
impl Interner { impl StringForge {
pub fn new() -> Self { pub fn new() -> Self {
Self { Self {
inner: RwLock::new(InternerInner { inner: RwLock::new(StringForgeInner {
map: HashMap::with_hasher(FxBuildHasher::default()), map: HashMap::with_hasher(FxBuildHasher::default()),
entries: Vec::new(), entries: Vec::new(),
}), }),
@@ -111,7 +111,7 @@ impl Interner {
} }
} }
impl Default for Interner { impl Default for StringForge {
fn default() -> Self { fn default() -> Self {
Self::new() Self::new()
} }
@@ -133,56 +133,56 @@ mod tests {
#[test] #[test]
fn test_intern_dedup() { fn test_intern_dedup() {
let interner = Interner::new(); let string_forge = StringForge::new();
let (i1, h1) = interner.intern("abc"); let (i1, h1) = string_forge.intern("abc");
let (i2, h2) = interner.intern("abc"); let (i2, h2) = string_forge.intern("abc");
assert_eq!(i1, i2); assert_eq!(i1, i2);
assert_eq!(h1, h2); assert_eq!(h1, h2);
} }
#[test] #[test]
fn test_intern_different() { fn test_intern_different() {
let interner = Interner::new(); let string_forge = StringForge::new();
let (i1, _) = interner.intern("x"); let (i1, _) = string_forge.intern("x");
let (i2, _) = interner.intern("y"); let (i2, _) = string_forge.intern("y");
assert_ne!(i1, i2); assert_ne!(i1, i2);
} }
#[test] #[test]
fn test_lookup_found() { fn test_lookup_found() {
let interner = Interner::new(); let string_forge = StringForge::new();
let (idx, _) = interner.intern("hello"); let (idx, _) = string_forge.intern("hello");
assert_eq!(interner.lookup(idx), Some("hello".to_string())); assert_eq!(string_forge.lookup(idx), Some("hello".to_string()));
} }
#[test] #[test]
fn test_lookup_not_found() { fn test_lookup_not_found() {
let interner = Interner::new(); let string_forge = StringForge::new();
assert_eq!(interner.lookup(99999), None); assert_eq!(string_forge.lookup(99999), None);
} }
#[test] #[test]
fn test_ref_count_and_decref() { fn test_ref_count_and_decref() {
let interner = Interner::new(); let string_forge = StringForge::new();
let (idx, _) = interner.intern("s"); let (idx, _) = string_forge.intern("s");
assert_eq!(interner.lookup(idx), Some("s".to_string())); assert_eq!(string_forge.lookup(idx), Some("s".to_string()));
interner.decref(idx); string_forge.decref(idx);
assert_eq!(interner.lookup(idx), Some("s".to_string())); assert_eq!(string_forge.lookup(idx), Some("s".to_string()));
} }
#[test] #[test]
fn test_maybe_sweep_noop_when_none() { fn test_maybe_sweep_noop_when_none() {
let interner = Interner::new(); let string_forge = StringForge::new();
interner.intern("live"); string_forge.intern("live");
interner.maybe_sweep(None); string_forge.maybe_sweep(None);
assert!(interner.lookup(0).is_some()); assert!(string_forge.lookup(0).is_some());
} }
#[test] #[test]
fn test_maybe_sweep_skip_below_threshold() { fn test_maybe_sweep_skip_below_threshold() {
let interner = Interner::new(); let string_forge = StringForge::new();
interner.intern("live"); string_forge.intern("live");
interner.maybe_sweep(Some(100)); string_forge.maybe_sweep(Some(100));
assert_eq!(interner.lookup(0), Some("live".to_string())); assert_eq!(string_forge.lookup(0), Some("live".to_string()));
} }
} }