diff --git a/lib/core/Handles/HandlesExprCall.py b/lib/core/Handles/HandlesExprCall.py index a7c4f73..efa2429 100644 --- a/lib/core/Handles/HandlesExprCall.py +++ b/lib/core/Handles/HandlesExprCall.py @@ -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)。