fix(len): 特化方法按结构体真实名查找
泛型特化结构体的 LLVM 名可能带模块 SHA1 前缀;__len__ 分派先按该真实名查找,再回退裸模板类。
This commit is contained in:
1 parent
43cedbd3b7
commit
944f5cafbb
1 file changed
+19
-4
@@ -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:]:
|
||||
|
||||
Reference in new issue
Block a user