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 版本时,补发方法体。否则方法调用会查找