From a2cde67bc56d50f3a1da8d06a8ebe6d8de244ad4 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 18 Oct 2026 23:03:32 +0800 Subject: [PATCH] =?UTF-8?q?fix(func):=20=E4=BF=AE=E5=A4=8D=20extern=20?= =?UTF-8?q?=E8=A3=B8=E5=90=8D=E6=9C=AA=E5=AE=9A=E4=B9=89=EF=BC=9B=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E6=96=B9=E6=B3=95=E4=BD=93=E5=A4=B1=E8=B4=A5=E5=86=85?= =?UTF-8?q?=E9=83=A8=E6=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 避免 RawFuncName 未绑定;方法体异常在抛出前 traceback.print_exc() 输出完整调用栈。 --- lib/core/Handles/HandlesFunctions.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/core/Handles/HandlesFunctions.py b/lib/core/Handles/HandlesFunctions.py index 9608f8a..fba00a2 100644 --- a/lib/core/Handles/HandlesFunctions.py +++ b/lib/core/Handles/HandlesFunctions.py @@ -1197,10 +1197,10 @@ class FunctionHandle(BaseHandle): _is_extern_node: bool = (bool(getattr(Node, 'Extern', False)) or 'extern' in (getattr(Node, 'Markers', None) or ())) if deco_flags['is_export'] or deco_flags['is_extern'] or deco_flags['is_state'] or _is_extern_node: - Gen._export_funcs.add(RawFuncName if _is_extern_node else FuncName) + Gen._export_funcs.add(Node.name if _is_extern_node else FuncName) IsUserMarkedExport = True if _is_extern_node: - Gen._export_extern_funcs[RawFuncName] = getattr(Gen, 'module_sha1', '') or '' + Gen._export_extern_funcs[Node.name] = getattr(Gen, 'module_sha1', '') or '' # 注册当前模块定义的函数名,使 _mangle_func_name 跳过 _export_extern_funcs 检查 # (_export_extern_funcs 是跨模块共享集合,包含所有 CExtern 函数名;当前模块定义的 # 同名用户函数应使用 SHA1 前缀,而非被误判为外部 C 函数返回裸名) @@ -1208,7 +1208,7 @@ class FunctionHandle(BaseHandle): # 移除导入污染:用户函数未显式标记导出,但名称在 _export_funcs 中(来自导入的同名 C 库函数) if not IsUserMarkedExport and FuncName in Gen._export_funcs: Gen._export_funcs.discard(FuncName) - MangledName: str = RawFuncName if _is_extern_node else Gen._mangle_func_name(FuncName) + MangledName: str = Node.name if _is_extern_node else Gen._mangle_func_name(FuncName) # 自动取址模式:查表侧统一按**真实发射名**(func.name,即 MangledName)查 # (FuncGen._adjust_args)。签名阶段(_GetFunctionSignatureLlvm)只能按逻辑名 # (FuncName)登记,故在此把该逻辑名下的模式复制到真实名下——否则同模块 @@ -2055,8 +2055,8 @@ class FunctionHandle(BaseHandle): try: self.Trans.BodyHandler.HandleBodyLlvm(func_body) except Exception as _body_exc: - # 方法体编译失败:复位上下文后原样上抛,由 Phase2Translator 的 - # worker/主进程统一输出一次并终止(此处不打印,避免同一错误重复)。 + traceback.print_exc() + # 方法体编译失败:先打印完整内部栈,再复位上下文并上抛终止编译。 if Gen.builder is not None: try: if not Gen.builder.block.is_terminated: