feat: 落地 ShadowRealm 构造器原型与实例及 not supported 桩

This commit is contained in:
2026-10-19 02:01:17 +00:00
parent 8307480485
commit 866c8d1fb1
9 changed files with 415 additions and 25 deletions
+9 -3
View File
@@ -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 已剪其条目)。
+8
View File
@@ -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 {