fix(mangle): 仅 extern 函数保持裸名

删除 _export_funcs 裸名分支,普通 def/export def 恢复模块 SHA1 前缀,消除 os getcwd/system 等重复符号。
This commit is contained in:
TermiNexus committed 2026-10-19 12:54:16 +08:00
1 parent 80b7ce5bb1
commit 21c76541e5
1 file changed
-25
-25
View File
@@ -1212,31 +1212,6 @@ class BaseGenMixin:
if name in self._export_extern_funcs:
# extern def 一律使用裸名(C/Win32 符号不加模块 SHA1 前缀)
return name
if name in self._export_funcs and not module_name:
return name
if name in self._export_extern_funcs:
target_sha1: str = self._export_extern_funcs[name]
if module_name:
# 显式带 module_name 调用(如 stdlib.system):即使当前模块定义了同名函数,
# 也应按模块匹配 extern,返回裸名。snprintf 之所以工作而 system 不工作,
# 就是因为 os._win32 定义了自己的 system 包装,导致旧逻辑跳过了 extern 匹配。
if module_name == target_sha1:
return name
if module_name in self.ModuleSha1Map and self.ModuleSha1Map[module_name] == target_sha1:
return name
init_name: str = f"{module_name}.__init__"
if init_name in self.ModuleSha1Map and self.ModuleSha1Map[init_name] == target_sha1:
return name
# 兜底:module_name 不在 ModuleSha1Map 中或 sha1 不匹配,
# 但函数在 _export_extern_funcs 中(C extern 不应混淆),
# 仅当当前模块未定义同名函数时才返回裸名。
if name not in self._current_module_func_names:
return name
elif name not in self._current_module_func_names:
# 无 module_name 调用(如 from stdlib import system; system()):
# 仅当当前模块未定义同名函数时才返回 extern 裸名,
# 否则让本地定义走正常 mangle 路径(本地 def 遮蔽 import 语义)。
return name
# main 函数作为程序入口点,永远不混淆
if name == 'main':
return name