fix(mangle): 本模块普通 def 优先于同名 extern
只有跨模块 extern 才返回裸名;os/_win32 与 os/__init__ 自己定义的 getcwd/system 等普通 def 恢复 SHA1 前缀,消除重复符号。
This commit is contained in:
1 parent
8037d0e108
commit
d1eb1608d0
2 files changed
+7
-6
No files matched your search
@@ -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)
|
||||
|
||||
@@ -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':
|
||||
|
||||
Reference in new issue
Block a user