TermiNexus
|
a433f79f54
|
基线重置,TransPyC 不再作为直接脚手架主仓库
|
2026-09-09 14:44:44 +08:00 |
|
TermiNexus
|
0bda395ecc
|
fix(translator,peephole): TPC 属性链解析修复与窥孔 T1-T3 收尾
- TPC(lib/core): 泛型父特化形参按声明类登记 var_struct_class; _find_struct_key 键归一支持方括号内嵌 sha 前缀; 字段探测失败不再冒泡 FuncGen fail-fast; cast 局部通用指针槽按静态类 bitcast; 属性解析失败附诊断
- 窥孔(includes/llvmlite/__function.vp): 窥孔移至 Renumber 前使输出 SSA 编号连续; T3 no-op bitcast 消除; T4(数组 bitcast->GEP)验证干扰返回类型收敛已移除
- 附调试打点与 1.log
|
2026-09-08 12:52:48 +08:00 |
|
TermiNexus
|
76d1ee6076
|
fix(compiler,peephole): TPC 属性链解析与窥孔输出瘦身
- TPC(lib/core): 任意级属性链按链前向类解析恢复 stub 退化字段; cast 局部 rowptr[X] 登记回填; 通用指针槽按静态类名 bitcast 兜底; 赋值 RHS 求值失败 fail-fast 防未初始化变量; 报错行按源码文本锚定并附 ATTR-DIAG 现场
- 窥孔(includes/llvmlite/__function.vp): 成员访问单级链模式; 窥孔移至 Renumber 前使 SSA 编号连续; T3 no-op bitcast 消除; 替换缓冲按最坏上界分配
- __builder/__module/string.vp 配套; 清理 Test 构建产物与 PROF 杂项
|
2026-09-08 11:02:37 +08:00 |
|
TermiNexus
|
45e78ad107
|
基线重置,修复了一些 bug
|
2026-09-07 14:46:02 +08:00 |
|
TermiNexus
|
60dbdfe8d2
|
fix(tpc): 方法调用虚分派——变量与模块短名同名时不误入模块函数路径(base.kind 折叠根因)
|
2026-08-28 10:23:26 +08:00 |
|
TermiNexus
|
db80178d2e
|
fix(tpc): is_instance_var 判定豁免与子模块短名同名的已注册变量(base.kind 误判为模块路径)
|
2026-08-28 08:23:08 +08:00 |
|
TermiNexus
|
0230385891
|
feat(tpc): 新增单目 * / & 运算符(Deref/AddrOf)AST 节点与 LLVM 翻译
|
2026-08-28 07:34:58 +08:00 |
|
TermiNexus
|
50ca560563
|
fix(tpc): list 联合类型方法分派保护 + str 压平条件收紧 + external global 裸名兼容
- HandlesAssign: 变量已有同 base 声明类型时不再覆盖 var_struct_class(sha1 前缀特化名覆盖裸名,导致 dbody.get 查表 miss 后 fallback 到 list[int].get,i32 返回值被截断成垃圾指针崩溃——TPC 侧根治)
- HandlesExprCall: IdentifiedStructType 真值判断改 is None(opaque 时 bool() 触发 __len__ assert)
- HandlesFunctions/HandlesImports: IsStr 压平条件加 PtrCount<=1,str|t.CPtr(i8**) 不压平;external global 正则兼容裸名格式
|
2026-08-24 23:31:08 +08:00 |
|
TermiNexus
|
c62153a685
|
perf(tpc): import 热路径优化——walk 结果缓存 + DebugPrint 参数惰性化
- import 兜底查找(_EmitModuleDeclarationsLlvm)每次解析失败都 os.walk 递归扫描 includes/工程目录,且多级模块名与 basename 永不匹配纯浪费:改为多级跳过 + 目录 walk 结果类级缓存(编译进程内目录不变)
- DebugPrint 调用点(HandlesTypeMerge 类型查询热路径)无条件构造 f-string 参数(含昂贵的 ast.dump),即使 DebugFile 未设置也执行:改为 getattr(DebugFile) 防护后才构造(单文件 profile:_io.open 1253 次 1.76s + DebugPrint cum 2.24s)
|
2026-08-22 06:05:43 +08:00 |
|
TermiNexus
|
daf79af1cc
|
fix(tpc): 返回 fail-fast 豁免 void 联合注解与 extern/export 声明型函数
- sprintf 误报:返回注解 t.CVoid | t.CExport(BinOp BitOr 联合)被旧判定忽略 -> 掉出末尾误报,且 [FATAL] 终止杀死 include worker -> BrokenProcessPool
- 修复:新增 _IsVoidOrDeclAnnotation 递归识别联合注解(注解中 | 表示 and):void(None/t.CVoid)+ extern/export 声明型辅助符号(State/CExport/CExtern)均豁免
- 验证:t.CVoid|t.CExport / int|t.State / t.CVoid / None -> 豁免;裸 int -> 仍 fail-fast(missing_return 用例保持命中)
|
2026-08-22 05:17:03 +08:00 |
|
TermiNexus
|
56a4b5c818
|
fix(tpc): stub 加载器解析全局变量声明——跨模块全局变量不再静默丢失
- 根因:_LoadDeclarationsFromStubLlvm 只解析 struct/declare,忽略全局变量声明行,TPC 编译 TPV 时跨模块全局变量(StubMerger._sha1_store_count 等)从未嵌入 Gen.module.globals
- 后果:_lookup_module_global 恒 None -> return 静默跳过 ret(HandlesReturn 的 if Val 分支)、跨模块赋值静默丢失
- 修复:逐行循环加分支解析 16hex 前缀的 external global 声明(剥离 zeroinitializer 与 align 尾部修饰),用 _parse_llvm_type 解析类型后嵌入 external GlobalVariable;.str. 内部常量与 @main 等非 16hex 前缀跳过
- 诊断脚本验证 4 种真实 stub.ll 格式(struct 指针/数组/zeroinitializer/vtable 结构体)全部解析成功
|
2026-08-22 04:21:04 +08:00 |
|
TermiNexus
|
4b0482657b
|
fix(tpc): 返回 fail-fast 判据改为源码层面——显式 return 结尾不再误报
- PopulateSha1MapStore 源码末句是 return(vast 解析 body[-1]=Return),但翻译后未 terminated(HandlesReturn L133 HandleExprLlvm 返回 None 时静默跳过 ret)被误判为掉出末尾
- 判据从 builder 状态改为源码结构:末句是 Return 或控制流(If/Match/While/For/Try/With)即不报错;只有末句是普通语句且非 void 注解才 fail-fast
- 静态检查(源码)与动态状态(builder block)分离,翻译层问题不该归类为源码掉出缺陷
- NegativeTest missing_return(末句 Assign)仍报错
|
2026-08-22 04:13:43 +08:00 |
|
TermiNexus
|
09d03f4525
|
fix(tpc): 返回 fail-fast 误报修复——末句控制流掉出末尾不报错
- 检查未区分普通语句掉出与末句控制流(match/if)掉出:match 翻译后停在合成 after 块(未 terminated)是机械产物,所有 arm 已 terminated 属正常(fatal_error + return None 样板),被误判为掉出缺陷
- 修复:Node.body[-1] 是 If/Match/While/For/Try/With 时豁免 fail-fast(符合隐式返回规则:末句控制流 -> unreachable)
- NegativeTest missing_return(末句 Assign)仍报错
|
2026-08-22 04:08:43 +08:00 |
|
TermiNexus
|
3117ab3dec
|
fix(tpc): import fail-fast 判据误报修复——文件系统找不到不等于模块不存在
- TPV 自举工程 includes 为合并形态,源码模块(lib.Stub.StubMerger 包)不提供裸 .vp 文件,声明由 ModuleSha1Map 定位 sha1 -> temp/*.stub.ll 加载(_LoadDeclarationsFromStubLlvm,与 FullModulePath 无关)
- 原判据只看 FullModulePath 文件系统存在性 -> TPV 构建所有 import 误报 ImportError
- 改为:文件系统找不到时查 _source_module_sig_files / Gen.ModuleSha1Map(TPV 工程由 Phase2Translator._ModuleSha1Map 同步而来),模块有 sha1 注册即视为可解析
- 单文件编译两表皆空,NegativeTest 假 import 用例仍 fail-fast
|
2026-08-22 04:04:30 +08:00 |
|
TermiNexus
|
0ce4a4d073
|
fix(tpc): import 路径/隐式转换/缺失 return 三项漏检 fail-fast
- HandlesImports: 模块在所有来源找不到时 raise ImportError(原静默容忍导致跨模块 mangled fallback,链接期才暴露 undefined symbol)
- LlvmGenerator: import 处理 ImportError 直接重抛,不被 _ErrorStack 吞掉
- FuncGen: 指针→整数、浮点→整数隐式转换改 raise TypeError(显式 cast 仍允许,符合隐式转换规则)
- HandlesFunctions: 有非 void 返回注解但函数体掉出末尾 raise Exception(-> None / -> t.CVoid 视为 Void 仍合法)
- 新增 Test/NegativeTest 反向测试专项:9 个漏检用例,当前 9 PASS / 0 FAIL
|
2026-08-22 03:57:19 +08:00 |
|
TermiNexus
|
8ce08493e8
|
feat(coro): M7——try/finally、异常消息、自定义异常类、帧池复用
- try/finally(无 except):正常/异常路径都执行 fbody,异常时 finally 后
重新传播(done+br exit);finally 内暂不支持 await
- 异常消息:帧加 msg 槽(i8*,index 4),raise X(msg) 存消息,await 传播,
coro_exception_msg 查询
- raise 支持自定义异常类(exception_registry 码),多 except 匹配子类码
- 帧池复用:per-type free-list 全局池,create 弹池/空则 malloc,coro_destroy
回池(帧头部存 next),避免反复 malloc/free
- 修复 ast.walk 传 list 崩溃(finalbody/For body)
- CoroTest 验证:finally 执行、MyError exc=100 msg=boom msg、3 次循环池复用
|
2026-08-21 14:46:21 +08:00 |
|
TermiNexus
|
8b9e88287a
|
feat(coro): M6——raise 异常类型 + 多 except 类型匹配
- raise 支持异常类型名/调用(EXCEPTION_CODE_MAP/exception_registry → 异常码),
普通表达式仍走值路径
- _HandleCoroTry 多 except dispatch:独立 check_bbs 链式匹配 exc 码(含子类码
集合),命中进入对应 handler,全不匹配重新终止传播;Exception/裸 except 捕获所有
- CoroTest 验证:raise ValueError 匹配 except ValueError → 1;
raise KeyError 匹配 except KeyError → 2(gather 并发)
|
2026-08-21 14:32:52 +08:00 |
|
TermiNexus
|
69447025a7
|
feat(coro): M5——协程内 try/except 捕获(raise 与 await 传播异常)
- _HandleCoroTry:except_bb/merge_bb 控制流,单 except 捕获所有异常
- 协程内 raise 与 await 子协程异常传播:处于 try 栈内时改跳 except 处理器,
栈外维持原终止语义(done=1 + br exit)
- except X as e:异常码绑定到 e(帧槽),捕获后清帧 exc
- 预扫描/_CollectFrameVars 递归 Try(handler.name 进帧槽,跨挂起存活)
- CoroTest 验证:try 捕获 await 传播异常 → coro result = 42, exc = 0
|
2026-08-21 14:28:52 +08:00 |
|
TermiNexus
|
411e0bb774
|
feat(coro): M4——异常传播(帧 exc 槽 + raise + await 传播)+ gather 并发调度
- 帧布局加固定 exc 槽(i32,0=无异常),协程内 raise 存异常码并终止
- await 子协程后检测异常并传播到父帧(父协程带异常终止,状态机短路)
- return await x:await 值直接存父帧 ret 槽(挂起前),修复 child_ret 跨块
dominate 错误;挂起不再写 ret=0(避免覆盖返回值)
- coro.coro_gather(帧...):并发推进全部协程到完成(含 coro_sleep 轮询),
返回完成数
- coro.vp 追加 coro_exception/coro_gather 占位
- CoroTest 验证:异常传播 exc=42;gather=2 r1=2 r2=3
|
2026-08-21 14:26:19 +08:00 |
|
TermiNexus
|
c979f0f94d
|
fix(coro): M3 三处修复——nonlocal 闭包、wake 空块终止、coro_run 唤醒槽按索引定位
- _PreScanExtraSlots 内嵌 _walk 闭包变量需 nonlocal(UnboundLocalError)
- coro_run wake_due_bb 补 br loop(空块导致 opt ASan 插桩解析失败)
- coro_run 内联在 main 翻译时 _coro_wake_ptr 已被恢复为 None,改为按
_coro_slot_vars 索引定位 __coro_wake_us 槽
- 验证:CoroTest ASan 模式编译+运行通过,coro result = 15
|
2026-08-21 14:20:51 +08:00 |
|
TermiNexus
|
3acf24c7d0
|
feat(coro): M3——For 内 await、coro_sleep 挂起、coro_destroy 释放帧
- For 内 await:range 迭代变换为 While(__f_idx_N/__f_len_N 帧槽),复用协程版 While
就地挂起/恢复;For 迭代目标进帧槽跨挂起存活;仅支持 range 1/2 参数
- coro_sleep(ms):帧加 __coro_wake_us(i64)唤醒槽,挂起后 coro_run 轮询
GetTickCount64,未到点 Sleep(1) 续轮询,到点自动恢复
- coro_destroy(帧):coro.coro_destroy 内联翻译为 free 释放帧内存
- coro.vp 追加 coro_sleep/coro_destroy 占位;CoroTest 用例覆盖
for+await/sleep/destroy(期望 coro result = 15)
|
2026-08-21 14:17:27 +08:00 |
|
TermiNexus
|
ff7c0457ad
|
feat(coro): M2——async 参数/嵌套 await 表达式/If-While 控制流
- 帧结构体增加参数槽与提升临时变量槽,create_<name> 带参数存入帧
- 嵌套 await(如 a = b + await f())提升为顶层临时赋值 __await_N,帧预留槽
- 协程版 If/While:条件求值 + 分支内 await 就地挂起/恢复(动态状态号恢复块)
- For 循环委托现有 handler(仅支持无 await/return,M3 扩展)
- CoroTest 用例覆盖参数/嵌套 await/while+await/if+await(期望 coro result = 30)
|
2026-08-21 13:31:37 +08:00 |
|
TermiNexus
|
a775ec9932
|
fix(coro): 帧结构体定义输出到 IR,修复 GEP base element must be sized
协程帧类型 %Coro_<name> 只存 _coro_frame_types 未注册进 Gen.structs,
StructGen.finalize 不输出其定义 → resume_<name> 的 GEP 引用 opaque
类型,opt ASan 插桩报 "base element of getelementptr must be sized"。
修复:_GetOrCreateFrameType 注册帧到 Gen.structs;finalize 追加
_coro_frame_types 兜底输出(防 _generate_structs 清空时丢定义)。
|
2026-08-21 12:41:10 +08:00 |
|
TermiNexus
|
13a8f6c1b6
|
feat(coro): 语言内协程 M1——async def + await + coro_run 状态机
TPC 新增协程生成器 AsyncFunctionHandle(lib/core/Handles/HandlesAsyncFunctions.py):
async def 编译为帧结构体 {state, done, ret, 局部变量槽} + create_<name>()(malloc
分配)+ resume_<name>()(switch 状态机,0=SUSPEND/1=DONE)。await 按顶层赋值
切分函数体:创建子帧 -> resume -> 取子帧 ret -> 存父帧槽 -> 父挂起(state 前进);
普通调用 async 函数生成 create(返回帧指针);coro.coro_run 在调用点内联翻译为
resume 循环。vast parser 已支持语法;新增 includes/coro.vp(Coroutine + 占位
运行时)与 Test/CoroTest(期望输出 coro result = 14)。
M1 限制:async 无参数、返回 i32/int;协程体仅顶层 AnnAssign/Assign/Expr/Return;
await 仅顶层赋值形式、子协程假设一次完成(无嵌套挂起);coro_run 依赖本模块
先赋值的协程变量。M2 将支持参数/嵌套 await/控制流。
|
2026-08-21 12:36:00 +08:00 |
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
e5af28fa93
|
fix(imports): NoneType 异常静默 + struct_body 判空,减少 WARN 干扰输出
编译大量输出 "HandlesImports: 忽略异常 'NoneType' object has no attribute 'endswith'":注解/类型解析回退路径对 None 参与运算(数据缺失属正常兜底)——每文件每符号都打 WARN 淹没关键信息。
- 783/1166/1264 三处 except:AttributeError+NoneType 时静默不 WARN,其他异常保留
- 两处 is_packed 判断补 struct_body is not None 防护(源头防 None.startswith/endswith)
|
2026-08-17 20:07:35 +08:00 |
|