From 95a52bb9f650af0f4b55e41b6637dc4702e66392 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 8 Aug 2026 00:38:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20vpi=20=E6=B3=A8=E5=85=A5=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E4=B8=8A=E4=B8=8B=E6=96=87=E5=B8=A7=E6=90=BA=E5=B8=A6?= =?UTF-8?q?=E8=A7=A6=E5=8F=91=20import=20=E7=9A=84=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E8=A1=8C=E5=8F=B7=E4=B8=8E=E8=A1=8C=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- App/lib/core/Handles/HandlesTranslator.vp | 7 +++++++ App/lib/core/StubMerger.vp | 6 +----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/App/lib/core/Handles/HandlesTranslator.vp b/App/lib/core/Handles/HandlesTranslator.vp index bc8cfc7..8ae01e8 100644 --- a/App/lib/core/Handles/HandlesTranslator.vp +++ b/App/lib/core/Handles/HandlesTranslator.vp @@ -330,6 +330,8 @@ class Translator: if self._declare_only == 0: # 预处理导入语句,确保 _imported_modules 和 _from_imports 已填充 # (前向声明需要解析类型注解,如 t.CArray[str] 依赖 t 模块已导入) + # 记录最后处理的 import 行号,供 vpi 注入错误上下文帧定位 + cur_imp_lineno: int = 0 ch: list[ast.AST | t.CPtr] | t.CPtr = tree.children if ch is not None: cn_count: t.CSizeT = ch.__len__() @@ -339,8 +341,10 @@ class Translator: continue kd: int = child.kind() if kd == ast.ASTKind.Import: + cur_imp_lineno = child.lineno self.ImportsH.HandleImport(child) elif kd == ast.ASTKind.ImportFrom: + cur_imp_lineno = child.lineno self.ImportsH.HandleImportFromModule(child) self.ImportsH.HandleImportFromNames(child) # 扫描当前模块的 CTypedef 声明(NAME: t.CTypedef = Type), @@ -351,9 +355,12 @@ class Translator: # 严格保证 declare_only == 0 时才注入(避免 Phase A-pre-inc 死锁) if self._imported_modules is not None: import lib.core.StubMerger as StubMerger + # 错误上下文帧:当前模块触发依赖 stub 加载的 import 位置 + HandlesType.push_trace(HandlesType.get_current_file(), cur_imp_lineno) StubMerger.LoadDepVpiIntoModule( pool, mod, self._imported_modules, self._from_imports, HandlesExprCall._g_temp_dir, self) + HandlesType.pop_trace() # 预注册模块级变量(AnnAssign/Assign)到 SymTab # 解决时序问题:class Logger 的 __init__ 引用 _mbuddy 时, # _mbuddy 的 AnnAssign 在 AST 中位于 class Logger 之后, diff --git a/App/lib/core/StubMerger.vp b/App/lib/core/StubMerger.vp index c1a8615..0eddc2e 100644 --- a/App/lib/core/StubMerger.vp +++ b/App/lib/core/StubMerger.vp @@ -15,7 +15,6 @@ import lib.core.IncludesScanner as IncludesScanner import lib.core.Handles.HandlesStruct as HandlesStruct import lib.core.Handles.HandlesImports as HandlesImports import lib.core.Handles.HandlesTranslator as HandlesTranslator -import lib.core.Handles.HandlesType as HandlesType import lib.core.BuildPipeline as BuildPipeline import lib.StubGen.VpiReader as VpiReader import lib.Projectrans.Utils as Utils @@ -2085,11 +2084,8 @@ def LoadDepVpiIntoModule(pool: memhub.MemBuddy | t.CPtr, if not vf.closed: vf.close() # 调用 VpiReader 解析 .vpi 并注入 declare - # 错误归因:push 当前编译模块帧,stub 解析期间若 fatal_error, - # 多级堆栈显示 当前模块 → 被读 stub 文件(真实出错位置) - HandlesType.push_trace(HandlesType.get_current_file(), 0) + # (错误上下文帧由调用方 HandlesTranslator 维护) ret: int = VpiReader.ParseVpiIntoModule(pool, mod, vpi_path, trans) - HandlesType.pop_trace() if ret == 1: success_count += 1 stdlib.free(vpi_path)