mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-25 11:11:11 +08:00
refactor: 退役三族挂起快照克隆重写与指针重写死函数
This commit is contained in:
@@ -1752,66 +1752,6 @@ pub(crate) fn async_generator_native_cell_edges(obj: &JsObject) -> Vec<*mut Cell
|
||||
out
|
||||
}
|
||||
|
||||
/// 用转发函数重写状态快照中的所有 JsValue(session GC 移动式清扫 / promote 用)。
|
||||
#[allow(dead_code)]
|
||||
pub(crate) fn rewrite_async_generator_native(obj: &JsObject, mut rewrite: impl FnMut(JsValue) -> JsValue) {
|
||||
let Some(state) = async_gen_state_mut(obj) else {
|
||||
return;
|
||||
};
|
||||
state.callee = rewrite(state.callee);
|
||||
for v in &mut state.args {
|
||||
*v = rewrite(*v);
|
||||
}
|
||||
state.result = rewrite(state.result);
|
||||
for req in state.queue.iter_mut() {
|
||||
req.promise = rewrite(req.promise);
|
||||
req.resolve = rewrite(req.resolve);
|
||||
req.reject = rewrite(req.reject);
|
||||
}
|
||||
if let Some(req) = &mut state.current {
|
||||
req.promise = rewrite(req.promise);
|
||||
req.resolve = rewrite(req.resolve);
|
||||
req.reject = rewrite(req.reject);
|
||||
}
|
||||
state.suspended.rewrite_values(rewrite);
|
||||
}
|
||||
|
||||
/// 深拷贝状态盒到新对象(promote / sweep 用):新对象持独立 Box,源盒可安全释放。
|
||||
#[allow(dead_code)]
|
||||
pub(crate) fn clone_async_generator_native_with_rewrite(
|
||||
old: &JsObject, new: &mut JsObject, mut rewrite: impl FnMut(JsValue) -> JsValue,
|
||||
) {
|
||||
let Some(state) = async_gen_state_mut(old) else {
|
||||
return;
|
||||
};
|
||||
let cloned = AsyncGeneratorState {
|
||||
phase: state.phase,
|
||||
callee: rewrite(state.callee),
|
||||
args: state.args.iter().copied().map(&mut rewrite).collect(),
|
||||
this_value: state.this_value,
|
||||
result: rewrite(state.result),
|
||||
queue: state
|
||||
.queue
|
||||
.iter()
|
||||
.map(|req| AsyncGenRequest {
|
||||
mode: req.mode,
|
||||
promise: rewrite(req.promise),
|
||||
resolve: rewrite(req.resolve),
|
||||
reject: rewrite(req.reject),
|
||||
})
|
||||
.collect(),
|
||||
current: state.current.as_ref().map(|req| AsyncGenRequest {
|
||||
mode: req.mode,
|
||||
promise: rewrite(req.promise),
|
||||
resolve: rewrite(req.resolve),
|
||||
reject: rewrite(req.reject),
|
||||
}),
|
||||
delegate_pending: state.delegate_pending,
|
||||
suspended: state.suspended.clone_with_rewrite(rewrite),
|
||||
};
|
||||
new.set_native_data(Box::into_raw(Box::new(cloned)) as *mut u8);
|
||||
}
|
||||
|
||||
/// 只读核算异步生成器状态盒字节(不释放),供 GC 账目核算。
|
||||
pub(crate) fn async_generator_native_size(obj: &JsObject) -> u64 {
|
||||
if !obj.is_async_generator_obj() {
|
||||
|
||||
Reference in New Issue
Block a user