mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-26 19:51:11 +08:00
refactor: 运行时符号键调用点改经 realm 维度编码
This commit is contained in:
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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 (),
|
||||
);
|
||||
|
||||
@@ -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) => {
|
||||
|
||||
Reference in New Issue
Block a user