mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-25 03:01:12 +08:00
feat: 落地 ShadowRealm 构造器原型与实例及 not supported 桩
This commit is contained in:
@@ -8,7 +8,7 @@ use super::frames::Completion;
|
||||
use super::Vm;
|
||||
use crate::session_gc::SessionGc;
|
||||
|
||||
/// GC 根组来源:`for_each_value` 枚举的 29 个根组,变体顺序与根清单
|
||||
/// GC 根组来源:`for_each_value` 枚举的 30 个根组,变体顺序与根清单
|
||||
/// 的枚举顺序一致。
|
||||
///
|
||||
/// 变体下标是逐组计数数组(`SessionGc::root_counts`)的下标;`COUNT` 与
|
||||
@@ -41,6 +41,7 @@ pub(crate) enum RootGroup {
|
||||
ForInIters,
|
||||
Global,
|
||||
WorkerObjects,
|
||||
ShadowRealmObjects,
|
||||
DisposeStack,
|
||||
EventTargets,
|
||||
ModuleEvalStates,
|
||||
@@ -48,7 +49,7 @@ pub(crate) enum RootGroup {
|
||||
|
||||
impl RootGroup {
|
||||
/// 根组总数(与变体数同源,绑定逐组计数数组的长度)。
|
||||
pub const COUNT: usize = 29;
|
||||
pub const COUNT: usize = 30;
|
||||
}
|
||||
|
||||
impl Vm {
|
||||
@@ -56,7 +57,7 @@ impl Vm {
|
||||
/// 覆盖执行核心的全部 JsValue 持有点:regs/帧/各栈段/cell/在途异常与完成/
|
||||
/// 挂起信号/迭代器/微任务/global/Worker 对象注册表。
|
||||
///
|
||||
/// 闭包接收根组来源(`RootGroup`)与根值:组是枚举顺序中的 29 根组之一,
|
||||
/// 闭包接收根组来源(`RootGroup`)与根值:组是枚举顺序中的 30 根组之一,
|
||||
/// 调用方按组计数(如 `SessionGc` 的逐组计数)。
|
||||
pub(crate) fn for_each_value(&self, mut f: impl FnMut(RootGroup, JsValue)) {
|
||||
for value in &self.regs {
|
||||
@@ -186,6 +187,11 @@ impl Vm {
|
||||
for &worker_obj in self.worker_objects.values() {
|
||||
f(RootGroup::WorkerObjects, worker_obj);
|
||||
}
|
||||
// ShadowRealm 实例注册表:实例对象是 GC 根(注册表保活至 full_reset
|
||||
// 清表),漏根 → sweep 释放 → brand 校验解引用悬垂。
|
||||
for (instance_obj, _) in self.shadow_realm_objects.values() {
|
||||
f(RootGroup::ShadowRealmObjects, *instance_obj);
|
||||
}
|
||||
// EventTarget 监听器注册表:监听器回调是 GC 根(存活目标的回调随目标存活,
|
||||
// 漏根 → 回调被 sweep 释放 → 派发解引用悬垂)。弱键剪枝见 sweep;此处
|
||||
// 无条件标活全部回调(死目标的回调多活一轮收集,非泄漏,sweep 已剪其条目)。
|
||||
|
||||
@@ -477,6 +477,10 @@ pub struct Vm {
|
||||
/// 是 GC 根(`for_each_value` 遍历),注册表保活至 `worker_terminate` /
|
||||
/// `full_reset` 清表,无悬垂风险。
|
||||
pub(crate) worker_objects: std::collections::HashMap<u64, JsValue>,
|
||||
/// ShadowRealm 实例注册表:键 = 影子 realm 编号,值 = (实例对象,影子
|
||||
/// Vm)。实例对象是 GC 根(`for_each_value` 遍历);影子 Vm 不跨线程,
|
||||
/// 随主 Vm 整体迁移,在 `full_reset` / `Drop` 清表时统一释放。
|
||||
pub(crate) shadow_realm_objects: std::collections::HashMap<u64, (JsValue, Vm)>,
|
||||
}
|
||||
|
||||
impl Drop for Vm {
|
||||
@@ -534,6 +538,10 @@ impl Drop for Vm {
|
||||
// 条目自持模块 Arc 与常量 BigInt 存储(Vec<BigInt>),存储随 Vm 整体迁移
|
||||
// (同不变量 1 条款:Vm 独占分配、地址稳定、跨线程移动不悬垂);键是
|
||||
// Arc 指针身份,条目自持 Arc 保证键指针在条目存活期内不被分配器复用。
|
||||
//
|
||||
// 8. shadow_realm_objects 字段(HashMap<u64, (JsValue, Vm)>):实例对象指针
|
||||
// 归不变量 1 覆盖;影子 Vm 各持独立 session 堆、不跨线程共享(同不变量 1
|
||||
// 与 3 条款),随主 Vm 整体迁移、地址稳定不悬垂。
|
||||
unsafe impl Send for Vm {}
|
||||
|
||||
impl Vm {
|
||||
|
||||
Reference in New Issue
Block a user