From e5d2f8e4f18b1abab001c0d32a8829435caeda45 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Wed, 7 Oct 2026 02:37:33 +0000 Subject: [PATCH] =?UTF-8?q?refactor:=20=E7=AC=A6=E5=8F=B7=E5=B1=9E?= =?UTF-8?q?=E6=80=A7=E9=94=AE=E6=A0=B8=E5=BF=83=E6=8E=A8=E5=AF=BC=E6=94=B9?= =?UTF-8?q?=E7=BB=8F=20realm=20=E7=BB=B4=E5=BA=A6=E7=BC=96=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 36 ++++++++++++------------ Cargo.toml | 2 +- crates/oxide_runtime_api/src/coercion.rs | 3 +- crates/oxide_vm/src/vm/props.rs | 27 +++++++----------- crates/oxide_vm/src/vm_state.rs | 14 ++++----- crates/oxide_vm/src/vm_support.rs | 2 -- crates/oxide_vm/src/vm_support/tests.rs | 1 - 7 files changed, 37 insertions(+), 48 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8bfb1e8c..fa97eb34 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1160,7 +1160,7 @@ dependencies = [ [[package]] name = "oxide_builtins" -version = "0.8.50" +version = "0.8.51" dependencies = [ "chrono", "fast-float", @@ -1185,7 +1185,7 @@ dependencies = [ [[package]] name = "oxide_bytecode" -version = "0.8.50" +version = "0.8.51" dependencies = [ "num-bigint", "oxide_log", @@ -1193,7 +1193,7 @@ dependencies = [ [[package]] name = "oxide_cfg" -version = "0.8.50" +version = "0.8.51" dependencies = [ "oxide_bytecode", "oxide_emit", @@ -1204,7 +1204,7 @@ dependencies = [ [[package]] name = "oxide_cli" -version = "0.8.50" +version = "0.8.51" dependencies = [ "ansi_term", "bumpalo", @@ -1225,7 +1225,7 @@ dependencies = [ [[package]] name = "oxide_code_cache" -version = "0.8.50" +version = "0.8.51" dependencies = [ "lru", "oxide_bytecode", @@ -1234,7 +1234,7 @@ dependencies = [ [[package]] name = "oxide_compiler" -version = "0.8.50" +version = "0.8.51" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1253,7 +1253,7 @@ dependencies = [ [[package]] name = "oxide_dce" -version = "0.8.50" +version = "0.8.51" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1267,7 +1267,7 @@ dependencies = [ [[package]] name = "oxide_emit" -version = "0.8.50" +version = "0.8.51" dependencies = [ "num-bigint", "oxc_allocator", @@ -1282,7 +1282,7 @@ dependencies = [ [[package]] name = "oxide_ir" -version = "0.8.50" +version = "0.8.51" dependencies = [ "oxide_bytecode", "oxide_log", @@ -1291,7 +1291,7 @@ dependencies = [ [[package]] name = "oxide_kernel" -version = "0.8.50" +version = "0.8.51" dependencies = [ "bumpalo", "dashmap", @@ -1306,7 +1306,7 @@ dependencies = [ [[package]] name = "oxide_liveness" -version = "0.8.50" +version = "0.8.51" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1318,7 +1318,7 @@ dependencies = [ [[package]] name = "oxide_log" -version = "0.8.50" +version = "0.8.51" dependencies = [ "tracing", "tracing-appender", @@ -1327,7 +1327,7 @@ dependencies = [ [[package]] name = "oxide_parser" -version = "0.8.50" +version = "0.8.51" dependencies = [ "oxc_allocator", "oxc_ast", @@ -1342,7 +1342,7 @@ dependencies = [ [[package]] name = "oxide_regalloc" -version = "0.8.50" +version = "0.8.51" dependencies = [ "oxide_bytecode", "oxide_cfg", @@ -1358,7 +1358,7 @@ dependencies = [ [[package]] name = "oxide_runtime_api" -version = "0.8.50" +version = "0.8.51" dependencies = [ "num-bigint", "num-traits", @@ -1370,7 +1370,7 @@ dependencies = [ [[package]] name = "oxide_test262" -version = "0.8.50" +version = "0.8.51" dependencies = [ "oxide_bytecode", "oxide_compiler", @@ -1387,7 +1387,7 @@ dependencies = [ [[package]] name = "oxide_types" -version = "0.8.50" +version = "0.8.51" dependencies = [ "bumpalo", "hashbrown 0.14.5", @@ -1399,7 +1399,7 @@ dependencies = [ [[package]] name = "oxide_vm" -version = "0.8.50" +version = "0.8.51" dependencies = [ "bumpalo", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 239521ac..eefe26c8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ members = [ ] [workspace.package] -version = "0.8.50" +version = "0.8.51" edition = "2021" license = "MIT" rust-version = "1.80" diff --git a/crates/oxide_runtime_api/src/coercion.rs b/crates/oxide_runtime_api/src/coercion.rs index ab8223c8..4e1a2087 100644 --- a/crates/oxide_runtime_api/src/coercion.rs +++ b/crates/oxide_runtime_api/src/coercion.rs @@ -985,8 +985,9 @@ fn string_to_bigint_full(host: &mut H, s: &str) -> Result(val: JsValue, host: &mut H) -> Result { // 原始 Symbol:步骤 2a,SymbolDescriptiveString(不经 ToString)。 + // 描述表按 realm 内局部下标索引,取局部下标(realm 0 与全载荷一致)。 if val.is_symbol() { - let desc = host.symbol_description(val.as_symbol_index()).unwrap_or_default(); + let desc = host.symbol_description(val.as_symbol_local_index()).unwrap_or_default(); return Ok(format!("Symbol({desc})")); } // 步骤 3:ToString。装箱 Symbol 经 ToPrimitive 得 Symbol 本体,ToString 抛 TypeError。 diff --git a/crates/oxide_vm/src/vm/props.rs b/crates/oxide_vm/src/vm/props.rs index 08c38a5e..a4fa006a 100644 --- a/crates/oxide_vm/src/vm/props.rs +++ b/crates/oxide_vm/src/vm/props.rs @@ -4,26 +4,19 @@ use oxide_runtime_api as coercion; use oxide_types::object::JsObject; -use oxide_types::private_key::{ - int_key_value, is_int_key, make_int_key, make_symbol_key, make_well_known_symbol_key, INT_KEY_COUNT, - WELL_KNOWN_SYMBOL_COUNT, -}; +use oxide_types::private_key::{encode_symbol_key, int_key_value, is_int_key, make_int_key, INT_KEY_COUNT}; use oxide_types::value::JsValue; use super::{canonical_index_of, canonical_index_units, Vm, MAX_PROTO_CHAIN_DEPTH}; use crate::vm_trace; -/// 把符号原语的下标编码为属性键:well-known 下标走保留键槽,用户下标加偏移, -/// 两段键区间不重叠。 -fn symbol_value_key(idx: u32) -> u32 { - if idx < WELL_KNOWN_SYMBOL_COUNT { - make_well_known_symbol_key(idx) - } else { - make_symbol_key(idx) - } -} - impl Vm { + /// 把符号原语的局部下标编码为属性键:经 realm 感知编码(realm 编号占高位、 + /// 局部下标占低 20 位),realm 0 路径与旧编码逐字节一致。 + fn symbol_value_key(&self, idx: u32) -> u32 { + encode_symbol_key(self.realm_id(), idx) + } + /// 把 `JsValue` 转为属性键 si(字符串 intern id,`u32`)。 /// /// 非负小整数(含整值 double)直接编码到整数键区间,免 to_string + intern; @@ -55,16 +48,16 @@ impl Vm { return Ok(self.string_key_units(&s.units())); } // Symbol 值直接编码为 Symbol 键(不进字符串 interner,键相互独立); - // well-known 下标占保留槽,用户符号下标须加偏移,两段键区间不重叠。 + // realm 编号占高位、局部下标占低 20 位,realm 0 与旧编码逐字节一致。 if val.is_symbol() { - return Ok(symbol_value_key(val.as_symbol_index())); + return Ok(self.symbol_value_key(val.as_symbol_local_index())); } if val.is_object() { // ToPropertyKey:对象经 ToPrimitive(string hint),结果为 Symbol 时直接作键; // 其余字符串按单元序列推导键(避免 lossy 文本桥接破坏孤立 surrogate 键)。 let prim = coercion::to_primitive(val, coercion::ToPrimitiveHint::String, self)?; if prim.is_symbol() { - return Ok(symbol_value_key(prim.as_symbol_index())); + return Ok(self.symbol_value_key(prim.as_symbol_local_index())); } let units = oxide_runtime_api::to_units_full(prim, self)?; return Ok(self.string_key_units(&units)); diff --git a/crates/oxide_vm/src/vm_state.rs b/crates/oxide_vm/src/vm_state.rs index 1277d4bd..3f669e8b 100644 --- a/crates/oxide_vm/src/vm_state.rs +++ b/crates/oxide_vm/src/vm_state.rs @@ -90,27 +90,25 @@ impl GcState { } } -/// Symbol 的 intern 状态。 +/// 每 realm 一份的 Symbol intern 状态。 /// -/// 符号下标 `0..WELL_KNOWN_SYMBOL_COUNT` 保留给 well-known symbol(描述取内建 -/// 名表),用户 `Symbol()`/`Symbol.for()` 的下标自此区间之后递增, -/// `symbol_descriptions` 只存用户符号描述。 +/// 符号下标是 realm 内局部下标:`0..WELL_KNOWN_SYMBOL_COUNT` 保留给 +/// well-known symbol(描述取内建名表),用户 `Symbol()`/`Symbol.for()` 的 +/// 局部下标自此区间之后递增,`symbol_descriptions` 只存用户符号描述。 +/// 局部下标由描述槽数自然递增,每 realm 独立计数。 pub(crate) struct SymbolState { - pub(crate) symbol_counter: u32, pub(crate) symbol_descriptions: Vec>, pub(crate) symbol_registry: HashMap, } impl SymbolState { pub(crate) fn reset(&mut self) { - self.symbol_counter = 0; self.symbol_descriptions.clear(); self.symbol_registry.clear(); } pub(crate) fn intern(&mut self, description: Option) -> u32 { - self.symbol_counter = self.symbol_counter.wrapping_add(1); - // 用户符号下标顺延到 well-known 保留区间之后,与 well-known 下标空间不重叠。 + // 用户符号局部下标顺延到 well-known 保留区间之后,与 well-known 下标空间不重叠。 let idx = WELL_KNOWN_SYMBOL_COUNT + self.symbol_descriptions.len() as u32; self.symbol_descriptions.push(description); idx diff --git a/crates/oxide_vm/src/vm_support.rs b/crates/oxide_vm/src/vm_support.rs index e4287a5c..39a4a162 100644 --- a/crates/oxide_vm/src/vm_support.rs +++ b/crates/oxide_vm/src/vm_support.rs @@ -96,7 +96,6 @@ impl Vm { gc_pressure_mode: gc_pressure_mode_from_env(), }), symbols: RefCell::new(SymbolState { - symbol_counter: 0, symbol_descriptions: Vec::new(), symbol_registry: std::collections::HashMap::new(), }), @@ -246,7 +245,6 @@ impl Vm { gc_pressure_mode: gc_pressure_mode_from_env(), }), symbols: RefCell::new(SymbolState { - symbol_counter: 0, symbol_descriptions: Vec::new(), symbol_registry: std::collections::HashMap::new(), }), diff --git a/crates/oxide_vm/src/vm_support/tests.rs b/crates/oxide_vm/src/vm_support/tests.rs index 3bc0c8ae..1de39a8a 100644 --- a/crates/oxide_vm/src/vm_support/tests.rs +++ b/crates/oxide_vm/src/vm_support/tests.rs @@ -1112,7 +1112,6 @@ fn full_reset_clears_symbol_state() { vm.full_reset(); - assert_eq!(vm.realm.symbols.borrow().symbol_counter, 0); assert!(vm.realm.symbols.borrow().symbol_descriptions.is_empty()); assert!(vm.realm.symbols.borrow().symbol_registry.is_empty()); }