fix(TPV): 修 455c760 遗漏——args_node 必须声明在 decl_reuse 分支之外
现场:Test/FakeDuckTest 编译 includes/viperio.vp 第 12 行 self.data = data → NameError: 未定义名称 'data' (Buf.__init__ 的第一个形参名在方法体里找不到。) 原因:455c760 把整段"参数创建块"置于 if decl_reuse == 0: 之下时,把 args_node: ast.Arguments* = fd.args 一并圈了进去;但函数体段的 "为其他参数创建 alloca 并 store"(ClassGenVTable.vp:904 起)仍要遍历 args_node。复用前向声明(decl_reuse==1,现已是常规路径)时 args_node 未定义 → 形参不进符号表 → 方法体引用形参名即报 NameError。 修法:把 args_node 的声明提到 decl_reuse 分支之前。该块内其余变量 (md_defaults/md_default_count/md_param_count/md_args_node/md_ags/ md_alist/md_dlist/max_funcs/first_pname/first_pname_buf/fd_ags/ fd_first_arg/ags/alist/an/start_idx/ai/arg/param_ty/resolved/pname/ i1_ty_si/i1_ptr_ty_si)已逐一核对,全部只在块内使用,无需外提。 待验证:重编译 TransPyV(自举两遍)→ FileIoTest / FakeDuckTest。
This commit is contained in:
1 parent
455c7608b1
commit
2bfcb6ef6e
1 file changed
+6
-1
@@ -704,6 +704,11 @@ novirtual class ClassGenVTable(ClassGenBase.ClassGenBase):
|
||||
# declare、函数体整体丢失(对齐 FuncGenDef.vp:544-545)。
|
||||
func.IsDeclared = 0
|
||||
|
||||
# 形参表:下方"函数体段"(形参建 alloca + 登记符号)与参数创建块都要用,
|
||||
# 必须声明在 decl_reuse 分支之外——复用前向声明时不再走参数创建块,
|
||||
# 但函数体段仍要遍历形参,否则实参名不进符号表(NameError: 未定义名称)。
|
||||
args_node: ast.Arguments* = fd.args
|
||||
|
||||
if decl_reuse == 0:
|
||||
# 提取默认参数信息(普通方法 args[0] 是 self,不含在 param_count 中;
|
||||
# @staticmethod 无 self,param_count 为完整参数数)
|
||||
@@ -749,7 +754,7 @@ novirtual class ClassGenVTable(ClassGenBase.ClassGenBase):
|
||||
llvmlite.add_param(pool, func, self_ptr_ty, first_pname_buf)
|
||||
|
||||
# 添加其他参数(支持类型注解;@staticmethod 从索引 0 开始,其余跳过索引 0 的 self/cls)
|
||||
args_node: ast.Arguments* = fd.args
|
||||
# args_node 已在 decl_reuse 分支之外声明(函数体段同样要用)
|
||||
if args_node is not None:
|
||||
ags: ast.Arguments* = ast.Arguments*(args_node)
|
||||
if ags.args is not None:
|
||||
|
||||
Reference in new issue
Block a user