fix(viperc/diag): 保留函数定义帧,不覆盖栈帧位置(补齐“定义帧 + 出错语句帧”两帧)

上一版 B 把最内层栈帧的位置改写成“当前语句”,结果它与错误帧落在同一 file:line,
被去重合并 —— 输出只剩一帧,`_start` 那帧(函数定义)反而没了。

改为:栈帧只记录**被调函数的定义位置**(不随语句推进覆盖);“当前语句/具体表达式”
统一由错误帧给出(CurArg 兜底,见 TypeGenErr)。这样能得到完整两帧:
  File "./Apps/HelloWorld/main.vp", line 11   export def _start() -> int:   ← 定义帧
  File "./Apps/HelloWorld/main.vp", line 36   ... &_on_submit)             ← 出错语句帧
同时删除已无调用的 TypeGenBase.update_top_trace_position。
This commit is contained in:
TermiNexus committed 2026-10-14 16:51:51 +08:00
1 parent d6b87da063
commit 4f45b391ea
2 files changed
+4 -14

No files matched your search

+4 -4
View File
@@ -32,11 +32,11 @@ novirtual class StmtGenMixin(StmtGenDeclMixin.StmtGenDeclMixin):
# define). Every instruction then carries ", !dbg !N". # define). Every instruction then carries ", !dbg !N".
if node is not None and trans._cur_builder is not None: if node is not None and trans._cur_builder is not None:
DebugInfoGen.SetStatement(trans.Pool, trans._cur_builder, node.lineno, node.col_offset + 1) DebugInfoGen.SetStatement(trans.Pool, trans._cur_builder, node.lineno, node.col_offset + 1)
# 让最内层栈帧跟踪“当前语句”位置:报错时栈帧给出的是调用点所在语句,而非函数定义行 # 注意:**不要**用当前语句位置覆盖栈帧(那会把“函数定义帧”与错误帧叠成同一位置、
#(Python traceback 口径;配合 TypeGenBase.set_cur_arg 可得到“调用点 + 具体表达式”两帧)。 # 被去重合并,反而丢掉 `_start` 那帧)。栈帧保留“被调函数的定义位置”,
# “当前语句/具体表达式”由错误帧给出(见 TypeGenErr 的 CurArg 兜底)。
# 仅在语句边界清掉上一条语句遗留的实参位置,避免兜底定位串味。
if node is not None: if node is not None:
self.Gen.TypeGenBase.update_top_trace_position(node.lineno, node.col_offset + 1)
# 语句边界处清掉上一条语句遗留的实参位置,避免兜底定位“串味”到旧实参
self.Gen.TypeGenBase.set_cur_arg(None, 0, 0) self.Gen.TypeGenBase.set_cur_arg(None, 0, 0)
if trans.TranslateDepth >= HT.TRANSLATE_MAX_DEPTH: self.Gen.TypeGenErr.fatal_error(node, "statement translation nested too deeply (likely an AST self-reference cycle or a translation bug)", "RecursionError") if trans.TranslateDepth >= HT.TRANSLATE_MAX_DEPTH: self.Gen.TypeGenErr.fatal_error(node, "statement translation nested too deeply (likely an AST self-reference cycle or a translation bug)", "RecursionError")
trans.TranslateDepth += 1 trans.TranslateDepth += 1
-10
View File
@@ -207,16 +207,6 @@ novirtual class TypeGenBase:
frame.lineno = 0 frame.lineno = 0
frame.col_start = 0 frame.col_start = 0
frame.col_end = 0 frame.col_end = 0
# update_top_trace_position - 让最内层栈帧跟踪“当前语句”位置(Python traceback 口径:
# 帧行号随语句推进而更新)。这样报错时栈帧给出的是**调用点所在语句**,而不是函数定义行;
# 配合 set_cur_arg,即可得到“调用点 + 具体表达式”两帧。
def update_top_trace_position(self, lineno: int, col_start: int) -> None:
"""Track the current statement on the innermost trace frame."""
if self.TraceCount <= 0 or lineno <= 0: return
frame: GenTypes.TraceFrame* = self._get_trace_frame(self.TraceCount - 1)
if frame is None: return
frame.lineno = lineno
frame.col_start = col_start
# set_cur_arg - 记录正在翻译的实参位置(file/line/col),供“合成节点无行号”时兜底定位。 # set_cur_arg - 记录正在翻译的实参位置(file/line/col),供“合成节点无行号”时兜底定位。
def set_cur_arg(self, file_name: str, lineno: int, col_start: int) -> None: def set_cur_arg(self, file_name: str, lineno: int, col_start: int) -> None:
"""Remember the argument position currently being translated.""" """Remember the argument position currently being translated."""