fix(len): 特化方法按结构体真实名查找

泛型特化结构体的 LLVM 名可能带模块 SHA1 前缀;__len__ 分派先按该真实名查找,再回退裸模板类。
This commit is contained in:
TermiNexus committed 2026-10-18 17:16:34 +08:00
1 parent 43cedbd3b7
commit 944f5cafbb
1 file changed
+19 -4
+19 -4
View File
@@ -178,11 +178,26 @@ class ExprUtils:
if not Gen._has_function(FullMethodName):
FullMethodName = f'{ClassName}.{op_name}__'
if not Gen._has_function(FullMethodName) and '[' in ClassName:
# 泛型特化方法尚未生成时,回退到裸模板类的方法(如 list.__len__)
_BareClass: str = ClassName.split('[', 1)[0]
FullMethodName = f'{_BareClass}.{op_name}'
# 泛型特化方法尚未生成时,先补发特化,再回退裸模板类(如 list.__len__)
try:
self.Trans.ExprCallHandle._try_complete_generic_specialization(ClassName, op_name, Gen)
except Exception:
pass
FullMethodName = f'{ClassName}.{op_name}'
if not Gen._has_function(FullMethodName):
FullMethodName = f'{_BareClass}.{op_name}__'
FullMethodName = f'{ClassName}.{op_name}__'
if not Gen._has_function(FullMethodName):
_SpecTy: Any = Gen.structs.get(ClassName)
_SpecName: str = getattr(_SpecTy, 'name', '') if _SpecTy is not None else ''
if _SpecName:
FullMethodName = f'{_SpecName}.{op_name}'
if not Gen._has_function(FullMethodName):
FullMethodName = f'{_SpecName}.{op_name}__'
if not Gen._has_function(FullMethodName):
_BareClass: str = ClassName.split('[', 1)[0]
FullMethodName = f'{_BareClass}.{op_name}'
if not Gen._has_function(FullMethodName):
FullMethodName = f'{_BareClass}.{op_name}__'
if not Gen._has_function(FullMethodName):
# 多继承:沿 MRO 祖先链查找 dunder 方法(先声明父类优先,与 VPC 一致)
for anc in Gen._get_mro_chain(ClassName)[1:]: