refactor: 退役 promise 结算传导链 promoted_clone 字段与死分支

This commit is contained in:
2026-10-03 00:13:39 +00:00
parent 26a46f802b
commit bd7426b23b
4 changed files with 1 additions and 33 deletions
@@ -35,7 +35,6 @@ impl Vm {
resolve_fn: JsValue::undefined(), resolve_fn: JsValue::undefined(),
reject_fn: JsValue::undefined(), reject_fn: JsValue::undefined(),
already_resolved: false, already_resolved: false,
promoted_clone: std::ptr::null_mut(),
}); });
obj.set_native_data(Box::into_raw(state) as *mut u8); obj.set_native_data(Box::into_raw(state) as *mut u8);
JsValue::from_js_object(ptr) JsValue::from_js_object(ptr)
@@ -431,7 +430,6 @@ fn promise_constructor(vm: &mut Vm, args: &[u8]) -> NativeResult {
resolve_fn: resolve, resolve_fn: resolve,
reject_fn: reject, reject_fn: reject,
already_resolved: false, already_resolved: false,
promoted_clone: std::ptr::null_mut(),
}); });
obj.set_native_data(Box::into_raw(state) as *mut u8); obj.set_native_data(Box::into_raw(state) as *mut u8);
match vm.call_function_sync(executor, JsValue::undefined(), &[resolve, reject]) { match vm.call_function_sync(executor, JsValue::undefined(), &[resolve, reject]) {
-7
View File
@@ -1,6 +1,4 @@
//! Promise 状态盒的 session GC 支撑:值边、字节核算与释放三类接线。 //! Promise 状态盒的 session GC 支撑:值边、字节核算与释放三类接线。
//!
//! 结算链指针是裸指针边、不是 JsValue。
use oxide_types::object::JsObject; use oxide_types::object::JsObject;
use oxide_types::value::JsValue; 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.result);
edges.push(state.resolve_fn); edges.push(state.resolve_fn);
edges.push(state.reject_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 { for r in &state.reactions {
edges.push(r.promise); edges.push(r.promise);
edges.push(r.resolve); edges.push(r.resolve);
-6
View File
@@ -49,12 +49,6 @@ pub(crate) struct PromiseState {
/// resolve/reject 是否已被调用过(Resolve Promise Functions 的 alreadyResolved)。 /// resolve/reject 是否已被调用过(Resolve Promise Functions 的 alreadyResolved)。
/// 首次调用后置位,后续任何 resolve/reject(含 thenable 委托期间)均 no-op。 /// 首次调用后置位,后续任何 resolve/reject(含 thenable 委托期间)均 no-op。
pub already_resolved: bool, pub already_resolved: bool,
/// 结算传导链指针:非空时指向本 promise 晋升出的 session 克隆,原件结算时
/// 结果沿它传导到克隆;再晋升场景旧克隆的残留反应被取回归并进新克隆,
/// 指针更新为最新克隆。非 pending 原件恒为空指针。本指针在
/// `promise_native_edges` 登记为 mark 边:克隆恒为 session 表成员,凭这条
/// 边在原件仍存活时被同轮置活,结算不会读到悬垂克隆。
pub promoted_clone: *mut JsObject,
} }
/// 一条微任务(job)。 /// 一条微任务(job)。
+1 -18
View File
@@ -2,7 +2,7 @@
//! PromiseResolve / fulfill / reject 结算路径。 //! PromiseResolve / fulfill / reject 结算路径。
//! //!
//! 结算单次性:闭包首调置位 `already_resolved`,`state != Pending` //! 结算单次性:闭包首调置位 `already_resolved`,`state != Pending`
//! 最终守卫;结算后反应入微任务队列,并沿 `promoted_clone` 链传导克隆。 //! 最终守卫;结算后反应入微任务队列。
use oxide_kernel::shape_forge::EMPTY_SHAPE_ID; use oxide_kernel::shape_forge::EMPTY_SHAPE_ID;
use oxide_runtime_api::NativeResult; use oxide_runtime_api::NativeResult;
@@ -267,15 +267,6 @@ impl Vm {
reject: r.reject, 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(()) Ok(())
} }
@@ -302,14 +293,6 @@ impl Vm {
reject: r.reject, 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(()) Ok(())
} }