fix(vpi): 全局变量注入补自注入守卫,消除同模块 external global 与定义重名

循环 import(os/__init__ 导入 os._win32/os._posix,而二者又导入包 os)使 imported_modules 含本模块包名 → LoadDepVpiIntoModule 命中本模块自身 sha1 → _inject_global_variable_declare 为本模块自己的模块级全局发射 @<sha1>.<name> = external global,随后定义端 handle_module_level_var 再发 = global … → llc redefinition of global(SysLibTest 根因)。补上 _inject_function_declare / _inject_method_declare 已有的同款自注入守卫(_declare_only==0 且 src_sha1==trans.ModuleSha1 时早退)。
This commit is contained in:
TermiNexus committed 2026-10-03 11:08:58 +08:00
1 parent 19d7a90c28
commit 8da4550d79
1 file changed
+11
+11
View File
@@ -3060,6 +3060,17 @@ def _inject_global_variable_declare(pool: memhub.MemBuddy*,
gname_v: str = nm_v.id
if gname_v[0] == '\0':
return
# 自注入守卫(仅全量翻译阶段 _declare_only == 0):本模块自己定义的模块级全局,
# 其定义由 TranslatorGenMixin.handle_module_level_var 发射(@<本模块sha1>.<name> = global …)。
# 把本模块自己的 vpi 经依赖链反向注入(循环 import:os/__init__ 导入 os._win32/os._posix,
# 而二者又导入包 os,使 imported_modules 含 "os" → 命中本模块自身 sha1)会在同一模块
# 先制造同名的 external global 声明,随后定义端再发射 global 定义 → llc:
# redefinition of global '@<sha1>.<name>'。与 _inject_function_declare /
# _inject_method_declare 的自注入守卫同因同构(那两处已修,全局此处此前遗漏)。
if trans is not None and trans._declare_only == 0 and trans.ModuleSha1 is not None \
and src_sha1 is not None:
if string.strcmp(src_sha1, trans.ModuleSha1) == 0:
return
# mangled 名:带源模块 SHA1 前缀(对齐定义端 5f7a873 的 @<sha1>.<name>
# 与查找端 from-import 精确查找三方一致;裸短名会退化为未定义)。
# 注:a42923c 曾把此处写成未定义变量 gv_name_m(笔误,mangle 未实现),