docs: 改写五处 epoch 悬垂注释对齐统一入口分配语义

This commit is contained in:
2026-10-04 11:30:00 +00:00
parent b5a0582843
commit b8b38dbf28
2 changed files with 5 additions and 6 deletions
+1 -1
View File
@@ -159,7 +159,7 @@ pub(crate) struct PendingAsyncEscape {
/// 基于寄存器的 JS 虚拟机:持有执行状态、寄存器文件、调用栈与 session 内存。 /// 基于寄存器的 JS 虚拟机:持有执行状态、寄存器文件、调用栈与 session 内存。
/// ///
/// 执行入口为 [`Vm::run`](见 `vm_runtime` 模块);内存模型为 epoch arena + /// 执行入口为 [`Vm::run`](见 `vm_runtime` 模块);内存模型为统一入口分配 +
/// session 对象(可被 `SessionGc` 移动式回收)+ session 字符串。多数内部字段为 /// session 对象(可被 `SessionGc` 移动式回收)+ session 字符串。多数内部字段为
/// `pub(crate)`,对外提供统计与内省 getter。 /// `pub(crate)`,对外提供统计与内省 getter。
pub struct Vm { pub struct Vm {
+4 -5
View File
@@ -330,7 +330,7 @@ impl Vm {
/// 用于在多次 JS 执行之间达到完全隔离:session 内未被污染的 builtin 保留原指针。 /// 用于在多次 JS 执行之间达到完全隔离:session 内未被污染的 builtin 保留原指针。
pub fn full_reset(&mut self) { pub fn full_reset(&mut self) {
// 防御兜底:属性值写原语已推进 generation,常规覆盖写由快照对比发现; // 防御兜底:属性值写原语已推进 generation,常规覆盖写由快照对比发现;
// 若未来出现绕过属性写原语的裸属性区改写,session 对象会随 epoch 释放, // 若未来出现绕过属性写原语的裸属性区改写,session 对象会被 session GC 回收,
// 保留 global 将持悬垂指针,故带 session 对象时强制 bump 保证 global 重建。 // 保留 global 将持悬垂指针,故带 session 对象时强制 bump 保证 global 重建。
if !self.gc_state.session_object_ptrs.is_empty() { if !self.gc_state.session_object_ptrs.is_empty() {
let global_ptr = self.session.global_object().as_ptr() as *mut JsObject; let global_ptr = self.session.global_object().as_ptr() as *mut JsObject;
@@ -466,7 +466,7 @@ impl Vm {
// - 清空寄存器文件、pc、帧/迭代器栈、保存的执行栈、try 处理器、 // - 清空寄存器文件、pc、帧/迭代器栈、保存的执行栈、try 处理器、
// 待处理异常、native 调用深度与 IC 命中/未命中计数。 // 待处理异常、native 调用深度与 IC 命中/未命中计数。
// - 保留 kernel 共享状态不变。 // - 保留 kernel 共享状态不变。
// - `reset()` 额外清空 bytecode/constants 并重置 epoch 归属。 // - `reset()` 额外清空 bytecode/constants 并重置 run 分配包络。
self.regs = [JsValue::undefined(); 256]; self.regs = [JsValue::undefined(); 256];
self.pc = 0; self.pc = 0;
self.frames.clear(); self.frames.clear();
@@ -483,7 +483,7 @@ impl Vm {
self.cell_stack.clear(); self.cell_stack.clear();
self.try_stack.clear(); self.try_stack.clear();
self.exception_value = None; self.exception_value = None;
// 未捕获异常侧通道持原始 epoch 对象指针:执行期状态,跨 run/reset 不保留, // 未捕获异常侧通道持原始 session 对象指针:执行期状态,跨 run/reset 不保留,
// 池回收后残留将悬垂。 // 池回收后残留将悬垂。
self.last_uncaught_value = None; self.last_uncaught_value = None;
self.pending_length_exception = None; self.pending_length_exception = None;
@@ -728,8 +728,7 @@ impl Vm {
JsValue::from_js_object(self.session.builtin_world().object_proto.as_ptr() as *mut JsObject) JsValue::from_js_object(self.session.builtin_world().object_proto.as_ptr() as *mut JsObject)
}; };
// prototype 子对象与函数本体同走 session 分配:`f.prototype === // prototype 子对象与函数本体同走 session 分配:`f.prototype ===
// globalThis.f.prototype` 要求两侧同一对象,epoch 分配会在逃逸写时 // globalThis.f.prototype` 要求两侧同一对象,逃逸写不会克隆出第二份。
// 被递归克隆出第二份。
let prototype = JsObject::new_empty(EMPTY_SHAPE_ID, proto_of_proto); let prototype = JsObject::new_empty(EMPTY_SHAPE_ID, proto_of_proto);
let prototype_obj = self.alloc_session_object(prototype); let prototype_obj = self.alloc_session_object(prototype);
let prototype_val = JsValue::from_js_object(prototype_obj); let prototype_val = JsValue::from_js_object(prototype_obj);