fix(generic): 特化缓存声称完整但方法缺失时强制补发
将缓存临时标记为 declare_only 后重新调用 _specialize_generic_class,触发方法体生成。
This commit is contained in:
1 parent
92e467ae4c
commit
f8d84a1941
1 file changed
+11
-5
@@ -3016,13 +3016,13 @@ class ExprCallHandle(BaseHandle):
|
||||
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('][')) + '>'
|
||||
_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', {})
|
||||
|
||||
Reference in new issue
Block a user