From d3bdfd5205cb72b8e110c079d1f2fa938c767ca6 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sat, 29 Aug 2026 09:32:12 +0800 Subject: [PATCH] =?UTF-8?q?fix(tpv):=20=E4=BF=AE=E5=A4=8D=E5=8C=85?= =?UTF-8?q?=E9=87=8D=E5=AF=BC=E5=87=BA=E4=B8=A4=E4=B8=AA=E5=89=8D=E7=BD=AE?= =?UTF-8?q?=E5=88=A4=E5=AE=9A=20bug=EF=BC=88level=20=E5=88=A4=E5=AE=9A=20+?= =?UTF-8?q?=20=5F=5Finit=5F=5F=20=E5=90=8E=E7=BC=80=E5=81=8F=E7=A7=BB?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1) 相对导入判定改 sifr.level>0:parser 把前导点存 level,module 字段不含点,原 sifr_mod[0]=='.' 恒假,走绝对分支查不到 ast.exprs,sub_sha1=None 重导出被跳过。2) __init__ 判定改 strstr:原 strcmp(rel_path+len-9) 对 ast/__init__.vp 指向 init__.vp 恒不匹配,is_pkg=0。两 bug 叠加致包重导出从未触发,ast.Attribute 未注册(AssignGenMixin L46 fail-fast 根因)。 --- App/lib/Stub/StubGen/VpiReader.vp | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/App/lib/Stub/StubGen/VpiReader.vp b/App/lib/Stub/StubGen/VpiReader.vp index 1128b5f..2839349 100644 --- a/App/lib/Stub/StubGen/VpiReader.vp +++ b/App/lib/Stub/StubGen/VpiReader.vp @@ -1326,17 +1326,23 @@ def _ParseVpiIntoModuleImpl(pool: memhub.MemBuddy | t.CPtr, is_pkg_init_rt: int = 0 rel_path_rt: str = StubMergerStore.LookupSha1RelPath(src_sha1) if rel_path_rt is not None: - rp_len_rt: t.CSizeT = string.strlen(rel_path_rt) - if rp_len_rt >= 9 \ - and string.strcmp(rel_path_rt + rp_len_rt - 9, "__init__.vp") == 0: + # [FIX] 原判定 strcmp(rel_path + strlen(rel_path) - 9, "__init__.vp") + # 假设 "__init__.vp" 从 len-9 开始;实际包路径 "ast/__init__.vp" + # 长 15,该后缀从索引 4 起(11 字符),len-9=6 指向 "init__.vp" + # → 判定恒 false → 包重导出永不触发(ast.Attribute 未注册根因之一)。 + # 改用 strstr 判定 rel_path 包含 "__init__.vp"(仅包 __init__ 文件命中)。 + if string.strstr(rel_path_rt, "__init__.vp") is not None: is_pkg_init_rt = 1 - # 解析被 from-import 的模块 sha1:相对导入(.exprs)按 StubMergerStore - # 约定去前导点后缀匹配;绝对模块名精确匹配 + # 解析被 from-import 的模块 sha1:相对导入按 parser 表示判定—— + # 前导点存于 level(from .exprs import → level=1, module="exprs", + # 见 includes/ast/stmts.vp ImportFrom.level / parser.vp _parse_from_import), + # module 字段不含前导点。原判定 sifr_mod[0]=='.' 永远不成立 → 走绝对 + # 分支 LookupSha1ByModName("exprs") 查不到 "ast.exprs" → sub_sha1=None + # → 重导出被跳过(ast.Attribute 未注册根因之二)。 sub_sha1_rt: str = None - if sifr_mod[0] != '\0' and sifr_mod[0] == '.': - sub_suffix_rt: str = sifr_mod + 1 - if sub_suffix_rt is not None and sub_suffix_rt[0] != '\0': - sub_sha1_rt = StubMergerStore.LookupSha1ByModNameSuffix(sub_suffix_rt) + if sifr.level > 0: + if sifr_mod is not None and sifr_mod[0] != '\0': + sub_sha1_rt = StubMergerStore.LookupSha1ByModNameSuffix(sifr_mod) else: sub_sha1_rt = StubMergerStore.LookupSha1ByModName(sifr_mod) if sifr.names is not None: