Commit Graph
94 Commits
Author SHA1 Message Date
TermiNexus 8a0da29461 fix(exprcall): 兄弟 Mixin 兜底按调用类是否声明该方法过滤,修复 NoVTable 回归
780cd4a 用 MRO/组合类判断 _is_mixin_parent 不可靠:Combined 定义在 BaseB 之后,BaseB.caller 翻译时组合类未注册、MRO 查询失败 → 兜底静默跳过 → NoVTableCrossMixinTest 的 TPC 编译 fallback 生成不存在的 BaseB.helper(定义在 BaseA)→ ld.lld undefined symbol(回归)。

改为:调用类自身声明了该方法(class_methods 含 MethodName)但 stub 未命中(如 JsonValue.__getitem__ 跨模块 stub 注册问题)→ 不兜底,fail-fast 暴露上游 stub 问题(防误绑 HashTable,1.LOG 根因);调用类未声明(BaseB.helper / MixinC2.mid2)→ 跨 Mixin,全量遍历找定义类。保留 list 特化过滤(3fd875d)。
2026-08-21 01:26:19 +08:00
TermiNexus 780cd4a13b fix(exprcall): 兄弟 Mixin 兜底仅对组合类父类启用——防误绑 HashTable 方法
3fd875d 只过滤了 list 特化类名,普通类(HashTable)仍被误绑:JsonValue.__getitem__ 未命中时遍历 class_methods 命中 HashTable.__getitem__,this 前移 sizeof(HashTable)=-48 → Load_project_config root.__getitem__ 读 -1 崩溃(1.LOG 4c1f8f779b98eab9.HashTable._slot_hash)。

加固:兜底前检查 class_name 是否是多继承组合类的父类(存在以它为父类的类,如 Generator 的 44 个 Mixin / Combined(BaseA,BaseB))。普通类方法未命中时不再回退到无关类,走 fail-fast(Undefined method)暴露上游 stub 注册/时序问题。
2026-08-20 17:08:14 +08:00
TermiNexus d698fad162 fix(TPC): 泛型基础类型字段访问特化,修复 GSList.Head 返回泛型占位 T*
_handle_attr_nested 对声明为特化泛型(GSList[BasicBlock] | t.CPtr)的字段(如 Function.Blocks)访问 Head/Tail/Count 时,基础 GSList 有 body 直接按基础类型返回泛型占位 T*,AnnAssign 存储时变量被污染为 T*(var_struct_class 错设为 T),后续字段访问/while 循环体翻译静默失败 → llvmlite __function.vp _find_max_ssa_number/RenumberSSA 死循环(LLvmLiteTest Test 3 崩溃根因)。

修复:字段类型为泛型占位指针时,用 class_member_element_class 记录的特化版本 bitcast 后访问返回真实元素类型(如 BasicBlock*);AnnAssign 兜底跳过泛型占位参与变量类型重建,防其它 T* 场景污染。
2026-08-20 15:35:21 +08:00
TermiNexus 3fd875daca fix(exprcall): 兄弟 Mixin 兜底过滤泛型特化类名——防误绑定 list 特化函数
与 TPV CallGenCall.vp 086e792 同根因:JsonValue.__getitem__ 在 found_func 未命中时被兜底遍历 class_methods 误绑到 list[ASTptr].__getitem__ 特化函数,this 按 list 布局前移 sizeof(list) → 运行期读 -1 崩溃(Config.vp root.__getitem__)。候选类名含 '[' 时跳过。
2026-08-20 11:27:13 +08:00
TermiNexus f2cdbdc70f fix(exprlen): 剥离 sha1 前缀修复 len() 分派失效
class_members/class_member_element_class 的 key 为裸类名,而 _CurrentCpythonObjectClass 可能带 sha1 前缀导致 gate miss 落到 strlen(stdint.vp 0xC0000005 根因)。同时按字段静态类型沿 MRO 分派 list.__len__,并移除排查期诊断 printf。
2026-08-20 10:28:29 +08:00
TermiNexus bd5d2467ab fix(exprcall): NoVTable 跨 Mixin self. 调用按定义类解析 + this 前移
缺陷(TPV bootstrap 的 undefined symbol: <sha1>.StmtGenDeclMixin.translate_return
同根因):NoVTable 多继承下,BaseB.caller 内 self.helper()(helper 定义在兄弟
Mixin BaseA,经 Combined(BaseA, BaseB) 组合)被 mangle 成 BaseB.helper —— 用
调用者类做前缀,而定义符号是 BaseA.helper -> ld.lld undefined symbol。

修复(HandlesExprCall.py):
1. 调用端 MRO 回退失败后,全局扫描已注册类找方法定义类(兄弟 Mixin 兜底);
2. _adjust_this_for_inherited_method 支持"调用类不含定义类字段"场景:
   this 按组合布局前移 sizeof(定义类 struct)(BaseB* -> BaseA*)。

新增 Test/NoVTableCrossMixinTest 回归(caller()==42 通过),TestsOverview 记录。
2026-08-20 10:23:47 +08:00
TermiNexus 015d5c38ea fix(global): external 声明升级用 initializer 判空(llvmlite.ir 无 is_declaration 属性)
上次修复用 getattr(g, 'is_declaration') 判断声明态,但该属性仅在
llvmlite.binding 层存在,ir.GlobalVariable 没有 -> 恒 False -> 升级不生效,
_g_gen 依旧无定义。改用 initializer is None 判断(external 声明必无
initializer;已定义全局必有),验证 common + null initializer 可设。
2026-08-20 07:53:33 +08:00
TermiNexus c904fac54d fix(global): import 注入的 external 全局声明遇本模块定义时升级为 common
根因:_EmitExternalGlobalDeclLlvm 把被 import 模块的下划线私有全局
(如各 Handles 模块 _g_gen)以裸名 external 声明注入本模块 module.globals,
_EmitGlobalAnnAssignLlvm 的"VarName in module.globals"误判已存在而跳过定义
创建 -> 全工程 _g_gen 无定义 -> ld.lld undefined symbol: _g_gen。

修复:定义端检测到 existing_gv 是 external 声明(is_declaration)时,
升级为 common linkage + null 初值(多模块同名合并为零值,对齐 _mbuddy
模式),而非静默跳过。
2026-08-20 07:46:36 +08:00
TermiNexus c02f7dbaf1 fix(gentype): _HandleSizeofLlvm 的 CType.POINTER 改 t.CType.POINTER
CType 未导入 HandlesExprCall.py,6ff76f3 引入 NameError。t 模块已导入,
改用 t.CType.POINTER。
2026-08-19 22:52:49 +08:00
TermiNexus 6ff76f3cb6 fix(gentype): t.CPtr.__sizeof__() 返回 8 修复 list[CPtr] elem_size=0
CPtr 无显式 Size(t.py class CPtr 未设 Size)→ GetClassByName 路径
size_bits=0 → t.CPtr.__sizeof__() 返回 0 → list[t.CPtr](_mbuddy) 单参
构造时 elem_size=0(T.__sizeof__() 分支)→ append 崩溃(ASAN: 读 0xf8
零页,pool.alloc 处)。GetClassByName 路径补 POINTER 判断:HasPosition
(POINTER) 且 size_bytes==0 → 8(指针大小,与 str/bytes 一致)。
2026-08-19 22:49:37 +08:00
TermiNexus 2f0d52e736 fix(gentype): list[t.CPtr] 特化与 list[对象] elem_size 根本修复
两处根因:
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(指针大小)
2026-08-19 22:44:15 +08:00
TermiNexus e82640ac94 fix(gentype): c.Deref 类型推断支持转换包裹与联合全 side
_infer_deref_target_type 仅在 Deref 为赋值直接 RHS 时推断加载类型,
被类型转换链包裹(如 (T | t.CPtr)(t.CPtr(c.Deref(p))))时返回 None →
回退 load 1 字节 → 读回垃圾指针(BuildPipeline run_llc_parallel 存
Thread* 后 join/is_alive 失效、llc 并行 5 秒误报失败的根因)。
增强:新增 _IsCastWrappingDeref 放行"转换链包裹 Deref"(ifexp/binop
仍不放行);联合注解(A | B)遍历全部 side,取第一个可解析类型。
2026-08-19 21:14:13 +08:00
TermiNexus 0db1ccd1bb refactor(asan): TPC_ASAN 环境变量改 args 直传
--asan 不再写 TPC_ASAN 环境变量,改为 Config 解析后直接经
asan_mode=args.asan 传给 Phase2Translator(主进程 .ll→.obj 插桩与
链接 -fsanitize=address 均读 self.asan_mode),消除环境变量在
worker 子进程/外部调用链下的不可靠性。
2026-08-19 08:47:32 +08:00
TermiNexus 267e9881b4 perf(structgen): finalize 特殊字符 struct 名加引号合并为单次 re.sub
逐 name 全文本 re.sub 改为单正则 alternation 一次扫描,消除 N 次 O(text) 扫描(lookahead 边界保证备选互斥,语义等价)
2026-08-19 00:32:21 +08:00
TermiNexus fbd132284b perf(phase2): 按 PROF 热点优化编译耗时
- HandlesImports: _TryLoadClassMembersFromPyi 复用 _pyi_cache 跳过重复 isfile(-12.8s);_LookupStubFuncType 类级缓存 + 签名增量扫描新增 stub,去掉每文件 isfile(-6.5s+)
- Phase2Translator: pyi cache 仅主进程构建(worker 只读 pkl,-23s+pickle 10.4s);include 源文件 sha1/存在性缓存消除 _build_current_ModuleSha1Map 重复磁盘 I/O
- StructGen.finalize: 行过滤改 startswith(tuple) 预计算,消除 O(lines×structs×patterns) 嵌套循环(tottime 84.8s → 预期数秒)
- 附带 fail-fast(任意文件出错立即终止)+ 子进程 PROF 硬编码
2026-08-19 00:28:40 +08:00
TermiNexus 1808e90fd3 feat(projectrans): 主进程 PROF 自动落盘 + 编译耗时统计 + 分析脚本升级
- Projectrans.py 入口包 cProfile,整次编译自动导出 main_prof_{pid}.prof 到 ./PROF;成功/失败均输出 [TIMING] 总耗时(stderr)并落盘 main_time.txt
- Config.py 新增 --asan(透传 TPC_ASAN=1)+ 每次编译自动清理 PROF 目录 *.prof
- PROF/1.py 升级为综合报告(tottime/cumtime top + callers 定位 + 模块聚合 + 上次编译耗时)
2026-08-19 00:28:18 +08:00
TermiNexus bdc5ec3e88 fix(HandlesImports): 跨模块展平父类无条件 force 重载,消除并行 worker 布局不确定
并行 worker 中 class_members[Generator] 曾出现 83/85/88/89/105/106 vs 114
的不确定变体:父类在某次展平时祖先未加载完成即被冻结为部分成员,guard
(成员非空即跳过)又阻止重载 → this_adjust 按不完整 members 计算字节偏移
→ 继承方法 self 错位 → 运行时越界崩溃(FuncTest is_exception_name strcmp,
错位 68 字节)。

修复:
- 父类加载循环无条件 force 重载:_TryLoadClassMembersFromPyi(force=True)
  先清空该类 class_members/defaults/signeds/bitfields/byteorders/bitoffsets
  再重建,字段顺序与定义模块 stub 一致;对其祖先递归同样强制重载,
  最终所有 worker 展平结果确定性一致。
- 已加载父类经 class_sha1_map 直连定义模块 sha1 强制重载(O(1)),
  避免对每个父类全量扫描 ModuleSha1Map。
- _TryLoadClassMembersFromPyi 返回 bool(找到即停),移除 [DIAG-EXT] 诊断。
2026-08-18 14:38:06 +08:00
TermiNexus 858aba46d0 fix(HandlesImports): _seen_flat_cls 移到父类循环外,菱形去重真正生效
b021c5b 的递归展平把 _seen_flat_cls 定义在 for _ParentClass 循环内,每个父类新建 seen → 菱形祖先(ClassGenBase)被每个继承它的 ClassGen* 父类各展平一次 → Generator class_members 707 字段(与 struct 114 不一致) → this_adjust sub_off 索引越界 → 继承方法不调整 → register_reexport 写 0x3f 崩溃。运行时诊断确认(707→114),register_reexport 调用生成正确 this_adjust(GEP +776)。已移除全部临时诊断。
2026-08-18 14:04:33 +08:00
TermiNexus b021c5b527 fix(HandlesImports): 跨模块 class_members 展平同步按继承源去重
81ad712 只同步了 HandlesClassDef(运行时) 与 DeclarationGenerator(stub struct),遗漏并行 worker 跨模块重建路径 _EmitExternalClassDeclLlvm:仍用旧拼接+按字段名过滤算法,菱形继承下与 stub struct 布局不一致,worker 中 this_adjust 算不出偏移,继承方法 self 不调整,运行时错位崩溃(register_reexport 写 0x3f)。改为递归按继承源去重,与 HandlesClassDef._FlattenInherited 一致。
2026-08-18 13:44:22 +08:00
TermiNexus 97b714603d fix(HandlesExprCall): this_adjust 字段偏移计算剥离 sha1 前缀
register_reexport 等继承方法调用时 ClassName 带 sha1 前缀(如 e1ea7eaf63a9c3d1.Generator),而 class_members 的 key 是裸类名 → _compute_field_byte_offset 查不到字段 → this_adjust 被跳过 → 继承方法 self 不调整 → 方法内按 ImportsGenMixin 独立布局(0-3)访问 Generator 内存错位 → ReexportSrcs 读到 null 后写 [63] 越界(ASAN 写 0x3f 崩溃)。修复:查 class_members/structs 前剥离前缀(对齐 _EnsureClassParentsLoaded 做法)。
2026-08-18 13:32:01 +08:00
TermiNexus 7c6a497111 fix(DeclarationGenerator): 按自有字段展平时补齐祖先 vtable 指针
_FlattenInheritedDecl 递归只取类自有字段,而原 _get_inherited_members 返回完整 struct 天然含 vtable。改造后 Module(AST CVTable) 等子类 struct 缺 vtable 指针 → 字段错位 → 编译报 'cannot store i8* to %AST**'(写 vtable 到 parent 槽位)。新增 _ShouldEmitOwnVtablePtr 判定,递归各祖先类时在自有字段前补齐 vtable。
2026-08-18 13:19:51 +08:00
TermiNexus 81ad712475 fix(Handles): 多继承字段展平按继承源去重,消除菱形重复
Generator 同时继承 ClassGenMixin/ClassGenEnum/ClassGenGeneric/ClassGenVTable/ClassGenDef/ClassGenBase,而前 5 个都继承 ClassGenBase → ClassGenBase 41 字段被重复展平 6 次(struct 707 元素),class_members 索引与 struct 布局错位 → 跨 Mixin 方法 this_adjust 失效 → is_exception_name 读错位内存 strcmp 越界(ASAN heap-buffer-overflow)。

修复:HandlesClassDef 与 DeclarationGenerator 的多继承展平改为递归按继承源去重(每类只展平一次,只取自有字段;同名字段如 TempDir 跨非继承 Mixin 仍各自保留,避免 2026-08-10 历史去重缺陷回归)。
2026-08-18 13:13:25 +08:00
TermiNexus 2922af79f1 fix(LLVMCG): 禁止对 null 指针常量做 load 转 int 字段
_coerce_value 中 target 为 IntType 且 val 为 PointerType 时,若
val 是 null 常量且 pointee.width == target.width,此前直接
builder.load(null) 生成 load i32, i32* null,运行时 ASAN
access-violation。根因场景:Generator.__init__ 里
self.ClassMetaKinds = None(字段注解 t.CInt | t.CPtr,联合类型
退化为 i32 槽位,None 解析为 i32* null)。修复:null 常量赋 int
字段直接返回 0;_store 的 null 分支同步补 IntType 处理。
2026-08-18 12:50:31 +08:00
TermiNexus 0e80019033 fix(subscript): 泛型 T|t.CPtr 指针槽变量优先走 i8** load,修 8fbba list[str].get 返回类型不匹配
TPC 编译 TPV 时 _list.vp 泛型方法体 elem_ptr: T|t.CPtr = t.CPtr(...):
T 未解析时 var_struct_class[elem_ptr] 误注册 llvmlite.Value →
_HandleSubscriptLlvm 的 elem_class 推断为 Value → cast Value* → 与
get 声明 i8* 不匹配(llc 报错)。修复:
1. _is_struct_ptr_union 放宽——泛型参数 Name(单字母大写)也判定指针槽
   联合(标量 T 退化为 Ptr(i32) 不命中 i8 分支,安全)
2. _HandleSubscriptLlvm 的 var_ptr_element 分支提前到 elem_class 推断
   之前——T|t.CPtr 指针槽变量优先 i8** load i8*(8 字节)
2026-08-18 10:12:06 +08:00
TermiNexus 15faa1f7b1 perf(vast_c): slots 偏移直写绕过 Python _Init,解析加速 5.5x → 10.6x
- NewNode 改用 tp_new + tp_members.offset 直接写 slots 成员(绕过 Python 层 _Init 帧,_Init 201 万次 26s 是 worker 最大 tottime)
- 布局按 _fields 顺序构建并 PyCapsule 缓存(SlotsLayout);布局缺失/参数越界回退 PyObject_Vectorcall(行为与 vast 一致)
- 修正 PyCapsule_New 成功但 SetItem 失败时的双重释放
- 验证:差分 83/83 全绿;includes/ + TransPyV/App 201 文件 vast_c vs vast 结构与位置属性零差异;基准 8.69ms → 0.82ms(10.6x)
2026-08-18 07:37:30 +08:00
TermiNexus 6613542d8e perf(compile): pyi 缓存落盘改增量构建,Phase2 新增 vpi 不再全量重建
- _BuildPyiCacheFile 原每次签名变化(Phase2 过程新增 include .vpi)都全量 ast.parse 所有 vpi(prof 43 次 × 0.28s = 12.2s)
- 增量:加载旧 pkl,按 (basename, size, mtime) 复用未变化文件的 vast 树,只 parse 新增/变化文件
- 验证:147 个 vpi 新增 1 文件时仅 0.006s(原全量需数秒);无旧 pkl 时自然退化为全量
2026-08-18 07:27:02 +08:00
TermiNexus 94a065a386 perf(vast_c): 节点构造 tp_new 直构试验打平,回退 Vectorcall 并记录结论
- 实测 tp_new + 逐字段 SetAttr 与 PyObject_Vectorcall 打平(基准 0.9x,略慢):PyTuple_New(0) + _fields 缓存查询 + slots 名称线性查找开销抵消 Python 帧收益
- 回退并注释说明:要降低 _Init 19.7s 需 tp_members.offset 偏移直写(风险较高另行评估)
2026-08-18 07:23:41 +08:00
TermiNexus e37cc8d792 fix(vast_c): alias/keyword 节点补位置属性,201 文件全量对比零差异
- ParseImport/ParseImportFrom/ParseImportAlias:alias 节点缺 lineno/col_offset(vast 有),编译器符号注册可能按节点位置关联
- MakeKeyword:keyword 节点缺位置属性(4 个调用点:函数调用/类定义的 k=v 与 **kwargs)
- 修复后 includes/ + TransPyV/App 全部 201 个 .vp 文件 vast_c vs vast 的 dump 与位置属性完全一致(此前差异 6 文件 keyword + 2 文件 alias)
2026-08-18 07:07:21 +08:00
TermiNexus 6350b81307 feat(vast_c): extern/export 完整语义(注解改写+标记)并接入 vast.parse
- ParseExternDef:支持 4 种语法(extern/export [def] A(...) -> T [': pass']),返回注解改写为 <原类型> | t.State(extern)/ <原类型> | t.CExport(export),节点设 Extern=True/Export=True(对齐 vast Parser._ParseExternDef/_ParseExportDef)
- MakeTAttrNode:构造 t.Attr 注解节点(Attribute(Name('t'), attr))
- vast.parse 接入:默认走 vast_c C 加速路径(VAST_USE_C=0 禁用,=strict fail-fast 直接抛),异常回退纯 Python vast
- 差分测试 83/83 全绿(新增 7 个 extern/export 用例);includes/ 与 TransPyV/App 4 个真实 .vp 文件 C 路径与纯 Python 输出一致
2026-08-18 06:59:10 +08:00
TermiNexus d13b966604 fix(vast_c): 修复三处解析节点后未消费 token 的 bug(死循环/语法错误)
- ParseAtom 普通名字分支:MakeNameNode 前未 NextTok,'x = 1' 时 idx 恒 0 → ParseModule 死循环(True/False/None 分支有 NextTok,普通名字分支遗漏)
- ParseComparison TK_OP 分支:设置 OpName 后未 NextTok 消费 < > <= >= == != 比较符(is/in 分支有)→ 'a < b' 后比较符未消费导致 unexpected token
- ParseTarget NAME 分支:MakeNameNode 前未 NextTok → 'for i in' / 推导式 target 报 expected name

三处同款根因:构造节点后忘记推进 token 游标。
差分测试 76/76 全绿;基准 5.5x 加速(11.6ms -> 2.1ms/次,真实复杂源码)
2026-08-18 06:50:27 +08:00
TermiNexus 0d15e8cb7a feat(vast_c): C 版解析器阶段 0——赋值/名字/数字子集,直接构造 vast.nodes 树
- MSYS2 MinGW gcc 编译 CPython 3.12 C 扩展(_parser.pyd,-lpython312 必须置于源文件后)
- Tokenizer + 表达式/赋值/模块解析,节点通过 PyObject_Vectorcall 直接实例化 lib.vast.Nodes 类
- 输出与 vast.parse 结构完全一致(含位置属性),eval 模式复用 vast.parse 语义
- 可行性验证:200 语句文件 × 200 次基准 9.0x 加速(6.17ms -> 0.685ms/次),C 侧开销主要在节点构造,后续可继续优化
2026-08-18 05:45:11 +08:00
TermiNexus e3886a244d perf(compile): 批次加权分桶消除长尾 + 共享符号表去重复序列化 + typedef 收集走 AST 缓存
- Phase2 批次切分:原按文件数均分(batch_size=ceil(N/n)),大文件集中批次拖长尾、worker 空等;改为按源文件大小 LPT 贪心分桶,各批次总成本均匀(任务颗粒度不均匀)
- 共享符号表序列化:shared_data 同时含 symbol_table 对象与 symbol_table_bytes 双重序列化(_shared_sym.json 4.65MB 近半冗余);统一为仅传 symbol_table_bytes,worker/批次端从字节反序列化(includes 与 App 两阶段同步修改)
- Phase1 _collect_typedef_map / _process_file_pyi:直读+ast.parse 改为 parse_python_file mtime AST 缓存,Phase1 内重复收集与 Phase2 主进程解析共享同一缓存
2026-08-18 05:36:12 +08:00
TermiNexus 7917be0fa1 perf(handles): stub 索引增量重建 + vtable on-demand pyi 缓存类级化,消除 worker 重复解析
- HandlesImports._build_stub_index:以已扫描文件集合替代文件数签名,无新增文件时仅一次集合比较;新增文件只增量解析,消除每编译完一个文件即全量重扫(prof 847 次全量重建 61s)
- HandlesImports._TryLoadStructFromStub:索引命中直接返回,仅在 miss 时才触发增量扫描
- HandlesExprCall._try_register_vtable_ondemand:函数局部 pyi_cache 提升为类级 _vtable_pyi_cache / _vtable_methods_cache,437 次 open+ast.parse 同批 pyi 降为每 pyi 一次(prof 38.5s)
2026-08-18 05:27:53 +08:00
TermiNexus 043c65ee52 fix(vast): FunctionDef 槽位补 Extern/Export,修 __slots__ 回归 AttributeError
_ParseExternDef/_ParseExportDef 设置 node.Extern/node.Export(动态属性),
__slots__ 类无 __dict__ 导致 AttributeError: 'FunctionDef' object has no
attribute 'Extern'。FunctionDef/AsyncFunctionDef 的 attrs 补
Extern/Export(_FUNC_ATTRS),槽位随之包含;unparse 用 getattr 读取兼容。
extern/export 冒烟 + vast 差分 51/53 0 FAIL。
2026-08-18 05:12:09 +08:00
TermiNexus 68d180e718 perf(handles): 跨模块类声明分类/节点查找缓存,去重 _EmitExternalClassDeclLlvm
新增类级 _extern_class_classify_cache((sha1,class)->分类元组)与
_extern_class_decl_cache((sha1,class)->pyi ClassDef 节点):bases/
decorator 分类遍历提取为 _ClassifyExternalClass 纯函数并缓存,
_TryLoadClassMembersFromPyi 节点查找改走索引避免跨任务重复线性扫描
pyi_tree.body(8214 次调用热点之一)。Gen 依赖部分(字段/方法/struct
注册)保持每 Gen 执行,不做整体跳过。
2026-08-17 23:27:44 +08:00
TermiNexus b760082be8 perf(compile): pyi 树 pickle 落盘 + worker initializer 预热,消除进程间重复 parse
43 个 worker 任务分 ~16 个 spawn 进程,每进程重新 parse 全部依赖
.vpi(4479 次 vast.parse、245s)。主进程把 temp 下全部 .vpi 的 vast
AST 树 pickle 落盘 temp/_pyi_cache_v1.pkl(签名=(名,size,mtime),
变化才重建),两处 ProcessPoolExecutor 加 initializer 预热 ImportHandle
类级 _pyi_cache(优先 pickle.load,失败回退逐文件 parse)。
TPC_WORKER_WARMUP=0 可关闭对比。预计进程内首次解析尖峰降为一次 load。
2026-08-17 23:27:44 +08:00
TermiNexus 9605af8ea1 perf(vast): AST 节点类加 __slots__,去 __dict__ 提速降内存
AST 基类 __slots__=(),131 个动态节点类按 fields+attrs 生成 __slots__,
_Init 改 object.__setattr__;类默认值改为 _node_defaults 字典(原类属性
与 __slots__ 冲突)。解析提速 ~9%,实例内存 Name 由 48B+独立 dict 降为
80B 平铺,无 __dict__ 残留。Python 3.12 pickle 对 __slots__ 类开箱即用
(__reduce_ex__(2)),131 类 pickle roundtrip 全过,vast 差分 51/53 0 FAIL。
2026-08-17 23:27:43 +08:00
TermiNexus 50c0703afd feat(profiling): worker 进程导出 cProfile——TPC_WORKER_PROF 环境变量开关
主进程 cProfile 只能看到进程池等待(WaitForMultipleObjects/as_completed
约 280s),看不到 worker 进程内部 CPU 分布(vast parse 等真实热点)。
新增 _ProfileWorker 装饰器包裹 _parallel_translate_worker 与
_parallel_translate_batch:设置环境变量 TPC_WORKER_PROF 为输出目录时,
每个任务导出 worker_prof_{pid}_{seq}.prof(可用 pstats 合并分析);
未设置时零开销(原样返回函数)。
2026-08-17 22:42:14 +08:00
TermiNexus 3326c41702 perf(compile): 依赖扫描缓存键 abspath 归一化 + compute_sha1 缓存
parse_python_file/get_file_dependencies 缓存键改用 abspath 归一化:
同一文件以相对/绝对、正斜杠/反斜杠/含 .. 等形式传入会产生多条缓存
条目导致重复 open+read+ast.parse(439 次 get_file_dependencies 25.2s、
1496 次 parse 33.1s 的浪费来源)。compute_sha1 加有界结果缓存。
验证:同文件 4 种路径形式缓存合并为 1 条,find_reachable 二次调用
显著加速,相对导入解析结果不变。
2026-08-17 22:20:29 +08:00
TermiNexus 5692e9b097 perf(stubgen): pyi 转换加缓存——convert 纯函数缓存 + Phase1 mtime 缓存
Converter.convert 147 次调用 45s、_process_file_pyi 98 次 50s。convert
按 (内容, 模块名) 纯函数缓存并合并内部两次 ast.parse;Phase1 按
(绝对路径, 模块名)+mtime+size 缓存 pyi 转换结果与 docstrings,未变化
跳过 open+read+parse。缓存上限 4096 条防内存膨胀,配置变更时清空。
2026-08-17 22:20:28 +08:00
TermiNexus e25095da43 perf(vast): _At 内联 _Peek(0) 缓存逻辑 + Node 构造 __dict__ 直写
_At 被调用 1384 万次,每次经 _Peek 再取 token;内联 _Peek(0) 缓存
(_PeekCacheIdx/_PeekCacheTok)省 2300 万次函数调用,实测单文件解析
端到端提速 ~37%。_Init 的 setattr 改 __dict__ 直写(AST 节点无
__slots__/property,行为等价)。vast 差分测试 51/53 PASS 0 FAIL。
2026-08-17 22:20:28 +08:00
TermiNexus c2b04f5026 fix(compile): _LoadSha1Map 缓存补充只加载当前编译有效 sha1,修 9026a429f5e2d0e0.new_builder undefined symbol
.transpyc_cache 残留旧版 llvmlite/__builder.vp 的 9026a429f5e2d0e0.pyi/
.stub.ll(当前版本是 d9b3d06934cd1898)。_LoadSha1Map 从全局缓存补充
temp 缺失文件时不检查 sha1 有效性,把旧版 .vpi/.stub.ll 也加载进
sig_files/stub_files → 同名类 IRBuilder 按旧 sha1 前缀注册 →
new_builder 用 9026a429f5e2d0e0 前缀拼接,链接 undefined symbol。
补充逻辑移到 sha1_map 加载之后,仅补充 sha1_map 中存在的 sha1。
2026-08-17 21:51:21 +08:00
TermiNexus 401429ccdf fix(generic): 特化 T 替换判据修正——t 模块内建类型(裸名或 t. 前缀)仍用 type_name
上一提交对类类型参数改用 mangled type_arg 替换 T,但 type_name 为
't.CInt'(带 t. 前缀、不在 _BUILTIN_TYPE_NAMES 裸名集合)时被误判为
类类型,改用 type_arg='i32' 替换 → list[t.CInt] 特化方法体出现
'i32.__sizeof__'(源码无此名)→ [FATAL][__sizeof__] 类型 'i32' 无法
解析 + self 类型错乱(list[i32] 中找不到 CifEvalOk,StmtGenCifMixin
编译崩溃)。判据改为取裸名(去掉 t. 前缀)判断内建,内建仍用 type_name,
只有真正的类类型参数(AST/ast.AST 等)才用 mangled type_arg。
2026-08-17 21:44:40 +08:00
TermiNexus dd95bf5bd4 fix(handles): _try_operator_overLoad fallback 补回 SpecClass 初始化,修 UnboundLocalError 2026-08-17 21:25:25 +08:00
TermiNexus fa2cfef205 fix(generic): 特化 T 替换用 mangled 名 + operator fallback 选有 define 的特化
1. _specialize_generic_class 的 type_map 对类类型参数改用 mangled type_arg
   (如 f467978339422f32.ASTptr)替换 T,而非裸短名 type_name:模板内部嵌套
   注解(list[T].__iter__ 返回 list[T])不再被替换成裸 list[AST] 后重新特化出
   只有 declare、无方法体的错误特化 → 消除 ld.lld undefined symbol:
   7cadfe07e983fd90.list[AST].__len__/list[ClassDef].__len__。
2. _try_operator_overLoad 特化 fallback 改为优先选已编译方法体(define)的特化,
   全部只有 declare 时按需补发;dict 插入序不再导致 len() 选中错误特化。
2026-08-17 21:19:43 +08:00
TermiNexus bd0e541b74 fix(handles): 删除 [CD] lookup: 调试输出及无用 _is_cd_key 逻辑
删除 _HandleNameLlvm 中 4 处 [CD] lookup 调试打印(干扰编译日志)、
随之失效的 _is_cd_key 计算、以及仅用于打印的 SymbolTable.lookup 死代码。
2026-08-17 21:00:52 +08:00
TermiNexus 3b5f2af838 fix(structgen): 跨模块 struct 兜底命名改查 _struct_sha1_map,修复 7cadfe07e983fd90.Translator 前缀错位
泛型特化 _specialize_generic_class 把 Gen.module_sha1 切换到模板定义模块
(_list=7cadfe07e983fd90)的窗口内,_generate_structs Step 1 对不在
class_sha1_map 的类(因 LlvmGenerator 共享 class_methods 跨文件泄漏而
缺条目)用 _mangle_name 兜底,错误注册为 7cadfe07e983fd90.Translator 等
跨模块类型 → Translator.__before_init__ self 类型错前缀,与构造 result
(6ccfee1e5bd522ed.Translator*)不匹配,llvm 报 Type of #1 arg mismatch。
兜底改为优先查 _struct_sha1_map(Phase2 从 vpi 扫描构建的正确类→模块映射),
特化类自身仍走 _mangle_name(用模板 sha1 命名是设计意图)。
2026-08-17 20:55:47 +08:00
TermiNexus 7e710d1e9a perf(vast): _Peek(0) 增加游标缓存,命中率 87% 降低解析热点开销
TokenStream._Peek 是 cProfile 最大热点(1588 万次调用,累计 4.86s)。
递归下降解析常在同一游标位置重复窥视(_At/_AtOp/_AtName 等),
增加 _PeekCacheIdx/_PeekCacheTok 字段缓存最近一次 offset=0 结果,
命中时跳过 len() 与列表索引;游标移动后 Idx 失配自然失效。
实测大文件解析命中率 87.1%(6503 次调用仅 717 次真实访问),
vast 差分测试 51/53 通过、0 FAIL,正确性无回归。
2026-08-17 20:29:34 +08:00
TermiNexus ecdb5c34c5 Revert "refactor(compile): 完全去除多进程,翻译/编译全部改顺序阻塞执行"
This reverts commit 15e8bc7c7d.
2026-08-17 20:28:24 +08:00
TermiNexus 15e8bc7c7d refactor(compile): 完全去除多进程,翻译/编译全部改顺序阻塞执行
ProcessPoolExecutor 批次/波次子任务模型导致跨模块 struct 类型前缀错位
(7cadfe07e983fd90.Translator != 6ccfee1e5bd522ed.Translator,见 1.log),
且 cProfile 墙钟被进程池等待支配(223s 中 173s 耗在 WaitForMultipleObjects)。
删除 _parallel_translate_worker/_parallel_translate_batch、_executor_pool
及两处 llc ThreadPoolExecutor,App/includes 翻译按依赖拓扑顺序阻塞翻译,
llc 编译逐文件阻塞执行,消除 pickle 序列化共享符号表与进程池等待开销。
2026-08-17 20:22:45 +08:00