From 944f5cafbbda035e3da43008c534adb8dae5e7e5 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Sun, 18 Oct 2026 17:16:34 +0800 Subject: [PATCH] =?UTF-8?q?fix(len):=20=E7=89=B9=E5=8C=96=E6=96=B9?= =?UTF-8?q?=E6=B3=95=E6=8C=89=E7=BB=93=E6=9E=84=E4=BD=93=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E5=90=8D=E6=9F=A5=E6=89=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 泛型特化结构体的 LLVM 名可能带模块 SHA1 前缀;__len__ 分派先按该真实名查找,再回退裸模板类。 --- lib/core/Handles/HandlesExprUtils.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/lib/core/Handles/HandlesExprUtils.py b/lib/core/Handles/HandlesExprUtils.py index 5bcd5d3..2be7a99 100644 --- a/lib/core/Handles/HandlesExprUtils.py +++ b/lib/core/Handles/HandlesExprUtils.py @@ -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:]: