From 08e7b8d0c04522f5d9766126315729ec93731e24 Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Mon, 17 Aug 2026 19:35:24 +0800 Subject: [PATCH] =?UTF-8?q?fix(handles):=20=E5=B8=A6=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E7=B1=BB=E5=90=8D=E6=8F=90=E5=8F=96=20class=5Fsha1=EF=BC=8C?= =?UTF-8?q?=E5=90=AF=E7=94=A8=20stub=20=E6=9F=A5=E6=89=BE=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=20Undefined=20method?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ExprGenAttr 场景:ClassName 带 sha1 前缀(940e5294667daf5a.ExprGenAttr),struct_sha1_map.get(带前缀名)=None → class_sha1 为空 → _HandleMethodCallLlvm 的 stub 查找路径(if not func and class_sha1)被整体跳过 → fail-fast "Undefined method 'get_attribute_ptr'"(尽管 stub.ll 第 24 行存在该 declare)。 - 带前缀类名:class_sha1 直接取前 16 位,FullMethodName 不再拼接(避免双前缀) - 裸类名:保持原逻辑从 _struct_sha1_map 取 sha1 --- lib/core/Handles/HandlesExprCall.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/core/Handles/HandlesExprCall.py b/lib/core/Handles/HandlesExprCall.py index 729e7bd..768f9c4 100644 --- a/lib/core/Handles/HandlesExprCall.py +++ b/lib/core/Handles/HandlesExprCall.py @@ -2931,11 +2931,21 @@ class ExprCallHandle(BaseHandle): if SpecClass: ClassName = SpecClass struct_sha1_map = getattr(Gen, '_struct_sha1_map', {}) - class_sha1 = struct_sha1_map.get(ClassName) - if class_sha1: - FullMethodName = f'{class_sha1}.{ClassName}.{MethodName}' - else: + # 归一化:ClassName 可能带 sha1 前缀(跨模块 structs 表键,如 + # "940e5294667daf5a.ExprGenAttr"),其前 16 位即模块 sha1,直接用作 + # class_sha1 并免拼接(否则 struct_sha1_map.get(带前缀名)=None → class_sha1 + # 为空 → 下方 stub 查找路径被跳过 → fail-fast "Undefined method + # 'get_attribute_ptr' in class '...ExprGenAttr'")。裸类名则从映射表取 sha1。 + cls_has_prefix: bool = len(ClassName) > 17 and ClassName[16] == '.' + if cls_has_prefix: + class_sha1 = ClassName[:16] FullMethodName = f'{ClassName}.{MethodName}' + else: + class_sha1 = struct_sha1_map.get(ClassName) + if class_sha1: + FullMethodName = f'{class_sha1}.{ClassName}.{MethodName}' + else: + FullMethodName = f'{ClassName}.{MethodName}' # 泛型特化类方法按需完整特化:当 ClassName 是特化名(如 ndarray[double]) # 且缓存中只有 declare_only 版本时,补发方法体。否则方法调用会查找