fix: TA 构造形态改读构造入口标记替代寄存器推断

This commit is contained in:
2026-09-22 19:41:55 +00:00
parent b5b456346c
commit dce132acec
10 changed files with 94 additions and 12 deletions
+3
View File
@@ -106,6 +106,9 @@ impl Vm {
self.native_call_depth += 1;
let result = func(self, &arg_regs);
self.native_call_depth -= 1;
// 构造形态标记不跨 native 调用存活:本次调用内的置位(构造臂)
// 与清零(普通调用臂)在此收口,异常展开亦不残留。
self.constructing_native = false;
// 溢出区随本次调用结束截断回收,并还原外层的溢出区描述(嵌套调用安全)。
if args.len() > Self::SYNC_NATIVE_ARG_LIMIT {
self.spill_stack.truncate(overflow_base);
+7
View File
@@ -304,6 +304,13 @@ pub struct Vm {
/// 已做非对象回退 this)交付给恢复方(与 generator_dispatch 同语义,
/// 同样经 InlineSyncState 限定作用域于属主 dispatch)。
pub(crate) construct_dispatch: bool,
/// 当前 native 调用是否以构造形态发起(NEW/SUPER native 臂与
/// `construct_with` native 臂在调用前置 true,普通调用入口前置 false):
/// builtin 构造器(`typed_array_new`)据此判定向 receiver 物化,替代
/// 寄存器推断——native 调用与调用方共享寄存器文件,类构造器帧内的
/// new.target 槽会残留类构造器对象,按寄存器判定会把成员式普通调用
/// 误判为构造。调用结束即恢复/清零,不跨 native 调用存活。
pub(crate) constructing_native: bool,
/// 当前正在执行的异步生成器上下文对象(`OBJ_TYPE_ASYNC_GENERATOR`,持有
/// `AsyncGeneratorState` 快照)。AWAIT dispatch 据此登记异步生成器恢复反应;
/// 跨嵌套 async 调用保存/恢复(与 `async_context` 同生命周期,二者互斥占用)。
+3
View File
@@ -22,6 +22,9 @@ impl oxide_runtime_api::VmHost for Vm {
fn native_overflow_at(&self, i: usize) -> JsValue {
self.spill_stack[self.native_overflow_base + i]
}
fn constructing_native(&self) -> bool {
self.constructing_native
}
fn alloc_object(&mut self, obj: JsObject) -> *mut JsObject {
self.alloc_object(obj)
}