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:
1 parent
ebf0aed5b1
commit
941ba2feb0
1 file changed
+8
-2
@@ -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:
|
||||
|
||||
Reference in new issue
Block a user