mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
refactor: 符号属性键核心推导改经 realm 维度编码
This commit is contained in:
Generated
+18
-18
@@ -1160,7 +1160,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_builtins"
|
name = "oxide_builtins"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"chrono",
|
"chrono",
|
||||||
"fast-float",
|
"fast-float",
|
||||||
@@ -1185,7 +1185,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_bytecode"
|
name = "oxide_bytecode"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"oxide_log",
|
"oxide_log",
|
||||||
@@ -1193,7 +1193,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_cfg"
|
name = "oxide_cfg"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_emit",
|
"oxide_emit",
|
||||||
@@ -1204,7 +1204,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_cli"
|
name = "oxide_cli"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ansi_term",
|
"ansi_term",
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
@@ -1225,7 +1225,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_code_cache"
|
name = "oxide_code_cache"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lru",
|
"lru",
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
@@ -1234,7 +1234,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_compiler"
|
name = "oxide_compiler"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1253,7 +1253,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_dce"
|
name = "oxide_dce"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1267,7 +1267,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_emit"
|
name = "oxide_emit"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"oxc_allocator",
|
"oxc_allocator",
|
||||||
@@ -1282,7 +1282,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_ir"
|
name = "oxide_ir"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_log",
|
"oxide_log",
|
||||||
@@ -1291,7 +1291,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_kernel"
|
name = "oxide_kernel"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
@@ -1306,7 +1306,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_liveness"
|
name = "oxide_liveness"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1318,7 +1318,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_log"
|
name = "oxide_log"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-appender",
|
"tracing-appender",
|
||||||
@@ -1327,7 +1327,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_parser"
|
name = "oxide_parser"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxc_allocator",
|
"oxc_allocator",
|
||||||
"oxc_ast",
|
"oxc_ast",
|
||||||
@@ -1342,7 +1342,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_regalloc"
|
name = "oxide_regalloc"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_cfg",
|
"oxide_cfg",
|
||||||
@@ -1358,7 +1358,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_runtime_api"
|
name = "oxide_runtime_api"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
@@ -1370,7 +1370,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_test262"
|
name = "oxide_test262"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"oxide_bytecode",
|
"oxide_bytecode",
|
||||||
"oxide_compiler",
|
"oxide_compiler",
|
||||||
@@ -1387,7 +1387,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_types"
|
name = "oxide_types"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"hashbrown 0.14.5",
|
"hashbrown 0.14.5",
|
||||||
@@ -1399,7 +1399,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "oxide_vm"
|
name = "oxide_vm"
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bumpalo",
|
"bumpalo",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
|||||||
+1
-1
@@ -22,7 +22,7 @@ members = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "0.8.50"
|
version = "0.8.51"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
rust-version = "1.80"
|
rust-version = "1.80"
|
||||||
|
|||||||
@@ -985,8 +985,9 @@ fn string_to_bigint_full<H: VmHost>(host: &mut H, s: &str) -> Result<JsValue, St
|
|||||||
/// ToPrimitive 返回 Symbol 本体,ToString 抛 TypeError。
|
/// ToPrimitive 返回 Symbol 本体,ToString 抛 TypeError。
|
||||||
pub fn to_string_for_string_constructor<H: VmHost>(val: JsValue, host: &mut H) -> Result<String, String> {
|
pub fn to_string_for_string_constructor<H: VmHost>(val: JsValue, host: &mut H) -> Result<String, String> {
|
||||||
// 原始 Symbol:步骤 2a,SymbolDescriptiveString(不经 ToString)。
|
// 原始 Symbol:步骤 2a,SymbolDescriptiveString(不经 ToString)。
|
||||||
|
// 描述表按 realm 内局部下标索引,取局部下标(realm 0 与全载荷一致)。
|
||||||
if val.is_symbol() {
|
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})"));
|
return Ok(format!("Symbol({desc})"));
|
||||||
}
|
}
|
||||||
// 步骤 3:ToString。装箱 Symbol 经 ToPrimitive 得 Symbol 本体,ToString 抛 TypeError。
|
// 步骤 3:ToString。装箱 Symbol 经 ToPrimitive 得 Symbol 本体,ToString 抛 TypeError。
|
||||||
|
|||||||
@@ -4,26 +4,19 @@
|
|||||||
use oxide_runtime_api as coercion;
|
use oxide_runtime_api as coercion;
|
||||||
|
|
||||||
use oxide_types::object::JsObject;
|
use oxide_types::object::JsObject;
|
||||||
use oxide_types::private_key::{
|
use oxide_types::private_key::{encode_symbol_key, int_key_value, is_int_key, make_int_key, INT_KEY_COUNT};
|
||||||
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::value::JsValue;
|
use oxide_types::value::JsValue;
|
||||||
|
|
||||||
use super::{canonical_index_of, canonical_index_units, Vm, MAX_PROTO_CHAIN_DEPTH};
|
use super::{canonical_index_of, canonical_index_units, Vm, MAX_PROTO_CHAIN_DEPTH};
|
||||||
use crate::vm_trace;
|
use crate::vm_trace;
|
||||||
|
|
||||||
/// 把符号原语的下标编码为属性键:well-known 下标走保留键槽,用户下标加偏移,
|
impl Vm {
|
||||||
/// 两段键区间不重叠。
|
/// 把符号原语的局部下标编码为属性键:经 realm 感知编码(realm 编号占高位、
|
||||||
fn symbol_value_key(idx: u32) -> u32 {
|
/// 局部下标占低 20 位),realm 0 路径与旧编码逐字节一致。
|
||||||
if idx < WELL_KNOWN_SYMBOL_COUNT {
|
fn symbol_value_key(&self, idx: u32) -> u32 {
|
||||||
make_well_known_symbol_key(idx)
|
encode_symbol_key(self.realm_id(), idx)
|
||||||
} else {
|
|
||||||
make_symbol_key(idx)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Vm {
|
|
||||||
/// 把 `JsValue` 转为属性键 si(字符串 intern id,`u32`)。
|
/// 把 `JsValue` 转为属性键 si(字符串 intern id,`u32`)。
|
||||||
///
|
///
|
||||||
/// 非负小整数(含整值 double)直接编码到整数键区间,免 to_string + intern;
|
/// 非负小整数(含整值 double)直接编码到整数键区间,免 to_string + intern;
|
||||||
@@ -55,16 +48,16 @@ impl Vm {
|
|||||||
return Ok(self.string_key_units(&s.units()));
|
return Ok(self.string_key_units(&s.units()));
|
||||||
}
|
}
|
||||||
// Symbol 值直接编码为 Symbol 键(不进字符串 interner,键相互独立);
|
// Symbol 值直接编码为 Symbol 键(不进字符串 interner,键相互独立);
|
||||||
// well-known 下标占保留槽,用户符号下标须加偏移,两段键区间不重叠。
|
// realm 编号占高位、局部下标占低 20 位,realm 0 与旧编码逐字节一致。
|
||||||
if val.is_symbol() {
|
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() {
|
if val.is_object() {
|
||||||
// ToPropertyKey:对象经 ToPrimitive(string hint),结果为 Symbol 时直接作键;
|
// ToPropertyKey:对象经 ToPrimitive(string hint),结果为 Symbol 时直接作键;
|
||||||
// 其余字符串按单元序列推导键(避免 lossy 文本桥接破坏孤立 surrogate 键)。
|
// 其余字符串按单元序列推导键(避免 lossy 文本桥接破坏孤立 surrogate 键)。
|
||||||
let prim = coercion::to_primitive(val, coercion::ToPrimitiveHint::String, self)?;
|
let prim = coercion::to_primitive(val, coercion::ToPrimitiveHint::String, self)?;
|
||||||
if prim.is_symbol() {
|
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)?;
|
let units = oxide_runtime_api::to_units_full(prim, self)?;
|
||||||
return Ok(self.string_key_units(&units));
|
return Ok(self.string_key_units(&units));
|
||||||
|
|||||||
@@ -90,27 +90,25 @@ impl GcState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Symbol 的 intern 状态。
|
/// 每 realm 一份的 Symbol intern 状态。
|
||||||
///
|
///
|
||||||
/// 符号下标 `0..WELL_KNOWN_SYMBOL_COUNT` 保留给 well-known symbol(描述取内建
|
/// 符号下标是 realm 内局部下标:`0..WELL_KNOWN_SYMBOL_COUNT` 保留给
|
||||||
/// 名表),用户 `Symbol()`/`Symbol.for()` 的下标自此区间之后递增,
|
/// well-known symbol(描述取内建名表),用户 `Symbol()`/`Symbol.for()` 的
|
||||||
/// `symbol_descriptions` 只存用户符号描述。
|
/// 局部下标自此区间之后递增,`symbol_descriptions` 只存用户符号描述。
|
||||||
|
/// 局部下标由描述槽数自然递增,每 realm 独立计数。
|
||||||
pub(crate) struct SymbolState {
|
pub(crate) struct SymbolState {
|
||||||
pub(crate) symbol_counter: u32,
|
|
||||||
pub(crate) symbol_descriptions: Vec<Option<String>>,
|
pub(crate) symbol_descriptions: Vec<Option<String>>,
|
||||||
pub(crate) symbol_registry: HashMap<String, u32>,
|
pub(crate) symbol_registry: HashMap<String, u32>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SymbolState {
|
impl SymbolState {
|
||||||
pub(crate) fn reset(&mut self) {
|
pub(crate) fn reset(&mut self) {
|
||||||
self.symbol_counter = 0;
|
|
||||||
self.symbol_descriptions.clear();
|
self.symbol_descriptions.clear();
|
||||||
self.symbol_registry.clear();
|
self.symbol_registry.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn intern(&mut self, description: Option<String>) -> u32 {
|
pub(crate) fn intern(&mut self, description: Option<String>) -> 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;
|
let idx = WELL_KNOWN_SYMBOL_COUNT + self.symbol_descriptions.len() as u32;
|
||||||
self.symbol_descriptions.push(description);
|
self.symbol_descriptions.push(description);
|
||||||
idx
|
idx
|
||||||
|
|||||||
@@ -96,7 +96,6 @@ impl Vm {
|
|||||||
gc_pressure_mode: gc_pressure_mode_from_env(),
|
gc_pressure_mode: gc_pressure_mode_from_env(),
|
||||||
}),
|
}),
|
||||||
symbols: RefCell::new(SymbolState {
|
symbols: RefCell::new(SymbolState {
|
||||||
symbol_counter: 0,
|
|
||||||
symbol_descriptions: Vec::new(),
|
symbol_descriptions: Vec::new(),
|
||||||
symbol_registry: std::collections::HashMap::new(),
|
symbol_registry: std::collections::HashMap::new(),
|
||||||
}),
|
}),
|
||||||
@@ -246,7 +245,6 @@ impl Vm {
|
|||||||
gc_pressure_mode: gc_pressure_mode_from_env(),
|
gc_pressure_mode: gc_pressure_mode_from_env(),
|
||||||
}),
|
}),
|
||||||
symbols: RefCell::new(SymbolState {
|
symbols: RefCell::new(SymbolState {
|
||||||
symbol_counter: 0,
|
|
||||||
symbol_descriptions: Vec::new(),
|
symbol_descriptions: Vec::new(),
|
||||||
symbol_registry: std::collections::HashMap::new(),
|
symbol_registry: std::collections::HashMap::new(),
|
||||||
}),
|
}),
|
||||||
|
|||||||
@@ -1112,7 +1112,6 @@ fn full_reset_clears_symbol_state() {
|
|||||||
|
|
||||||
vm.full_reset();
|
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_descriptions.is_empty());
|
||||||
assert!(vm.realm.symbols.borrow().symbol_registry.is_empty());
|
assert!(vm.realm.symbols.borrow().symbol_registry.is_empty());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user