fix(tpv): 修复包重导出两个前置判定 bug(level 判定 + __init__ 后缀偏移)

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 根因)。
This commit is contained in:
TermiNexus committed 2026-08-29 09:32:12 +08:00
1 parent 25363120f8
commit d3bdfd5205
1 file changed
+15 -9
+15 -9
View File
@@ -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: