diff --git a/lib/core/Handles/HandlesFunctions.py b/lib/core/Handles/HandlesFunctions.py index 8542a3c..971917e 100644 --- a/lib/core/Handles/HandlesFunctions.py +++ b/lib/core/Handles/HandlesFunctions.py @@ -1202,9 +1202,9 @@ class FunctionHandle(BaseHandle): if _is_extern_node: Gen._export_extern_funcs[Node.name] = getattr(Gen, 'module_sha1', '') or '' # 注册当前模块定义的函数名,使 _mangle_func_name 跳过 _export_extern_funcs 检查 - # (_export_extern_funcs 是跨模块共享集合,包含所有 CExtern 函数名;当前模块定义的 - # 同名用户函数应使用 SHA1 前缀,而非被误判为外部 C 函数返回裸名) - Gen._current_module_func_names.add(FuncName) + # (仅普通 def 登记;extern def 需保持裸名,不能被当前模块遮蔽) + if not _is_extern_node: + Gen._current_module_func_names.add(FuncName) # 移除导入污染:用户函数未显式标记导出,但名称在 _export_funcs 中(来自导入的同名 C 库函数) if not IsUserMarkedExport: Gen._export_funcs.discard(FuncName) diff --git a/lib/core/LLVMCG/BaseGen.py b/lib/core/LLVMCG/BaseGen.py index 283bc6b..9a6739e 100644 --- a/lib/core/LLVMCG/BaseGen.py +++ b/lib/core/LLVMCG/BaseGen.py @@ -1028,7 +1028,7 @@ class BaseGenMixin: def _mangle_name(self, name: str) -> str: if self._skip_mangle(name): return name - if name in self._export_extern_funcs: + if name in self._export_extern_funcs and name not in self._current_module_func_names: return name if self.module_sha1: return f"{self.module_sha1}.{name}" @@ -1209,8 +1209,9 @@ class BaseGenMixin: return func def _mangle_func_name(self, name: str, module_name: str | None = None) -> str: - if name in self._export_extern_funcs: - # extern def 一律使用裸名(C/Win32 符号不加模块 SHA1 前缀) + if name in self._export_extern_funcs and name not in self._current_module_func_names: + # extern def 一律使用裸名(C/Win32 符号不加模块 SHA1 前缀); + # 但本模块自己定义的同名普通 def(如 os.system / os.getcwd)优先走 SHA1。 return name # main 函数作为程序入口点,永远不混淆 if name == 'main':