fix(generic): 特化补全 type_names 并暴露失败原因
缺少特化缓存时传原始实参名生成完整特化;方法查找失败报文附加特化异常,便于定位模板/实参问题。
This commit is contained in:
1 parent
10b3f90a24
commit
7a063d916b
1 file changed
+11
-5
@@ -3019,12 +3019,14 @@ class ExprCallHandle(BaseHandle):
|
||||
cached = spec_cache.get(spec_key)
|
||||
if not isinstance(cached, tuple) or len(cached) < 2:
|
||||
# 缓存中还没有该特化:直接从头生成完整特化(方法体随类特化一起产出)
|
||||
_TypeArgs: list[str] = ClassName[len(base_name) + 1:-1].split('][')
|
||||
_TypeNames: list[str] = [a.rsplit('.', 1)[-1] for a in _TypeArgs]
|
||||
try:
|
||||
self.Trans.ClassHandler._specialize_generic_class(
|
||||
base_name, ClassName[len(base_name) + 1:-1].split(']['),
|
||||
Gen, declare_only=False)
|
||||
except Exception:
|
||||
pass
|
||||
base_name, _TypeArgs, Gen,
|
||||
type_names=_TypeNames, declare_only=False)
|
||||
except Exception as _spec_err:
|
||||
Gen._generic_spec_error = f'{type(_spec_err).__name__}: {_spec_err}'
|
||||
return
|
||||
cached_name: str = cached[0]
|
||||
was_declare_only: bool = cached[1]
|
||||
@@ -3944,7 +3946,11 @@ class ExprCallHandle(BaseHandle):
|
||||
self._append_eh_msg_out_arg(call_args_fb, func, Gen)
|
||||
adjusted = Gen._adjust_args(call_args_fb, func)
|
||||
return Gen.builder.call(func, adjusted, name=f"call_{BareFuncName}")
|
||||
raise Exception(f"Undefined method '{MethodName}' in class '{ClassName}' (no function declaration found for '{FullMethodName}')")
|
||||
_spec_diag: str = getattr(Gen, '_generic_spec_error', '')
|
||||
raise Exception(
|
||||
f"Undefined method '{MethodName}' in class '{ClassName}' "
|
||||
f"(no function declaration found for '{FullMethodName}')"
|
||||
+ (f";泛型特化失败: {_spec_diag}" if _spec_diag else ""))
|
||||
|
||||
def _EnsureReceiverStructConcrete(self, ClassName: str, class_sha1: str | None, ObjVal: Any, Gen: "LlvmGeneratorMixin") -> Any:
|
||||
"""根本修复:vtable 分派前保证接收者 struct 已具化(非 opaque)。
|
||||
|
||||
Reference in new issue
Block a user