fix: 构造帧 super 状态改显式标志修复多层继承与 return 语义

derived 构造器 super 状态改由 CallFrame.super_called 显式标志承载,
取代依赖 regs[254] 值判定:多层继承中间 derived 帧由 SUPER_CALL 压入
this=构造对象,值判定三重失效(未调 super 不报错 / this-before-super
失效 / 合法 super() 误判 more-than-once)。父构造器正常返回经
construct_result_reg==Some(254) 识别置位调用方帧(该 ABI 不变量仅
SUPER_CALL 压帧满足),抛错走 unwind 不置位。

do_return 检查放宽为非对象返回值(含 undefined/null/原始值)且未调
super 时抛 ReferenceError(规范 §9.2.2.2),调过 super 回退构造 this。

super 构造器改取当前帧 callee 原型而非 newTarget 原型:newTarget 跨
SUPER_CALL 压帧保持为最外层类,取其原型在中间 derived 层解析回同一
父类导致无限压帧。
This commit is contained in:
2026-08-16 01:23:52 +08:00
parent 946c96472f
commit 0c6aa7fbef
7 changed files with 163 additions and 8 deletions
+2
View File
@@ -283,6 +283,7 @@ impl SuspendedFrame {
construct_result_reg: f.construct_result_reg,
constructed_this: f.constructed_this.map(&mut rewrite),
is_derived_constructor: f.is_derived_constructor,
super_called: f.super_called,
continuation: f.continuation,
}),
spill_stack: self.spill_stack.iter().copied().map(&mut rewrite).collect(),
@@ -343,6 +344,7 @@ mod tests {
construct_result_reg: None,
constructed_this: Some(tag),
is_derived_constructor: false,
super_called: false,
continuation: FrameContinuation::None,
}
}