diff --git a/App/lib/core/Gen/CallGenMixin.vp b/App/lib/core/Gen/CallGenMixin.vp index 0c5ea1f..0f17337 100644 --- a/App/lib/core/Gen/CallGenMixin.vp +++ b/App/lib/core/Gen/CallGenMixin.vp @@ -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: