refactor: 退役内置盒克隆重写族死函数与孤儿辅助

This commit is contained in:
2026-10-02 20:35:48 +00:00
parent 43acaacd08
commit b76f2214f9
8 changed files with 17 additions and 358 deletions
+2 -56
View File
@@ -7,8 +7,8 @@
//! `type_tag` 为 `JsObject::OBJ_TYPE_DISPOSABLE_STACK`(同步)或
//! `OBJ_TYPE_ASYNC_DISPOSABLE_STACK`(异步)时区分接收者,`hint` 以 0/1 两值区分
//! 条目释放语义(定义见 `DisposeEntry.hint`),`wrap_sync` 标记 async 栈 use 落回
//! `@@dispose` 的条目(返回值丢弃、异常异步化)。GC 四函数
//! (edges/rewrite/clone/drop)供 session 层跨 epoch 追踪,签名与 Map/Promise
//! `@@dispose` 的条目(返回值丢弃、异常异步化)。GC 三函数
//! (edges/size/drop)接线 mark 边、字节账目与释放,形态与 Map/Promise
//! 状态盒同构。
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
@@ -579,60 +579,6 @@ pub fn dispose_edges(obj: &JsObject) -> Vec<JsValue> {
unsafe { (*ptr).entries.iter().flat_map(|entry| [entry.value, entry.method]).collect() }
}
/// 克隆状态盒到新对象,用 `rewrite` 改写其中的对象引用
/// (供跨 epoch 的对象重写/克隆流程使用)。
pub fn clone_dispose_native_with_rewrite<F>(src: &JsObject, dst: &mut JsObject, mut rewrite: F)
where
F: FnMut(JsValue) -> JsValue,
{
if !src.is_disposable_stack_obj() && !src.is_async_disposable_stack_obj() {
return;
}
let ptr = get_capability_ptr(src);
if ptr.is_null() {
dst.set_native_data(std::ptr::null_mut());
return;
}
// SAFETY: 同上,src 状态盒在 GC 移动期间仍存活。
let src_cap = unsafe { &*ptr };
let cloned = DisposeCapability {
state: src_cap.state,
entries: src_cap
.entries
.iter()
.map(|entry| DisposeEntry {
value: if entry.value.is_object() { rewrite(entry.value) } else { entry.value },
method: if entry.method.is_object() { rewrite(entry.method) } else { entry.method },
hint: entry.hint,
arg_style: entry.arg_style,
wrap_sync: entry.wrap_sync,
})
.collect(),
};
dst.set_native_data(Box::into_raw(Box::new(cloned)) as *mut u8);
}
/// 原地重写状态盒,用 `rewrite` 改写其中的对象引用。
pub fn rewrite_dispose_native<F>(obj: &mut JsObject, mut rewrite: F)
where
F: FnMut(JsValue) -> JsValue,
{
if !obj.is_disposable_stack_obj() && !obj.is_async_disposable_stack_obj() {
return;
}
let ptr = get_capability_ptr(obj);
if ptr.is_null() {
return;
}
// SAFETY: 同上,改写发生在 GC 移动/清扫期间,对象仍存活。
unsafe {
for entry in &mut (*ptr).entries {
entry.value = rewrite(entry.value);
entry.method = rewrite(entry.method);
}
}
}
/// 只读核算 DisposableStack 状态盒字节(不释放)。
pub fn disposable_stack_native_size(obj: &JsObject) -> u64 {
if !obj.is_disposable_stack_obj() && !obj.is_async_disposable_stack_obj() {