feat(codegen): 值引用自动取址收口到 _adjust_args,补齐 vtable/方法/构造等路径
查表键统一为真实发射出的函数名:FuncGen._adjust_args 开头以 func.name 调用 _apply_auto_addr,于是 direct/vtable 虚分派/构造/静态/__call__/下标赋值/c.Addr 构造/闭包/泛型/方法兜底全部自动取址,不再依赖每个调用点手写;同时删除 16 处冗余显式取址(t.CAutoPtr 的 always 模式不幂等,重复应用会多包一层指针)。登记侧:HandlesImports 把模式登记提前到 FuncName-in-Gen.functions 早退之前并按 func.name 主键写表,_TryLoadStructFromStub 改为无条件调用;HandlesFunctions 在函数对象就绪后按真实名登记,并在 _EmitFunctionForwardDeclLlvm 把逻辑名下的模式播种到 MangledName,覆盖同模块先调用后定义的场景。
This commit is contained in:
1 parent
b49b5c3ba6
commit
9656bb161a
6 files changed
+82
-32
No files matched your search
@@ -1382,7 +1382,8 @@ class ExprCallHandle(BaseHandle):
|
||||
self._check_eh_return(result, FullMethodName, Gen, called_func=func)
|
||||
return result
|
||||
self._append_eh_msg_out_arg(CallArgs, func, Gen)
|
||||
CallArgs = Gen._apply_auto_addr(MangledName, CallArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表),
|
||||
# 此处的显式取址已删除,避免 'always' 模式被重复应用(不幂等)。
|
||||
adjusted = Gen._adjust_args(CallArgs, func)
|
||||
result = Gen.builder.call(func, adjusted, name=f"call_{MangledName}")
|
||||
self._check_eh_return(result, MangledName, Gen, called_func=func)
|
||||
@@ -2780,7 +2781,7 @@ class ExprCallHandle(BaseHandle):
|
||||
adjusted.append(arg)
|
||||
result = Gen.builder.call(func, adjusted, name=f"call_{FuncName}")
|
||||
else:
|
||||
CallArgs = Gen._apply_auto_addr(FuncName, CallArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted = Gen._adjust_args(CallArgs, func)
|
||||
# 兜底:确保所有指针类型参数与函数签名匹配(如 struct* -> i8*)
|
||||
for i, (arg, param) in enumerate(zip(adjusted, func.args)):
|
||||
@@ -3481,7 +3482,7 @@ class ExprCallHandle(BaseHandle):
|
||||
adjusted.append(arg)
|
||||
result = Gen.builder.call(func, adjusted, name=f"call_{MethodName}")
|
||||
else:
|
||||
CallArgs = Gen._apply_auto_addr(MethodName, CallArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted = Gen._adjust_args(CallArgs, func)
|
||||
result = Gen.builder.call(func, adjusted, name=f"call_{MethodName}")
|
||||
return result
|
||||
@@ -3542,7 +3543,7 @@ class ExprCallHandle(BaseHandle):
|
||||
adjusted.append(arg)
|
||||
result = Gen.builder.call(func, adjusted, name=f"call_{MethodName}")
|
||||
else:
|
||||
CallArgs = Gen._apply_auto_addr(MethodName, CallArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted = Gen._adjust_args(CallArgs, func)
|
||||
result = Gen.builder.call(func, adjusted, name=f"call_{MethodName}")
|
||||
return result
|
||||
@@ -3570,7 +3571,7 @@ class ExprCallHandle(BaseHandle):
|
||||
mangled_name, _ai + 1, arg, Node))
|
||||
self._fill_default_args(CallArgs, func, mangled_name)
|
||||
self._append_eh_msg_out_arg(CallArgs, func, Gen)
|
||||
CallArgs = Gen._apply_auto_addr(mangled_name, CallArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted = Gen._adjust_args(CallArgs, func)
|
||||
result = Gen.builder.call(func, adjusted, name=f"call_{MethodName}")
|
||||
self._check_eh_return(result, mangled_name, Gen, called_func=func)
|
||||
@@ -3944,7 +3945,7 @@ class ExprCallHandle(BaseHandle):
|
||||
call_args = [self_arg] + CallArgs
|
||||
self._fill_default_args(call_args, func, FullMethodName)
|
||||
self._append_eh_msg_out_arg(call_args, func, Gen)
|
||||
call_args = Gen._apply_auto_addr(FullMethodName, call_args)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted = Gen._adjust_args(call_args, func)
|
||||
result = Gen.builder.call(func, adjusted, name=f"call_{FullMethodName}")
|
||||
self._check_eh_return(result, FullMethodName, Gen, called_func=func)
|
||||
@@ -5201,7 +5202,7 @@ class ExprCallHandle(BaseHandle):
|
||||
NewMethodArgs.append(ArgVal)
|
||||
self._fill_default_args(NewMethodArgs, NewMethodFunc, NewMethodFuncName)
|
||||
self._ApplyKeywordArgs(Node, NewMethodArgs, NewMethodFunc, NewMethodFuncName, self_offset=1)
|
||||
NewMethodArgs = Gen._apply_auto_addr(NewMethodFuncName, NewMethodArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted_new = Gen._adjust_args(NewMethodArgs, NewMethodFunc)
|
||||
heap_ptr = Gen.builder.call(NewMethodFunc, adjusted_new, name=f"new_{ClassName}")
|
||||
if heap_ptr:
|
||||
@@ -5233,7 +5234,7 @@ class ExprCallHandle(BaseHandle):
|
||||
self._fill_default_args(InitArgs, InitFunc, InitFuncName)
|
||||
self._ApplyKeywordArgs(Node, InitArgs, InitFunc, InitFuncName, self_offset=1)
|
||||
self._append_eh_msg_out_arg(InitArgs, InitFunc, Gen)
|
||||
InitArgs = Gen._apply_auto_addr(InitFuncName, InitArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted_init = Gen._adjust_args(InitArgs, InitFunc)
|
||||
Gen.builder.call(InitFunc, adjusted_init, name=f"init_{ClassName}")
|
||||
return result
|
||||
@@ -5266,7 +5267,7 @@ class ExprCallHandle(BaseHandle):
|
||||
NewMethodArgs.append(ArgVal)
|
||||
self._fill_default_args(NewMethodArgs, NewMethodFunc, NewMethodFuncName)
|
||||
self._ApplyKeywordArgs(Node, NewMethodArgs, NewMethodFunc, NewMethodFuncName, self_offset=1)
|
||||
NewMethodArgs = Gen._apply_auto_addr(NewMethodFuncName, NewMethodArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted_new = Gen._adjust_args(NewMethodArgs, NewMethodFunc)
|
||||
heap_ptr = Gen.builder.call(NewMethodFunc, adjusted_new, name=f"new_{ClassName}")
|
||||
if heap_ptr:
|
||||
@@ -5306,7 +5307,7 @@ class ExprCallHandle(BaseHandle):
|
||||
self._fill_default_args(InitArgs, InitFunc, InitFuncName)
|
||||
self._ApplyKeywordArgs(Node, InitArgs, InitFunc, InitFuncName, self_offset=1)
|
||||
self._append_eh_msg_out_arg(InitArgs, InitFunc, Gen)
|
||||
InitArgs = Gen._apply_auto_addr(InitFuncName, InitArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted_init = Gen._adjust_args(InitArgs, InitFunc)
|
||||
Gen.builder.call(InitFunc, adjusted_init, name=f"init_{ClassName}")
|
||||
elif Node.args or Node.keywords:
|
||||
@@ -5538,7 +5539,7 @@ class ExprCallHandle(BaseHandle):
|
||||
CallArgs.append(arg_val)
|
||||
if not CallArgs:
|
||||
CallArgs = [ir.Constant(ir.IntType(32), 0) for _ in func.args]
|
||||
CallArgs = Gen._apply_auto_addr(spec_name, CallArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted = Gen._adjust_args(CallArgs, func)
|
||||
return Gen.builder.call(func, adjusted, name=f"call_{spec_name}")
|
||||
|
||||
@@ -5583,7 +5584,7 @@ class ExprCallHandle(BaseHandle):
|
||||
return None
|
||||
if not CallArgs:
|
||||
CallArgs = [ir.Constant(ir.IntType(32), 0) for _ in func.args]
|
||||
CallArgs = Gen._apply_auto_addr(spec_name, CallArgs)
|
||||
# 自动取址已收口到 Gen._adjust_args(唯一汇聚点,按 func.name 查表)。
|
||||
adjusted = Gen._adjust_args(CallArgs, func)
|
||||
return Gen.builder.call(func, adjusted, name=f"call_{spec_name}")
|
||||
|
||||
|
||||
Reference in new issue
Block a user