mirror of
https://github.com/pjh456/OxideJS.git
synced 2026-10-23 18:21:13 +08:00
refactor: 退役 promise 结算传导链 promoted_clone 字段与死分支
This commit is contained in:
@@ -35,7 +35,6 @@ impl Vm {
|
||||
resolve_fn: JsValue::undefined(),
|
||||
reject_fn: JsValue::undefined(),
|
||||
already_resolved: false,
|
||||
promoted_clone: std::ptr::null_mut(),
|
||||
});
|
||||
obj.set_native_data(Box::into_raw(state) as *mut u8);
|
||||
JsValue::from_js_object(ptr)
|
||||
@@ -431,7 +430,6 @@ fn promise_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
|
||||
resolve_fn: resolve,
|
||||
reject_fn: reject,
|
||||
already_resolved: false,
|
||||
promoted_clone: std::ptr::null_mut(),
|
||||
});
|
||||
obj.set_native_data(Box::into_raw(state) as *mut u8);
|
||||
match vm.call_function_sync(executor, JsValue::undefined(), &[resolve, reject]) {
|
||||
|
||||
@@ -1,6 +1,4 @@
|
||||
//! Promise 状态盒的 session GC 支撑:值边、字节核算与释放三类接线。
|
||||
//!
|
||||
//! 结算链指针是裸指针边、不是 JsValue。
|
||||
|
||||
use oxide_types::object::JsObject;
|
||||
use oxide_types::value::JsValue;
|
||||
@@ -17,11 +15,6 @@ pub(crate) fn promise_native_edges(obj: &JsObject) -> Vec<JsValue> {
|
||||
edges.push(state.result);
|
||||
edges.push(state.resolve_fn);
|
||||
edges.push(state.reject_fn);
|
||||
// 结算链指针:克隆恒为 session 表成员,凭这条边在原件/旧克隆仍存活时被
|
||||
// 同轮置活,结算传导不会读到悬垂克隆。
|
||||
if !state.promoted_clone.is_null() {
|
||||
edges.push(JsValue::from_js_object(state.promoted_clone));
|
||||
}
|
||||
for r in &state.reactions {
|
||||
edges.push(r.promise);
|
||||
edges.push(r.resolve);
|
||||
|
||||
@@ -49,12 +49,6 @@ pub(crate) struct PromiseState {
|
||||
/// resolve/reject 是否已被调用过(Resolve Promise Functions 的 alreadyResolved)。
|
||||
/// 首次调用后置位,后续任何 resolve/reject(含 thenable 委托期间)均 no-op。
|
||||
pub already_resolved: bool,
|
||||
/// 结算传导链指针:非空时指向本 promise 晋升出的 session 克隆,原件结算时
|
||||
/// 结果沿它传导到克隆;再晋升场景旧克隆的残留反应被取回归并进新克隆,
|
||||
/// 指针更新为最新克隆。非 pending 原件恒为空指针。本指针在
|
||||
/// `promise_native_edges` 登记为 mark 边:克隆恒为 session 表成员,凭这条
|
||||
/// 边在原件仍存活时被同轮置活,结算不会读到悬垂克隆。
|
||||
pub promoted_clone: *mut JsObject,
|
||||
}
|
||||
|
||||
/// 一条微任务(job)。
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
//! PromiseResolve / fulfill / reject 结算路径。
|
||||
//!
|
||||
//! 结算单次性:闭包首调置位 `already_resolved`,`state != Pending`
|
||||
//! 最终守卫;结算后反应入微任务队列,并沿 `promoted_clone` 链传导克隆。
|
||||
//! 最终守卫;结算后反应入微任务队列。
|
||||
|
||||
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
|
||||
use oxide_runtime_api::NativeResult;
|
||||
@@ -267,15 +267,6 @@ impl Vm {
|
||||
reject: r.reject,
|
||||
});
|
||||
}
|
||||
// 原件若已晋升出克隆,把结算传导到克隆:克隆上晋升后新挂的反应方随此触发
|
||||
// (顶层 var 读克隆,原件反应已在本处直接触发,不重复传导)。
|
||||
// SAFETY: 同一 `state_ptr`,前块可变借用已结束;盒仍存活,promoted_clone
|
||||
// 由 promise_native_edges 的 mark 边保证同轮存活(mod.rs 模块头不变量)。
|
||||
let clone_ptr = unsafe { (*state_ptr).promoted_clone };
|
||||
if !clone_ptr.is_null() {
|
||||
let clone = JsValue::from_js_object(clone_ptr);
|
||||
let _ = self.fulfill_promise(clone, value);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -302,14 +293,6 @@ impl Vm {
|
||||
reject: r.reject,
|
||||
});
|
||||
}
|
||||
// 原件若已晋升出克隆,把拒绝传导到克隆(同 fulfill:顶层 var 读克隆)。
|
||||
// SAFETY: 同一 `state_ptr`,前块可变借用已结束;盒仍存活,promoted_clone
|
||||
// 由 promise_native_edges 的 mark 边保证同轮存活(mod.rs 模块头不变量)。
|
||||
let clone_ptr = unsafe { (*state_ptr).promoted_clone };
|
||||
if !clone_ptr.is_null() {
|
||||
let clone = JsValue::from_js_object(clone_ptr);
|
||||
let _ = self.reject_promise(clone, reason);
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user