refactor: 运行时符号键调用点改经 realm 维度编码

This commit is contained in:
2026-10-07 03:22:52 +00:00
parent 9b2ac86dbe
commit 30a5600466
12 changed files with 71 additions and 63 deletions
+5 -14
View File
@@ -10,10 +10,7 @@
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
use oxide_runtime_api::NativeResult;
use oxide_types::object::{JsObject, NativeFnPtr, PropAttributes};
use oxide_types::private_key::{
is_symbol_key, make_int_key, make_symbol_key, make_well_known_symbol_key, symbol_index_from_key,
well_known_symbol_id_from_key, WELL_KNOWN_SYMBOL_COUNT,
};
use oxide_types::private_key::{decode_symbol_key, encode_symbol_key, is_symbol_key, make_int_key};
use oxide_types::value::JsValue;
use crate::native::NativeFn;
@@ -671,12 +668,7 @@ fn perform_promise_combine_keyed(
// 换算绝对存储下标,与 walk_own_keys 口径一致)。
let mut all_keys = oxide_builtins::object::walk_own_keys(vm, promises_obj);
for sym in oxide_builtins::object::own_symbol_key_values(vm, promises_obj) {
let idx = sym.as_symbol_index();
let si = if idx < WELL_KNOWN_SYMBOL_COUNT {
make_well_known_symbol_key(idx)
} else {
make_symbol_key(idx)
};
let si = encode_symbol_key(vm.realm_id(), sym.as_symbol_index());
if let Some(pos) = vm.kernel_core.shape_forge().lookup_position(promises_obj.shape_id(), si) {
let store = if promises_obj.is_array() { promises_obj.array_prop_count + pos } else { pos };
all_keys.push((si, store));
@@ -759,10 +751,9 @@ fn perform_promise_combine_keyed(
/// 键 si 物化为 JS 可见键值:字符串 / 数字串经文本还原,符号键还原为符号值。
fn key_si_to_key_value(vm: &mut Vm, si: u32) -> JsValue {
if is_symbol_key(si) {
if let Some(id) = well_known_symbol_id_from_key(si) {
return JsValue::symbol(id);
}
return JsValue::symbol(symbol_index_from_key(si));
// 键自含 realm 编号:解出 (realm 编号, 全局下标) 还原符号值,无需外部上下文。
let (realm_id, idx) = decode_symbol_key(si);
return JsValue::symbol_realm(realm_id, idx);
}
oxide_builtins::object::key_si_to_js_value(vm, si)
}
+6 -2
View File
@@ -279,7 +279,8 @@ impl Vm {
("catch", promise_catch as *const (), 1),
("finally", promise_finally as *const (), 1),
);
let tag_key = oxide_types::private_key::make_well_known_symbol_key(
let tag_key = oxide_types::private_key::encode_symbol_key(
self.realm_id(),
oxide_types::private_key::WELL_KNOWN_SYMBOL_TO_STRING_TAG,
);
let tag_shape = sh.make_shape(proto.shape_id(), tag_key);
@@ -349,7 +350,10 @@ impl Vm {
&self.kernel_core,
&self.realm.session.borrow(),
ctor_mut,
oxide_types::private_key::make_well_known_symbol_key(oxide_types::private_key::WELL_KNOWN_SYMBOL_SPECIES),
oxide_types::private_key::encode_symbol_key(
self.realm_id(),
oxide_types::private_key::WELL_KNOWN_SYMBOL_SPECIES,
),
"get [Symbol.species]",
oxide_builtins::array::array_species_get::<crate::vm::Vm> as *const (),
);
+2 -2
View File
@@ -9,7 +9,7 @@
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
use oxide_runtime_api::NativeResult;
use oxide_types::object::{JsObject, NativeFnPtr, PropAttributes};
use oxide_types::private_key::{make_well_known_symbol_key, WELL_KNOWN_SYMBOL_SPECIES};
use oxide_types::private_key::{encode_symbol_key, WELL_KNOWN_SYMBOL_SPECIES};
use oxide_types::value::JsValue;
use crate::vm::Vm;
@@ -155,7 +155,7 @@ impl Vm {
}
// SAFETY: is_object 保证指针非空且指向存活对象;此处只读 @@species,不跨 GC/reset。
let c_obj = unsafe { &*ctor.as_js_object_ptr() };
let species_si = make_well_known_symbol_key(WELL_KNOWN_SYMBOL_SPECIES);
let species_si = encode_symbol_key(self.realm_id(), WELL_KNOWN_SYMBOL_SPECIES);
let s = match self.ordinary_get(c_obj, species_si, ctor) {
Ok(v) => v,
Err(e) => {