feat: 符号键编码加 realm 维度并把符号表移入 realm

This commit is contained in:
2026-10-07 02:13:07 +00:00
parent 55bec82f69
commit 28d21e7929
15 changed files with 202 additions and 52 deletions
+1 -1
View File
@@ -986,7 +986,7 @@ fn string_to_bigint_full<H: VmHost>(host: &mut H, s: &str) -> Result<JsValue, St
pub fn to_string_for_string_constructor<H: VmHost>(val: JsValue, host: &mut H) -> Result<String, String> {
// 原始 Symbol:步骤 2a,SymbolDescriptiveString(不经 ToString)。
if val.is_symbol() {
let desc = host.symbol_description(val.as_symbol_index()).unwrap_or("");
let desc = host.symbol_description(val.as_symbol_index()).unwrap_or_default();
return Ok(format!("Symbol({desc})"));
}
// 步骤 3:ToString。装箱 Symbol 经 ToPrimitive 得 Symbol 本体,ToString 抛 TypeError。
+6 -1
View File
@@ -258,9 +258,14 @@ pub trait VmHost {
/// 动态编译脚本(`eval` 字符串模式):按脚本模式编译,var/函数声明落全局对象。
/// 编译或解析失败返回 `Err`,由调用方转为 `SyntaxError`。
fn create_dynamic_script(&mut self, code: &str) -> Result<JsValue, String>;
/// 读取本 VM 所属 realm 的编号(符号身份 = (realm 编号, 局部下标) 的 realm 维度)。
///
/// 供 `oxide_builtins` 侧构造 realm 感知符号键 / 符号值时取 realm 编号。
fn realm_id(&self) -> u32;
/// `None` 表示无描述(`Symbol()`/`Symbol(undefined)`),`Some(desc)` 为字符串描述。
fn symbol_intern(&mut self, desc: Option<String>) -> u32;
fn symbol_description(&self, idx: u32) -> Option<&str>;
/// 符号描述字符串(符号表入 realm 后数据在 `RefCell` 内,返回克隆串免临时 `Ref` 悬垂)。
fn symbol_description(&self, idx: u32) -> Option<String>;
fn symbol_lookup_global(&self, key: &str) -> Option<u32>;
fn symbol_register_global(&mut self, key: String, idx: u32);
fn symbol_key_for_id(&self, idx: u32) -> Option<String>;