From c97b0207b446cc26308365a9537c622ec28d9d17 Mon Sep 17 00:00:00 2001 From: pjh456 <147148383@qq.com> Date: Wed, 7 Oct 2026 03:59:07 +0000 Subject: [PATCH] =?UTF-8?q?refactor:=20=E5=86=85=E7=BD=AE=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7=E9=94=AE=E4=B8=8E=E7=AC=A6=E5=8F=B7=E5=80=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 --- crates/oxide_builtins/src/array/element.rs | 4 ++-- crates/oxide_builtins/src/array/from.rs | 4 ++-- crates/oxide_builtins/src/disposable_stack.rs | 8 +++---- crates/oxide_builtins/src/iterator.rs | 14 ++++++------ crates/oxide_builtins/src/map.rs | 2 +- crates/oxide_builtins/src/module.rs | 4 ++-- crates/oxide_builtins/src/object.rs | 22 +++++++++---------- crates/oxide_builtins/src/symbol.rs | 12 +++++----- 8 files changed, 34 insertions(+), 36 deletions(-) diff --git a/crates/oxide_builtins/src/array/element.rs b/crates/oxide_builtins/src/array/element.rs index 5c33a6bf..56333e15 100644 --- a/crates/oxide_builtins/src/array/element.rs +++ b/crates/oxide_builtins/src/array/element.rs @@ -8,7 +8,7 @@ use oxide_runtime_api::{NativeResult, VmHost}; use crate::builtins_debug; use crate::builtins_error; -use oxide_types::private_key::{make_well_known_symbol_key, WELL_KNOWN_SYMBOL_IS_CONCAT_SPREADABLE}; +use oxide_types::private_key::{encode_symbol_key, WELL_KNOWN_SYMBOL_IS_CONCAT_SPREADABLE}; use super::common::{ array_ptr, array_type_error, arraylike_get, arraylike_get_or_err, arraylike_index_present, check_array_create_len, @@ -499,7 +499,7 @@ pub fn array_concat(vm: &mut H, args: &[u8]) -> NativeResult { // 结果钉入返回寄存器:其后的元素读取 / 写入窗口保 GC 根,返回时自钉位读回。 vm.set_reg(0, JsValue::from_js_object(a_ptr)); - let spread_key = make_well_known_symbol_key(WELL_KNOWN_SYMBOL_IS_CONCAT_SPREADABLE); + let spread_key = encode_symbol_key(vm.realm_id(), WELL_KNOWN_SYMBOL_IS_CONCAT_SPREADABLE); let length_si = vm.string_key_si("length"); let mut n_acc: u64 = 0; let mut holes: Vec = Vec::new(); diff --git a/crates/oxide_builtins/src/array/from.rs b/crates/oxide_builtins/src/array/from.rs index c3932ccd..67af5d4a 100644 --- a/crates/oxide_builtins/src/array/from.rs +++ b/crates/oxide_builtins/src/array/from.rs @@ -2,7 +2,7 @@ use oxide_kernel::shape_forge::EMPTY_SHAPE_ID; use oxide_types::object::{JsObject, PropAttributes, MAX_DENSE_PROPS}; -use oxide_types::private_key::make_well_known_symbol_key; +use oxide_types::private_key::encode_symbol_key; use oxide_types::value::JsValue; use oxide_runtime_api::{NativeResult, VmHost}; @@ -333,7 +333,7 @@ pub(crate) fn array_species_create( } // 一切对象 C 均须查 @@species(null 归一为 undefined):S 为 undefined 回退 // ArrayCreate,S 非构造器抛 TypeError,否则以 S 构造。 - let species_key = make_well_known_symbol_key(10); + let species_key = encode_symbol_key(vm.realm_id(), 10); let s = match vm.ordinary_get(unsafe { &*c.as_js_object_ptr() }, species_key, c) { Ok(v) => v, Err(msg) => return Err(from_engine_error(vm, &msg)), diff --git a/crates/oxide_builtins/src/disposable_stack.rs b/crates/oxide_builtins/src/disposable_stack.rs index 60ec79a8..316c5f39 100644 --- a/crates/oxide_builtins/src/disposable_stack.rs +++ b/crates/oxide_builtins/src/disposable_stack.rs @@ -13,7 +13,7 @@ use oxide_kernel::shape_forge::EMPTY_SHAPE_ID; use oxide_types::object::JsObject; -use oxide_types::private_key::make_well_known_symbol_key; +use oxide_types::private_key::encode_symbol_key; use oxide_types::value::JsValue; use oxide_runtime_api::{NativeResult, VmHost}; @@ -178,7 +178,7 @@ pub fn disposable_stack_use(vm: &mut H, args: &[u8]) -> NativeResult return NativeResult::Err(crate::error::create_type_error(vm, "value is not an Object")); } let value_obj = unsafe { &*value.as_js_object_ptr() }; - let dispose_key = oxide_types::private_key::make_well_known_symbol_key(12); + let dispose_key = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 12); let method = match vm.ordinary_get(value_obj, dispose_key, value) { Ok(m) => m, Err(err) => return NativeResult::Err(crate::iterator::engine_error(vm, &err)), @@ -263,14 +263,14 @@ pub fn async_disposable_stack_use(vm: &mut H, args: &[u8]) -> NativeR return NativeResult::Err(crate::error::create_type_error(vm, "value is not an Object")); } let value_obj = unsafe { &*value.as_js_object_ptr() }; - let async_dispose_key = make_well_known_symbol_key(11); + let async_dispose_key = encode_symbol_key(vm.realm_id(), 11); let method = match vm.ordinary_get(value_obj, async_dispose_key, value) { Ok(m) => m, Err(err) => return NativeResult::Err(crate::iterator::engine_error(vm, &err)), }; if method.is_null() || method.is_undefined() { // 键 11 缺失:回落读 @@dispose(读取顺序测试断言键 11 先、键 12 后)。 - let dispose_key = make_well_known_symbol_key(12); + let dispose_key = encode_symbol_key(vm.realm_id(), 12); let sync_method = match vm.ordinary_get(value_obj, dispose_key, value) { Ok(m) => m, Err(err) => return NativeResult::Err(crate::iterator::engine_error(vm, &err)), diff --git a/crates/oxide_builtins/src/iterator.rs b/crates/oxide_builtins/src/iterator.rs index 338e8c1b..41886df8 100644 --- a/crates/oxide_builtins/src/iterator.rs +++ b/crates/oxide_builtins/src/iterator.rs @@ -1,6 +1,6 @@ use oxide_kernel::shape_forge::EMPTY_SHAPE_ID; use oxide_types::object::{JsObject, PropAttributes}; -use oxide_types::private_key::{make_int_key, make_well_known_symbol_key}; +use oxide_types::private_key::{encode_symbol_key, make_int_key}; use oxide_types::value::JsValue; use oxide_runtime_api::{to_object, NativeResult, VmHost}; @@ -135,7 +135,7 @@ pub fn iterator_constructor_setter(vm: &mut H, args: &[u8]) -> Native /// `Symbol.toStringTag` 访问器的 setter(键为 `@@toStringTag`)。 pub fn iterator_to_string_tag_setter(vm: &mut H, args: &[u8]) -> NativeResult { - iterator_setter_ignore_proto_props(vm, args, make_well_known_symbol_key(9)) + iterator_setter_ignore_proto_props(vm, args, encode_symbol_key(vm.realm_id(), 9)) } /// `%IteratorPrototype%[@@dispose]`:GetMethod(this, "return"),有则调用并返回 @@ -406,7 +406,7 @@ fn get_iterator_flattenable(vm: &mut H, value: JsValue) -> Result<(Js return Err(crate::error::create_type_error(vm, "iterator mapper result is not an object")); } let obj = unsafe { &*value.as_js_object_ptr() }; - let sym_iter_si = make_well_known_symbol_key(0); + let sym_iter_si = encode_symbol_key(vm.realm_id(), 0); let method = match vm.ordinary_get(obj, sym_iter_si, value) { Ok(m) => m, Err(err) => return Err(engine_error(vm, &err)), @@ -1408,7 +1408,7 @@ pub(crate) fn peek_iterator_method(vm: &mut H, value: JsValue) -> Res let proto_ptr = vm.session().builtin_world().string_proto.as_ptr() as *mut JsObject; // SAFETY: string_proto 是 BuiltinWorld 长驻原型对象,进程内有效且不被 GC 搬移。 let proto_obj = unsafe { &*proto_ptr }; - let sym_iter_si = make_well_known_symbol_key(0); + let sym_iter_si = encode_symbol_key(vm.realm_id(), 0); let method = match vm.ordinary_get(proto_obj, sym_iter_si, value) { Ok(m) => m, Err(err) => { @@ -1442,7 +1442,7 @@ pub(crate) fn peek_iterator_method(vm: &mut H, value: JsValue) -> Res }; if recv.is_object() { let obj = unsafe { &*recv.as_js_object_ptr() }; - let sym_iter_si = make_well_known_symbol_key(0); + let sym_iter_si = encode_symbol_key(vm.realm_id(), 0); let method = match vm.ordinary_get(obj, sym_iter_si, value) { Ok(m) => m, Err(err) => { @@ -1542,7 +1542,7 @@ fn get_iterator(vm: &mut H, value: JsValue) -> Result m, Err(err) => { @@ -1623,7 +1623,7 @@ fn get_iterator(vm: &mut H, value: JsValue) -> Result m, Err(err) => { diff --git a/crates/oxide_builtins/src/map.rs b/crates/oxide_builtins/src/map.rs index e37dded2..93a18bc9 100644 --- a/crates/oxide_builtins/src/map.rs +++ b/crates/oxide_builtins/src/map.rs @@ -512,7 +512,7 @@ pub fn map_group_by(vm: &mut H, args: &[u8]) -> NativeResult { Err(msg) => return NativeResult::Err(crate::error::create_type_error(vm, &msg)), }; let items_ptr = items_obj.as_js_object_ptr(); - let sym_iter_si = oxide_types::private_key::make_well_known_symbol_key(0); + let sym_iter_si = oxide_types::private_key::encode_symbol_key(vm.realm_id(), 0); let iter_method = match unsafe { vm.ordinary_get(&*items_ptr, sym_iter_si, items_val) } { Ok(m) => m, Err(e) => return NativeResult::Err(crate::iterator::engine_error(vm, &e)), diff --git a/crates/oxide_builtins/src/module.rs b/crates/oxide_builtins/src/module.rs index 1a7bca97..e2624bc0 100644 --- a/crates/oxide_builtins/src/module.rs +++ b/crates/oxide_builtins/src/module.rs @@ -9,7 +9,7 @@ use oxide_kernel::shape_forge::EMPTY_SHAPE_ID; use oxide_runtime_api::{NativeResult, VmHost}; use oxide_types::object::{Cell, JsObject, PropAttributes, PropMetaEntry}; -use oxide_types::private_key::make_well_known_symbol_key; +use oxide_types::private_key::encode_symbol_key; use oxide_types::value::JsValue; /// `Symbol.toStringTag` 在 well-known symbol 表中的序号,命名空间标签键按其编码。 @@ -326,7 +326,7 @@ pub fn module_pre_register(vm: &mut H, args: &[u8]) -> NativeResult { /// `module_set`/`module_star` 的瞬态可扩展窗口旁路,其余写/定义一律拒绝。 pub fn module_object(vm: &mut H, _args: &[u8]) -> NativeResult { let obj = vm.alloc_object(JsObject::new_empty(EMPTY_SHAPE_ID, JsValue::null())); - let tag_si = make_well_known_symbol_key(TO_STRING_TAG_SYMBOL_ID); + let tag_si = encode_symbol_key(vm.realm_id(), TO_STRING_TAG_SYMBOL_ID); let tag_val = vm.new_string("Module"); let obj_ref = unsafe { &mut *obj }; if let Err(e) = vm.define_data_property(obj_ref, tag_si, tag_val, PropAttributes::new(false, false, false)) { diff --git a/crates/oxide_builtins/src/object.rs b/crates/oxide_builtins/src/object.rs index 4555b954..6269740a 100644 --- a/crates/oxide_builtins/src/object.rs +++ b/crates/oxide_builtins/src/object.rs @@ -2,8 +2,8 @@ use oxide_kernel::shape_forge::{ShapeForge, EMPTY_SHAPE_ID}; use oxide_kernel::string_forge::PermInterner; use oxide_types::object::{JsObject, PropAttributes, PropMetaEntry}; use oxide_types::private_key::{ - int_key_value, is_int_key, is_private_name_key, is_symbol_key, make_int_key, make_well_known_symbol_key, - symbol_index_from_key, well_known_symbol_id_from_key, INT_KEY_COUNT, + decode_symbol_key, encode_symbol_key, int_key_value, is_int_key, is_private_name_key, is_symbol_key, make_int_key, + INT_KEY_COUNT, }; use oxide_types::value::JsValue; @@ -178,13 +178,11 @@ pub(crate) fn walk_own_symbol_keys(vm: &H, obj: &JsObject) -> Vec<(u3 keys } -/// 把 Symbol 键反解为对应的 Symbol 值:well-known 键还原为对应下标的符号原语, -/// 用户 symbol 键按偏移还原为 `JsValue::symbol` 值。 -fn decode_symbol_key(key: u32) -> JsValue { - if let Some(id) = well_known_symbol_id_from_key(key) { - return JsValue::symbol(id); - } - JsValue::symbol(symbol_index_from_key(key)) +/// 把 Symbol 键反解为对应的 Symbol 值:键自含 realm 编号与局部下标, +/// 直接还原为 realm 感知符号值,无需外部上下文。 +fn symbol_key_to_value(key: u32) -> JsValue { + let (realm_id, local_index) = decode_symbol_key(key); + JsValue::symbol_realm(realm_id, local_index) } /// 收集对象自身全部 Symbol 键并按插入序物化为 Symbol 值。 @@ -200,7 +198,7 @@ fn decode_symbol_key(key: u32) -> JsValue { pub fn own_symbol_key_values(vm: &H, obj: &JsObject) -> Vec { walk_own_symbol_keys(vm, obj) .iter() - .map(|(key, _)| decode_symbol_key(*key)) + .map(|(key, _)| symbol_key_to_value(*key)) .collect() } @@ -1957,7 +1955,7 @@ pub fn object_proto_to_string(vm: &mut H, args: &[u8]) -> NativeResul }; // @@toStringTag 为字符串时覆盖品牌名;非字符串(含缺失)回退品牌名, // getter 抛错透传原异常。 - let tag_key = make_well_known_symbol_key(9); + let tag_key = encode_symbol_key(vm.realm_id(), 9); match vm.ordinary_get(obj, tag_key, obj_val) { Ok(v) => { // 先把 tag 字符串取出(结束对 vm 的不可变借用),再拼结果串。 @@ -2183,7 +2181,7 @@ pub fn object_group_by(vm: &mut H, args: &[u8]) -> NativeResult { Err(msg) => return NativeResult::Err(crate::error::create_type_error(vm, &msg)), }; let items_ptr = items_obj.as_js_object_ptr(); - let sym_iter_si = make_well_known_symbol_key(0); + let sym_iter_si = encode_symbol_key(vm.realm_id(), 0); let iter_method = match unsafe { vm.ordinary_get(&*items_ptr, sym_iter_si, items_val) } { Ok(m) => m, Err(e) => return NativeResult::Err(crate::iterator::engine_error(vm, &e)), diff --git a/crates/oxide_builtins/src/symbol.rs b/crates/oxide_builtins/src/symbol.rs index 7033cea5..5cb232dc 100644 --- a/crates/oxide_builtins/src/symbol.rs +++ b/crates/oxide_builtins/src/symbol.rs @@ -48,7 +48,7 @@ pub fn symbol_constructor(vm: &mut H, args: &[u8]) -> NativeResult { }; let idx = vm.symbol_intern(description); - NativeResult::Ok(JsValue::symbol(idx)) + NativeResult::Ok(JsValue::symbol_realm(vm.realm_id(), idx)) } /// `Symbol.prototype.toString`:返回 `Symbol(description)` 形式字符串。 @@ -89,7 +89,7 @@ pub fn symbol_to_string(vm: &mut H, args: &[u8]) -> NativeResult { Ok(v) => v, Err(e) => return NativeResult::Err(e), }; - let idx = sym.as_symbol_index(); + let idx = sym.as_symbol_local_index(); let desc = vm.symbol_description(idx).unwrap_or_default(); let result = format!("Symbol({})", desc); NativeResult::Ok(vm.new_string_owned(result)) @@ -127,7 +127,7 @@ pub fn symbol_description_getter(vm: &mut H, args: &[u8]) -> NativeRe Ok(v) => v, Err(e) => return NativeResult::Err(e), }; - let idx = sym.as_symbol_index(); + let idx = sym.as_symbol_local_index(); match vm.symbol_description(idx) { Some(desc) => NativeResult::Ok(vm.new_string_owned(desc)), None => NativeResult::Ok(JsValue::undefined()), @@ -153,12 +153,12 @@ pub fn symbol_for(vm: &mut H, args: &[u8]) -> NativeResult { }; if let Some(idx) = vm.symbol_lookup_global(&key) { - return NativeResult::Ok(JsValue::symbol(idx)); + return NativeResult::Ok(JsValue::symbol_realm(vm.realm_id(), idx)); } let idx = vm.symbol_intern(Some(key.clone())); vm.symbol_register_global(key, idx); - NativeResult::Ok(JsValue::symbol(idx)) + NativeResult::Ok(JsValue::symbol_realm(vm.realm_id(), idx)) } /// `Symbol.keyFor(sym)`:返回全局注册表中该 Symbol 的 key;未登记返回 undefined。 @@ -169,7 +169,7 @@ pub fn symbol_key_for(vm: &mut H, args: &[u8]) -> NativeResult { return NativeResult::Err(crate::error::create_type_error(vm, "is not a symbol")); } - let idx = sym.as_symbol_index(); + let idx = sym.as_symbol_local_index(); match vm.symbol_key_for_id(idx) { Some(key) => NativeResult::Ok(vm.new_string(&key)), None => NativeResult::Ok(JsValue::undefined()),