fix(generic): 特化跳过时记录具体原因
模板未注册/缓存已完整/缺类型信息/方法名不一致等分支均写入 _generic_spec_error,供 Undefined method 报文展示。
This commit is contained in:
1 parent
7a063d916b
commit
62e38c4367
1 file changed
+5
@@ -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<arg1,arg2,...>)
|
||||
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 内部缓存逻辑会检测
|
||||
|
||||
Reference in new issue
Block a user