fix(handles): 带前缀类名提取 class_sha1,启用 stub 查找修复 Undefined method

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
This commit is contained in:
TermiNexus committed 2026-08-17 19:35:24 +08:00
1 parent 1f3c83cb6d
commit 08e7b8d0c0
1 file changed
+14 -4
+14 -4
View File
@@ -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 版本时,补发方法体。否则方法调用会查找