fix(func): 修复 extern 裸名未定义;打印方法体失败内部栈
避免 RawFuncName 未绑定;方法体异常在抛出前 traceback.print_exc() 输出完整调用栈。
This commit is contained in:
1 parent
d64fe2ee99
commit
a2cde67bc5
1 file changed
+5
-5
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user