fix(call): 模块属性调用不回退局部变量,修同名局部变量劫持 VLogger.fmt_buf

found_func 未命中时仅裸名调用(Name)回退查局部变量(函数指针/闭包);模块属性调用(VLogger.fmt_buf())目标是模块符号,跨模块任意同名可接受(CallGenLeafKit 局部 fmt_buf 曾劫持 VLogger.fmt_buf → 误走函数指针调用报 t.Callable 缺失),仅 from-import 裸名 yyy 重名才冲突
This commit is contained in:
TermiNexus committed 2026-08-19 02:30:18 +08:00
1 parent ebf0aed5b1
commit 941ba2feb0
1 file changed
+8 -2
+8 -2
View File
@@ -627,9 +627,15 @@ class CallGenMixin(CallGenBase.CallGenBase):
else:
call_ret_ty = ExprCallBase._infer_external_func_ret_ty(pool, func_name)
# 如果模块中找不到函数,检查是否是变量(函数指针 / 闭包调用)
# 如果模块中找不到函数,仅裸名调用(Name)才回退查局部变量(函数指针/
# 闭包调用);模块属性调用(VLogger.fmt_buf())的目标是模块符号,绝不
# 回退局部变量——跨模块任意同名可接受(CallGenLeafKit 局部 fmt_buf
# 曾劫持 VLogger.fmt_buf → 误走函数指针调用报 t.Callable 缺失),
# 仅 from-import 的裸名 yyy 与局部重名才可能冲突(该场景 func 是 Name)。
if found_func is None:
fp_alloca: llvmlite.Value | t.CPtr = HandlesVar.lookup_var(trans.SymTab, func_name)
fp_alloca: llvmlite.Value | t.CPtr = None
if cl.func is None or cl.func.kind() == ast.ASTKind.Name:
fp_alloca = HandlesVar.lookup_var(trans.SymTab, func_name)
if fp_alloca is not None:
# 闭包变量(嵌套函数提升,已注册到闭包名集合):提取 fn_ptr/env_ptr 间接调用
if ExprCallCall.is_closure_name(func_name) != 0: