From 62e38c436710cf0b88c63afa100ae0dac4c5b942 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 18 Oct 2026 18:40:00 +0800 Subject: [PATCH] =?UTF-8?q?fix(generic):=20=E7=89=B9=E5=8C=96=E8=B7=B3?= =?UTF-8?q?=E8=BF=87=E6=97=B6=E8=AE=B0=E5=BD=95=E5=85=B7=E4=BD=93=E5=8E=9F?= =?UTF-8?q?=E5=9B=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 模板未注册/缓存已完整/缺类型信息/方法名不一致等分支均写入 _generic_spec_error,供 Undefined method 报文展示。 --- lib/core/Handles/HandlesExprCall.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/core/Handles/HandlesExprCall.py b/lib/core/Handles/HandlesExprCall.py index efa2429..508596c 100644 --- a/lib/core/Handles/HandlesExprCall.py +++ b/lib/core/Handles/HandlesExprCall.py @@ -3007,11 +3007,13 @@ class ExprCallHandle(BaseHandle): """ # 仅对特化名(含 '[' 且以 ']' 结尾)触发 if '[' not in ClassName or not ClassName.endswith(']'): + Gen._generic_spec_error = f'非特化名: {ClassName}' return # 反推模板类名(如 ndarray[double] → ndarray) base_name: str = ClassName.split('[')[0] # 检查是否是已注册的泛型模板 if not (hasattr(self.Trans.ClassHandler, '_generic_class_templates') and base_name in self.Trans.ClassHandler._generic_class_templates): + Gen._generic_spec_error = f'模板未注册: {base_name}' return # 构造 spec_key(与 _specialize_generic_class 一致:ClassName) spec_key: str = base_name + '<' + ','.join(ClassName[len(base_name) + 1:-1].split('][')) + '>' @@ -3032,6 +3034,7 @@ class ExprCallHandle(BaseHandle): was_declare_only: bool = cached[1] # 仅当缓存是 declare_only 版本时才需要补发 if not was_declare_only: + Gen._generic_spec_error = f'特化标记为完整但方法缺失: {cached_name}.{MethodName}' return # 检查方法是否已有 define(blocks 非空表示已编译方法体) struct_sha1_map = getattr(Gen, '_struct_sha1_map', {}) @@ -3041,10 +3044,12 @@ class ExprCallHandle(BaseHandle): if existing_func is not None: existing_blocks = getattr(existing_func, 'blocks', []) if existing_blocks: + Gen._generic_spec_error = f'方法已存在但查找名不一致: {full_method_name}' return # 方法体已编译 # 从缓存获取 type_args/type_names type_info = getattr(Gen, '_generic_class_spec_type_info', {}).get(spec_key) if type_info is None: + Gen._generic_spec_error = f'缺少特化类型信息: {spec_key}' return cached_type_args, cached_type_names = type_info # 不预先标记:_specialize_generic_class 内部缓存逻辑会检测