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:
1 parent
25363120f8
commit
d3bdfd5205
1 file changed
+15
-9
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user