两处根因:
1. list[t.CPtr] 报 Undefined method 'append':
- _resolve_generic_slice_type 对 t.CPtr 返回裸名 'CPtr',type_map['T']='CPtr'
替换进模板(item: CPtr)后 CPtr 不在顶层作用域 → append 声明注册失败
- 改保留带前缀 't.CPtr'(可解析)
- 查找端(SymbolUtils.FindStructNameInAnnotation)与声明端
(DeclarationGenerator)的 CPtr 统一规范化为 'ptr',与特化端
_mangle_generic_class_name 一致(list[CPtr]/list[i8*] vs list[ptr])
- _specialize_generic_class 的 cptr_params/class_type_names 判定改 tn_bare
2. list[对象] elem_size=0(get(0)==get(1) 同槽根因):
- T.__sizeof__() 特化后为 'X | t.CPtr'(BinOp 联合),_HandleSizeofLlvm
对 BinOp 落到 else 返回 0 → list.__elem_size__=0 → 元素全写同槽
- 改含 t.CPtr 的联合类型返回 8(指针大小)
3.0 KiB
3.0 KiB
TODO
BUG:list[对象类型] 元素 store/load 不一致(llc 并行误报失败根因)
状态:已根修(TPC _HandleSizeofLlvm 联合类型 sizeof),句柄数组保留(0810f9f)
现象
- TPV 编译器(tpv.exe)Phase B
run_llc_parallel并行跑 llc 时,list[vthreading.Thread]存线程对象 join(0)正常等待,join(1)立即返回 alive=0,失败槽 Result=-1 误报(ClassArrayTest 反复失败)
根因(插桩 [LLC-DBG2] 证实)
list[对象]的 elem_size=0(真正根因,2026-08-19 定位):_list.vp.__init__的T.__sizeof__()在特化后 T 被还原为X | t.CPtr(BinOp 联合)- TPC
_HandleSizeofLlvm(HandlesExprCall.py)对 BinOp 节点落到 else 返回 0 →__elem_size__=0 - 后果:append 每次都写
data + count*0 = data[0](同槽覆盖),get(0)==get(1) 同一槽 → 线程句柄错乱 - 修复:
_HandleSizeofLlvm对含 t.CPtr 的联合类型返回 8(指针大小)
- 叠加效应:
j=0的close()把对象 handle 置 NULL →j=1的 join 用 NULL 句柄 → WAIT_FAILED
相关提交链
42aa90c(c.Deref 增强) → 4bd254a(槽间距) → 3f3e3d5(STARTUPINFOA 清零) → 645e8e0(指针元素) → 88778dc(定位插桩) → 0810f9f(句柄数组绕开)
BUG:list[t.CPtr] 特化 "Undefined method 'append'"
状态:已根修(TPC),待验证
现象
- TPC 编译
handles: list[t.CPtr] = list[t.CPtr](_mbuddy)→Exception: Undefined method 'append' in class 'list[CPtr]' (no function declaration found for 'list[CPtr].append')
根因(TPC 泛型特化名/模板替换不一致)
_resolve_generic_slice_type对t.CPtr返回 raw_name='CPtr'(裸名)→_specialize_generic_class的type_map['T']='CPtr'→ 模板item: T替换为item: CPtr→ CPtr 不在顶层作用域 → append 方法声明注册失败- mangled 名不一致:特化端 spec_name=
list[ptr](type_arg 规范化 'ptr'),查找端(FindStructNameInAnnotation)/声明端(DeclarationGenerator)生成list[CPtr]/list[i8*]→ 找不到
修复(TPC,2026-08-19)
HandlesExprCall._resolve_generic_slice_type:t.CPtr 的 raw_name 保留带前缀't.CPtr'(可解析),去掉 'CPtr' 裸名特殊处理HandlesClassDef._specialize_generic_class:cptr_params/class_type_names 判定改tn_bare('t.CPtr'→'CPtr'内建,不当类类型)SymbolUtils.FindStructNameInAnnotation:CPtr/t.CPtr→'ptr'(查找端类名与特化端统一)DeclarationGenerator:CPtr→'ptr'(声明端 mangled 统一,避免list[i8*]vslist[ptr])
待办
- 重建 TPV 验证:TPC 编译 BuildPipeline.vp 通过 + ClassArrayTest 不再误报
- TPV 侧(tpv.exe 编译其他项目)同类逻辑:ClassGenGeneric._mangle_generic_class_name / TypeGenResolve 的 slice 解析对 t.CPtr 的规范化(需 TPC 重建后排查,若 tpv.exe 编译含 list[t.CPtr] 的项目报同样错需对称修复)