diff --git a/lib/core/Handles/HandlesExprCall.py b/lib/core/Handles/HandlesExprCall.py index 540ccfb..108b8aa 100644 --- a/lib/core/Handles/HandlesExprCall.py +++ b/lib/core/Handles/HandlesExprCall.py @@ -3016,13 +3016,13 @@ class ExprCallHandle(BaseHandle): 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('][')) + '>' + _TypeArgs: list[str] = ClassName[len(base_name) + 1:-1].split('][') + _TypeNames: list[str] = [a.rsplit('.', 1)[-1] for a in _TypeArgs] + spec_key: str = base_name + '<' + ','.join(_TypeArgs) + '>' spec_cache = getattr(Gen, '_generic_class_specializations', {}) 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, _TypeArgs, Gen, @@ -3032,9 +3032,15 @@ class ExprCallHandle(BaseHandle): return cached_name: str = cached[0] was_declare_only: bool = cached[1] - # 仅当缓存是 declare_only 版本时才需要补发 if not was_declare_only: - Gen._generic_spec_error = f'特化标记为完整但方法缺失: {cached_name}.{MethodName}' + # 缓存声称已完整,但方法确实不存在:强制补发一次 + spec_cache[spec_key] = (cached_name, True) + try: + self.Trans.ClassHandler._specialize_generic_class( + 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 # 检查方法是否已有 define(blocks 非空表示已编译方法体) struct_sha1_map = getattr(Gen, '_struct_sha1_map', {})