From 7a063d916b2f9833a14dfe029919bfe6f45d0e8f Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 18 Oct 2026 18:36:25 +0800 Subject: [PATCH] =?UTF-8?q?fix(generic):=20=E7=89=B9=E5=8C=96=E8=A1=A5?= =?UTF-8?q?=E5=85=A8=20type=5Fnames=20=E5=B9=B6=E6=9A=B4=E9=9C=B2=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5=E5=8E=9F=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 缺少特化缓存时传原始实参名生成完整特化;方法查找失败报文附加特化异常,便于定位模板/实参问题。 --- lib/core/Handles/HandlesExprCall.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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)。