TermiNexus
|
ecfa47bd3c
|
fix(callgen): 跨模块裸名 CExport 调用精确解析返回类型,依赖未编译时 _deps_pending 重试,修复 malloc 返回截断 i32
|
2026-08-26 22:44:46 +08:00 |
|
TermiNexus
|
e82664fa67
|
fix(gen): @t.Object 类模块级变量转 Ptr(struct),t.CStruct 值类保持值,修复 devfs 虚表调用跳栈 #PF
|
2026-08-26 22:33:11 +08:00 |
|
TermiNexus
|
66fe13f407
|
fix(vpireader): stub 全局变量声明保持 t.CStruct 值类型,修复跨模块字段访问当指针解引用
|
2026-08-26 22:18:10 +08:00 |
|
TermiNexus
|
5d121f7166
|
fix(funcattrs): stackrealign 是 LLVM 字符串属性需带引号,否则 llc 报 expected '{'
|
2026-08-26 22:07:42 +08:00 |
|
TermiNexus
|
0d4b7ff491
|
fix(funcattrs): 显式传 max_len 并兜底 0,修复方法默认参数缺陷致属性文本全被丢弃
|
2026-08-26 22:03:57 +08:00 |
|
TermiNexus
|
ec45dd0195
|
debug(funcattrs): 打印 _append_str max_len 实际值与写入后 strlen,定位 attrs 变空根因
|
2026-08-26 21:59:09 +08:00 |
|
TermiNexus
|
f27a32b9f4
|
debug(funcattrs): 诊断加当前文件名,区分 VKernel/Scene3D 等模块编译
|
2026-08-26 21:52:26 +08:00 |
|
TermiNexus
|
e9a60273a7
|
debug(funcattrs): 第二轮诊断——dump decorator AST/args/kwargs/模块SHA1,确认第三个属性参数去向
|
2026-08-26 21:32:29 +08:00 |
|
TermiNexus
|
e60be41ad8
|
debug(funcattrs): 添加 @c.Attribute 属性提取链运行时诊断,定位 stackrealign 未进 IR
|
2026-08-26 20:35:09 +08:00 |
|
TermiNexus
|
2165c171e7
|
feat(funcattrs): 支持 stackrealign 函数属性
入口函数(_start)由 bootloader jmp 进入(rsp≡0 mod 16),llc 按 call 约定
假设入口 rsp≡8 → 帧整体偏 8 → 所有调用 rsp≡8 → 变参函数保存 xmm 的
movaps #GP。新增 t.attr.stackrealign → LLVM stackrealign 属性,序言动态
重对齐栈,与入口约定无关。
|
2026-08-26 20:18:01 +08:00 |
|
TermiNexus
|
9f19673072
|
fix(classgen): 方法预扫描补 pre_scan_scope_decls,修复 global 名被当局部
方法(method)预扫描只调 pre_scan_allocas,漏调 pre_scan_scope_decls(模块级
函数路径 FuncGenDef 是先 scope_decls 再 allocas)。导致 global BootInfo 未
注册时 prescan 把 BootInfo 当局部创建 alloca(define_var 注册局部),后续翻译
is_global_name 为真又写全局 → 局部 alloca 永不写入 → 读全 0(main.vp __init__
BootInfo memmap 全 0 根因)。
修复:方法预扫描先 pre_scan_scope_decls 注册 global/nonlocal,再 pre_scan_allocas,
与 FuncGenDef/FuncGenMixin 路径对齐。
|
2026-08-26 19:30:31 +08:00 |
|
TermiNexus
|
53c72ff57a
|
fix(callgen): 包子模块限定调用支持祖先包导入判定,杜绝同名函数劫持
main.vp IR 显示 intr.gdt.init() 解析成 @3b3cc38844ed7ad9.init(serial.vp)、
intr.idt.init() 解析成 @c418c6220a9a9d2a.init(su8250.vp,还带伪造 i16 实参)
——intr 包限定的跨模块调用因 is_module_imported('intr.gdt')=0 跳过校验,
find_func_in_module 后缀匹配劫持最先注册的同名 init → GDT/IDT 从未初始化,
CPU 一直用 OVMF 的 IDT(int 0x20 → OVMF #GP 0xEB6810C,定时中断永不到达)。
新增 ImportsGen.is_module_imported_or_known:已导入 或 全局已登记且任一祖先
包已导入(import intr → intr.gdt 可访问;this.this() 未 import this 仍 fast-fail)。
替换 CallGenMixin 模块限定解析 5 处门控(构造单层/多层、found_func 校验、
跨模块调用 import 检查)。
|
2026-08-26 18:56:37 +08:00 |
|
TermiNexus
|
23ef8c94fa
|
fix(exprattr): 包子模块属性访问支持全局注册表回退+裸名回退+数组退化
import intr 只注册包名 intr,intr.idt.idt[32] 的嵌套路径 is_module_imported
('intr.idt')=0 → 落入结构体字段访问报 '属性访问失败: .idt'(main.vp L98 根因)。
修复:1) 嵌套路径模块已知性增加 Sha1Store 全局注册表回退(包 __init__.vp
from . import X 注册的 pkg.X);2) 未显式 import 的已知子模块先经
LoadDepVpiIntoModule 注入其 .vpi 声明(含类完整结构体定义 + CExport 裸名
全局声明);3) 全局查找补 CExport 裸名回退;4) 模块级数组全局按 C 语义
返回基址指针(对齐读路径 L629-634),供下标/字段 GEP 继续。
|
2026-08-26 18:51:13 +08:00 |
|
TermiNexus
|
50a4772a7d
|
fix(gen): 模块限定构造优先于裸名可见性分支,根治 ctor 归属内核同名类
gfx.Scene3D(...) 的 ctor 检测:Scene3D 因 includes 预注册(VKernel gfx
0ae)可见 → is_struct_visible 为真 → 走裸名分支 find_struct_by_module(
func_name, trans.ModuleSha1) 落空 → 裸名回退 find_struct("Scene3D") 命中
先注册的内核版 0ae → ctor 生成 @0ae.Scene3D.__before_init__。上一版只改
了 elif 分支(vis!=0 时是死代码),未生效。
改为模块限定构造优先:在裸名可见性检查之前,识别 Module.Class(...) 且
模块已导入 → _lookup_module_sha1(模块名) 精确解析 SHA1 →
find_struct_by_module 命中 App 版(9aab),锁定后跳过裸名回退。
|
2026-08-26 17:39:25 +08:00 |
|
TermiNexus
|
0a28df0864
|
fix(gen): 模块限定构造按模块名解析 SHA1,修复 ctor 归属内核同名类
gfx.Scene3D(...) 的模块限定构造路径(Name 模块基)误用 trans.ModuleSha1
(当前文件 sha1,类在 gfx 模块)→ find_struct_by_module 落空 → 裸名回退
find_struct("Scene3D") 命中跨模块同名类中先注册的 entry(VKernel gfx 与
App gfx 都定义 Scene3D,0ae 先经 includes 预注册)→ ctor 生成
@0ae.Scene3D.__before_init__ → 链接 undefined symbol(Scene3D 根因)。
改为按模块名 _lookup_module_sha1("gfx") 精确解析 SHA1 后
find_struct_by_module 命中 App 版(9aab),与注解解析路径一致。
|
2026-08-26 17:29:48 +08:00 |
|
TermiNexus
|
9b56d1d75c
|
fix(gen): Phase B+ 与链接跳过 App 源文件,修复链接 duplicate symbol
Scene3D 的 App 源文件 gfx.vp 同时被 includes 扫描(includes 目录 ../..
=ViperOS 含 Apps/),且被 main.vp import → 进入可达集合 → Phase B+ 编译
一份 .obj 到 includes_binary,与 Phase A/B 编译到 output/ 的 .obj 同
sha1 同符号(9aab6ff7475c1bbf.Vec3.__init__ 等)→ ld.lld duplicate symbol。
- Phase B+ 编译循环:sha1 命中 App 源文件(entries)则跳过(其 .obj 已由
Phase A/B 产出到 output/)
- 链接期 reachable obj 收集:同样跳过 App 源文件,避免 includes_binary
残留同 sha1 .obj 与 output obj 重复入链
|
2026-08-26 17:23:20 +08:00 |
|
TermiNexus
|
c656cba393
|
fix(gen): App 短模块名键保留 + find_struct sha1 字面量精确匹配,修复同名类归属错乱
ViperOS 目录含两份同内容 gfx.vp:App 的 Apps/Scene3D/gfx.vp(9aab) 与
VKernel 的 VKernel/.../vesafb/gfx.vp(0ae),都定义 class Scene3D。includes
扫描("../.."=ViperOS)先以全路径模块名注册 9aab,AppendToSha1MapStore 按
sha1 去重吞掉 App 短模块名 "gfx" 键 → LookupSha1ByModName("gfx") 失败 →
后缀匹配劫持到 VKernel gfx(0ae) → Scene3D 类归属 0ae → 返回类型解析查
temp/0a/0ae*.text.ll(不存在)→ Phase A _deps_pending 永不收敛。
- AppendToSha1MapStore:去重改为 sha1 与模块名都相同才跳过,App 短模块名
键("gfx")保留,import gfx 精确查找可命中
- find_struct:限定名模块段为 16 位 hex(sha1 字面量,如 "9aab.Scene3D")
时直接按 name+sha1 精确匹配(find_struct_by_module),不再落到裸名回退
- find_struct 第二遍裸名回退加同名唯一性检查:跨模块同名类(VKernel 与
App 的 Scene3D)存在时返回 None 而非先注册的错误 entry
|
2026-08-26 17:19:23 +08:00 |
|
TermiNexus
|
00606057c4
|
fix(gen): 模块别名解析优先别名还原,修复 process 后缀误命中内核模块
import vpsdk.process as process 时,_imported_modules 含别名 "process",
store 同时存在 "vpsdk.process" 与 "VKernel.Kernel.sched.process"(ViperOS
includes 目录扫描含 VKernel)。裸名 "process" 后缀匹配命中先扫描的内核
模块 → 跨模块调用解析到未编译的内核 → 返回类型解析落空 → Phase A
_deps_pending 永不收敛(Scene3D "Phase A 无法完成翻译" 根因)。
- StructGenMixin._resolve_module_sha1:别名还原(LookupModNameByAlias →
vpsdk.process → 精确 SHA1)提升到裸名后缀匹配之前;裸名后缀仅作兜底
- Phase2 依赖探测:同构修复,别名还原先于后缀匹配,避免依赖缺失诊断
误报内核 process 缺 text.ll
|
2026-08-26 16:25:37 +08:00 |
|
TermiNexus
|
f2bfe82834
|
fix(gen): Gargantua 编译修复——循环 alloca 入入口块 + 跨模块 CDefine 拼路径/门控
- translate_for 循环计数 alloca 改回 _alloca_at_entry(入口块生成),
修复分支内 for 循环(Terminal _cmd_cd 的 for i in range(1,64))产生
"Instruction does not dominate all uses! %197 = alloca i32"
- _build_source_path_from_sha1 优先用条目存储的 IncDir(绝对 includes 根,
多目录支持)拼路径,修复 Gargantua 多 includes 目录下 stdint.vp 拼到
首目录 ViperOS → 文件不存在 → XMOD-CD 误报
- translate_name_value 对 ALL_CAPS 名先查 lookup_var:当前作用域已有
同名变量(如 Gargantua CAM/FWD/RIGHT/UP 模块全局)则跳过跨模块
CDefine 查找,避免 star-import 误命中 stdint
|
2026-08-26 16:14:05 +08:00 |
|
TermiNexus
|
bd3705d68b
|
feat(tpv): --build-dir 命令行覆盖 project.vpj 的 build_dir
新增 --build-dir 参数:在 Config.resolve_paths 前覆盖 BuildDir,相对路径仍基于 project_dir 解析(_join_path),绝对路径(/ 或 \\ 开头)原样保留。用于隔离构建目录验证(如 --build-dir ./tpv_build2 避免陈旧缓存干扰)。
|
2026-08-25 18:07:55 +08:00 |
|
TermiNexus
|
decf74b946
|
fix(callgencall): 根治——跨模块 declare 创建后按形参类型 coerce 实参
found_func=None 路径(跨模块调用)创建 declare 后未 coerce 实参,字面量 0=i32 传 i64 形参(t.CSizeT)未提升 → llc 按 i32 布局栈参(movl 4 字节写)→ i64 形参高 4 字节残留垃圾 → callee 读 can=[垃圾][count] 崩溃(SlotsBugTest/StringIterTest 根因,反汇编 movl 实锤)。
修复:与 found_func 路径(L588-611)同逻辑,_ensure_method_declare 后用 self.find_func_in_module 取 declare 形参类型,coerce_to_type 提升/截断整数实参(i32 0 → sext i64 0),使 IR call 实参与 declare 一致。覆盖所有跨模块调用点。
|
2026-08-25 17:53:47 +08:00 |
|
TermiNexus
|
a9d71714b3
|
fix(callgenmixin): 字面量 0 改 t.CSizeT(0)——修复 i32 实参与 i64 形参不一致
根因(反汇编实锤):空参数构造走 can==0 分支,字面量 0 是 i32,生成 IR call 实参 i32 与 declare i64 不一致 → llc 按 i32 生成 movl(4 字节写 can 槽)→ i64 形参高 4 字节残留垃圾 → callee 读 can=[垃圾][count]。StringIterTest can=0x2B2_... 崩溃根因。
修复:三处 _translate_struct_ctor(..., cargs, 0, trans) 字面量 0 → t.CSizeT(0)(i64),IR 实参与 declare 一致 → llc movq 写 8 字节。
|
2026-08-25 17:51:21 +08:00 |
|
TermiNexus
|
8cc6996577
|
feat(callgenctor): callee 入口 can 无条件打印,区分 ABI 错位 vs 栈槽复用
caller 侧 can=0(断点证实)但 callee 收到 0x12A1_0000_0000=[cargs高32][count低32]——入口打印可区分:入口即垃圾=ABI 栈参数错位 4 字节;入口正常但槽位悬空处垃圾=函数内 can 被栈槽复用覆盖。
|
2026-08-25 17:39:21 +08:00 |
|
TermiNexus
|
b3546b05a5
|
feat(callgenmixin): len/调用前/callee 三级 can 断点,定位 4 字节错位
StringIterTest can=0x229_0000_0000=[cargs高32][count低32],IR 显示 len/调用均正确(i64),但运行时 callee 收到垃圾——需三级 printf 断点确定错位发生在 len 计算/调用传参/callee 读取哪一级。
门控(can>=2^32 才打印):①len结果异常(len 后立即)②调用前 can(L352 前)③callee 槽位悬空已打印 can。一次运行锁定。
|
2026-08-25 17:29:33 +08:00 |
|
TermiNexus
|
d7ed91e3e5
|
fix(callgenbase): _ensure_method_declare 定义侧参数宽度优先,根治字面量实参固化 i32
declare 此前用首个调用点实参类型建参数,字面量 0=i32 把定义 t.CSizeT(i64) 的参数固化窄(SlotsBugTest _translate_struct_ctor can=i32 vs 定义 i64 → 调用侧 trunc、callee 按 i64 读栈残留垃圾高位 → can=巨值读未写槽位崩溃根因)。
修复:从 call_name 提取 {sha1}.{cls}.{method} 查 vpi 参数注解缓存(SetTempDir 已在 Phase1 设置,按需加载可用),仅当实参与定义都是整数且定义更宽时采用定义宽度(指针/联合保持实参类型,避免字符串路径把 list*/Struct* 降级 i8*)。
|
2026-08-25 17:01:31 +08:00 |
|
TermiNexus
|
4d14eeff67
|
fix(vpireader): declare 参数注解改字符串解析优先,修复 t.CSizeT→i32
SlotsBugTest 根因:跨模块 declare 参数类型经 AST resolve_annotation_type 解析,vpi tree 深层节点 kind() 损坏时得垃圾类型(t.CSizeT→i32),而定义侧是 i64——调用侧 trunc i64→i32 传参、callee 按 i64 读栈残留垃圾高位 → can=巨值读未写槽位(0xCDCD)崩溃(ASAN node=0xCDCD,rcx 垃圾高 32 位实锤)。
修复:_inject_function_declare/_inject_method_declare 参数解析与返回类型同源——优先用 vpi 文本注解缓存(_resolve_vpi_param_annot_seg 按段索引解析),AST 仅兜底。map_t_type('CSizeT')=i64 字符串路径正确,can declare 恢复 i64,调用侧不再 trunc。
|
2026-08-25 16:43:43 +08:00 |
|
TermiNexus
|
936aa14041
|
feat(tpv): Phase B 单文件计时——llc 已提交日志显示 merge/write/task 三步耗时 - 用 w32.win32base.GetTickCount64() 在 Phase B 循环内对每个文件测量 BuildCombinedIR(merge)、write_ir_to_file(write)、init_llc_task(task) 三步耗时 - 日志格式: [x/81] llc 已提交: <path> (merge=N ms, write=N ms, task=N ms, total=N ms)
|
2026-08-23 16:07:37 +08:00 |
|
TermiNexus
|
347998664e
|
fix(tpv): phase2command 模式 Phase C 不再因 .obj 缺失中止——链接命令正确写入 bat - 根因:phase2command 模式下 llc 未执行(命令写入 bat),Phase C 的'可达模块 .obj 存在性检查'对所有实现模块触发 VLogger.error→sys.exit(1),进程在调用 link_objs_to_exe 之前终止,clang 链接命令永远写不进 bat - 修复:Phase C 可达收集在 _phase2_cmd_path 非空时跳过缺失报错,并把可达 includes .obj 路径照常加入 final_obj_paths(bat 手工执行后即存在),保证链接命令完整 - 附带:--run 在 phase2command 模式下跳过(exe 尚未链接,多文件+单文件两处);BuildPipeline._phase2_write_cmd 补 global _phase2_bat_init,避免每次调用重复写 header
|
2026-08-23 15:52:15 +08:00 |
|
TermiNexus
|
146b9a9652
|
fix(tpv): 兄弟 Mixin 兜底支持跨模块——修复自身 text.ll 永久 pending 死锁 - ClassGenVTable._mangle_name 定义在 FuncGenBase(跨模块 Mixin,调用类不继承它),兄弟 Mixin 兜底只在本地 IR 找 define 未命中 → ret_anc_sha1 停在调用类自身 sha1 → _dep_text_ll_exists(自身) 恒 0(Phase A 翻译中自身 text.ll 未生成)→ _deps_pending=1 死锁,Phase A 永不收敛 - 修复:兜底遍历已注册 struct 时增加跨模块查找(get_struct_sha1 + _LookupMethodRetTyFromTextLL 查该模块 text.ll),命中即锁定定义类(ret_anc_sha1/ret_anc_name/返回类型),跳过 text.ll/vpi/pending 重查段,按 {定义类sha1}.{定义类}.{方法} 构造调用名
|
2026-08-23 14:50:48 +08:00 |
|
TermiNexus
|
27f2a53c15
|
diagnose(tpv): Phase A pending 置位点全量 [DEPDBG] 诊断 + 别名解析修复 - 9 处 _deps_pending 置位点加 [DEPDBG] printf(CallGenCall×4/CallGenMixin/CallGenDispatch×2/CallGenProp/ExprGenName),一次构建即可定位 ClassGenVTable 永久 pending 的具体调用点 - StubMergerStore 新增 LookupSha1ByAlias:经 from_imports 别名映射(import X as Y → Y:X)解析模块 SHA1 - LoadDepVpiIntoModule 与 Phase A 依赖探针接入别名解析,HT 等改名别名不再误报未解析
|
2026-08-23 14:21:44 +08:00 |
|
TermiNexus
|
6cd8adc54c
|
refactor(tpv): 简化 BuildTopoSortedIndices 队列循环为 for range - StubMergerTopo.vp 中 while q_head < q_tail + 手动 q_head += 1 改为 for q_head in range(q_tail),逻辑等价、消除冗余变量
|
2026-08-23 14:03:27 +08:00 |
|
TermiNexus
|
60afcf1168
|
diagnose(tpv): Phase A 依赖探针别名解析修复 + ClassGenDef/MatchGenMixin 崩溃定位诊断
- Phase2 PhaseA-DBG 探针:精确匹配失败后后缀匹配(别名=基名如 GenTypes→lib.core.Gen.GenTypes),t/c 内置模块跳过,改名别名标'未解析'而非'缺失',消息头改'依赖探测明细'
- ClassGenDef 两个 _deps_pending 置位点加 [PHASEADBG] 打印(父类未注册 class/parent、字段注解未解析 class/field/annot_kind)
- MatchGenMixin _handle_renum_match 加 [MATCHDBG] 打印(renum 元信息 + 第一/二遍 case 列表快照对比,定位 REnum match 崩溃的列表破坏点)
|
2026-08-23 13:39:20 +08:00 |
|
TermiNexus
|
0ffe99e722
|
feat(tpv): Phase A 依赖未就绪诊断补全——列出缺失 text.ll 的直接依赖
PhaseA-DBG 警告补充本文件直接依赖中 text.ll 仍缺失的模块(含 SHA1),
精确定位是哪个依赖未完成(通常其自身依赖链上某文件先失败);全部直接
依赖已就绪仍 pending 时提示缺失在传递依赖/MRO/vpi 侧。最终 Phase A
错误提示补充定位指引。
|
2026-08-23 12:54:21 +08:00 |
|
TermiNexus
|
2e6c37294d
|
fix(tpv): 修复 vpi CDefine 名缓存 list.get 被误分派为 HashTable.get 的 ASan 崩溃
Converter.vp _g_pyi_cdef_names 由 list[str]|t.CPtr 改为 str|t.CPtr(i8** 字符串
指针数组),读写改用 argparse 同款可靠模式 t.CPtr(base+i*8)+e[0]:list 联合
接收者的 .get 会被分派为 HashTable.get(self, key, default),索引 inttoptr 成
key 指针传给 _fnv1a_hash 解引用零页崩溃(1.LOG)。
TranslatorGenMixin handle_module_level_var 对模块级 str|bytes 联合全局设置
IsPtrElement(8 字节指针步长),对齐 TPC global_var_ptr_element。
|
2026-08-23 12:38:25 +08:00 |
|
TermiNexus
|
a12dcafed2
|
fix(tpv): 泛型类型参数 SHA1 规范化 + 自举链接修复
- 类型参数统一 "{定义模块SHA1}.{Class}"(ast.AST/AST → f467978339422f32.AST),
消除跨模块特化名分裂导致的 undefined symbol(list[AST|t.CPtr].set 根因)
- TypeGenResolve 新增 _norm_type_arg_name/_is_sha1_prefixed/_concat_sha1_class;
resolve_annotation_type 兼容 "{16hex}.Class" Attribute 形态(跳过
imported_modules 检查,优先完整名命中定义侧 struct)
- CallGenCtor._extract_type_args_from_slice / extract_class_name_from_annotation
新增 from_imports 参数,8 处调用方传 trans._from_imports 保持注册/查找一致
- 修复模块级函数链式调用推断(get_perm_pool() 联合返回 → .alloc() 裸名 alloc)
- 跨模块方法 declare self 改为类指针 %"sha1.Class"*,调用侧按形参 coerce bitcast
- 撤销泛型特化双 SHA1 前缀,恢复单前缀(模板 SHA1)
- 新增 --phase2command xxx.bat:不执行 llc/链接,命令写入 bat
|
2026-08-23 12:00:04 +08:00 |
|
TermiNexus
|
a6e28c71f5
|
将部分 while 简化为 for
|
2026-08-23 00:21:17 +08:00 |
|
TermiNexus
|
ec2feea15b
|
尽可能修补 Gen 的导入
|
2026-08-22 10:53:26 +08:00 |
|
TermiNexus
|
748eda9c69
|
修正 Stub 的 define 导入
|
2026-08-22 10:36:05 +08:00 |
|
TermiNexus
|
f4fee79d4d
|
fix(tpv): ClassGenGeneric import 路径修正(f8bca62 漏改)——lib.Stub.StubMergerStore → lib.Stub.StubMerger.StubMergerStore;修复跨模块引用 fallback 当前模块 sha1 导致的 undefined symbol LookupIncludesDeps
|
2026-08-22 03:38:59 +08:00 |
|
TermiNexus
|
24dfe6ea3b
|
修正 main 的 import
|
2026-08-22 02:36:14 +08:00 |
|
TermiNexus
|
01b45c0630
|
修正了 import 路径,修正了部分代码谬误
|
2026-08-22 02:29:08 +08:00 |
|
TermiNexus
|
f8bca62eb0
|
修正了 import 路径,除 Gen
|
2026-08-22 02:18:15 +08:00 |
|
TermiNexus
|
d0736b4978
|
修正了目录
|
2026-08-22 02:07:49 +08:00 |
|
TermiNexus
|
e18609e184
|
feat(tpv): 支持 coro.Coroutine = c.Addr(task()) 就地解读句柄赋值
- c.Addr(Call) 分支:求值存临时槽(entry alloca)返回槽地址,
供 coerce 指针→结构体 load 就地解读(Coroutine={__ptr__} 8 字节)
- 协程登记扩展:c.Addr(async_call) 也登记 _coro_var_async
- 新增 _coro_frame_ptr_from_arg 统一提取帧指针:pointee 是 Struct
(Coroutine 变量,translate_value 返回 alloca 地址)GEP __ptr__ load,
普通指针 bitcast 直通;5 处拦截函数(run/destroy/exception/msg/gather)替换
|
2026-08-22 01:55:54 +08:00 |
|
TermiNexus
|
609635c73e
|
fix(tpv): 帧池访问改 Value 视图 + ConstNull 补 name 参数
- GlobalVariable 非 Value 子类,create/destroy 直接 build_load/store
按 Value 布局读字段错位(Ty 读到 void、Name 为空)→ 生成
"load i64, void" 非法 IR;改构造 SSAValue(Ty=Ptr(i64), Name="@coro_pool_<n>") 视图
- ConstNull 签名 (pool, ty, name),6 处漏传 name → v.Name=None →
"store i8* (None), i8**" 非法 IR;全部补 "null"
|
2026-08-22 01:25:12 +08:00 |
|
TermiNexus
|
82a86761b9
|
feat(tpv): 语言内协程 M1-M7 移植——async/await 状态机 + 异常传播 + 帧池
- M1: async def -> 帧结构体 + create_/resume_ 状态机 + coro.coro_run 内联
- M2: async 参数、嵌套 await 提升 __await_N、If/While 内 await
- M3: For 内 await(range->While)、coro_sleep 轮询挂起、coro_destroy 回池
- M4: raise 存码、await 子帧异常传播、coro_exception、coro_gather
- M5/M6: try/except 链式匹配 + as e 绑定 + 异常类型码
- M7: try/finally、异常消息 msg 槽、自定义异常类、帧池复用
|
2026-08-22 00:34:32 +08:00 |
|
TermiNexus
|
f0a70748d7
|
fix(match): default case body 的 dbody 类型推断退化 list[int] 截断指针
dbody = dmc.children(普通赋值)触发 TPC 对跨模块属性访问
ast.MatchCase.children 的 RHS 类型推断,失败时静默退化为 list[int],
dbody.get() 被编译成 list[int].get(返回 i32),AST 节点指针被截断为
0x0000c1120bd0 → translate_stmt 读 vtable 崩溃(EnumTest RENUM match ASan)。
与 case body 循环(body_list 用带注解 AnnAssign,类型稳定正确)对照,
default 块改用带注解的 AnnAssign 中转(dbody2)保持
list[ast.AST | t.CPtr] 类型。三处同型修复(_handle_renum_match /
_handle_sequence_match / _handle_tuple_match)。
|
2026-08-21 08:46:45 +08:00 |
|
TermiNexus
|
426bff7daa
|
fix(gen): 补回拆分时丢失的 6 个常量(枚举/泛型/vtable/元数据)
- ENUM_MEMBER_MAX_LOCAL/RENUM_CLASS_MAX/RENUM_VARIANT_PER_CLASS/RENUM_ALIAS_MAX 补回 ClassGenEnum
(未定义名在常量上下文折叠为 0 → 枚举成员收集被静默禁用 → register_enum 永不调用
→ EnumTable 恒空 → `OpKind.Add` 裸名 NameError,includes/ast/base.vp L241 根因)
- SPEC_CACHE_MAX 补回 ClassGenGeneric(原 HandlesClassDef 定义)
- VTBL_METHOD_MAX 补回 ClassGenVTable
- META_MAX/META_KEY_LEN 补回 ClassGenBase
|
2026-08-21 06:58:47 +08:00 |
|
TermiNexus
|
89995dffde
|
refactor(gen): 去除 Handles 委托层——链式化 + GenTypes/GenApi 迁移
- Gen 内部 1742 处 HandlesX.func() 改 self.Gen.Y.method() 链式调用
- 数据类/常量迁移 GenTypes.vp(10 类 + CLASS_META_*/META_*/SEQ_KIND_*/FIELD_MAX 等)
- 管线/保留文件经 GenApi.vp 模块级入口(48 函数带类型注解,从 Gen 方法签名自动生成)
- 删除 26 个纯委托 Handles 文件,仅留 5 个实体文件(Base/Translator/Expr/ExprCall/ExprCallTable)
- 修复字段分裂:TypeGenErr CurrentFile/TraceCount 链式化;CallGenBase TempDir/Cexport 真源化
|
2026-08-21 06:32:40 +08:00 |
|
TermiNexus
|
ca1453c0ec
|
refactor(tpv): set_asan_mode 移除改直接赋 _asan_mode bool;ClassGenEnum 加 Renum 字段 0xb0 崩溃定位临时诊断(定位后移除)
|
2026-08-21 01:37:51 +08:00 |
|
TermiNexus
|
0e48190ba9
|
chore(tpv): 清理过时注释——run_llc_parallel 步进说明、追加89 -> None 说明、Gen 模块迁移说明
|
2026-08-21 01:37:46 +08:00 |
|
TermiNexus
|
a088f21bce
|
fix(BuildPipeline): run_llc_parallel 分批步进错误,修复 llc 线程 join 误报 600 秒超时
batch_start 改用 range(task_count)(步进 1)后,后续批次 join 循环 handles.get(batch_start+j) 取到上一批已 CloseHandle 的句柄 → WaitForSingleObject 返回 WAIT_FAILED(-1) 立即返回 → 误报 llc 线程 join 超时/失败(实际未到 600 秒)。
修复:for batch_start in range(0, task_count, max_threads) 保持原分批语义(步进 max_threads)。
|
2026-08-21 01:05:07 +08:00 |
|
TermiNexus
|
f7f3bbac02
|
fix(TVP): get_class_name_by_type strstr 回退改后缀匹配,修复链式方法调用类名解析
特化类型名 SHA1.GSList[Param] 被 strstr 子串回退错误命中基础名 GSList → GSList.append 查找失败 → 兄弟 Mixin 兜底误匹配 LinkedNode.append(this 前移 sizeof(LinkedNode)=-48)→ 写穿 GSList 容器前 48 字节 → LLvmLiteTest Test 3 崩溃(function_add_param/function_add_block/block_append_line 链式调用根因)。
后缀匹配(SHA1.ClassName 尾部)比 strstr 子串匹配安全,保留精确匹配路径。
|
2026-08-20 16:45:27 +08:00 |
|
TermiNexus
|
9e6e76fcab
|
fix(gen): 兄弟 Mixin this 调整改用模块级 HandlesClassDef._get_type_size
765702b 用 self._get_type_size(定义在 ClassGenEnumMixin)跨 Mixin 调用按 self 类型解析失败 → 链接 undefined symbol: CallGenCall._get_type_size。改为 HandlesClassDef._get_type_size(模块级函数,_field_byte_offset 同源用法)。
|
2026-08-20 11:54:39 +08:00 |
|
TermiNexus
|
765702bb5f
|
fix(gen): this-adjust 补兄弟 Mixin 分支——BaseB 内调 BaseA.helper 前移 sizeof(BaseA)
兄弟 Mixin 兜底(086e792)找到 BaseA.helper 后,this 调整在 BaseB 中查不到 BaseA 首字段'a'走 fail-fast(NoVTableCrossMixinTest BaseB.caller 根因)。对齐 TPC _adjust_this_for_inherited_method 的 sibling 分支:this 前移 -sizeof(定义类 struct),使 BaseA.helper 按自身布局读 self 字段。
|
2026-08-20 11:35:35 +08:00 |
|
TermiNexus
|
086e792b30
|
fix(gen): 兄弟 Mixin 兜底过滤泛型特化类名——防误绑定 list 特化函数
Config.vp Load_project_config 的 root.__getitem__(JsonValue 方法)在 found_func 未命中时被兄弟兜底遍历 struct 表误绑定到 list[ASTptr].__getitem__(泛型特化函数在模块中存在),this 按 list 布局前移 sizeof(list) → 运行期读 -1 崩溃。兜底现仅对不含 '[' 的普通类名生效,对齐 TPC 侧 class_methods 校验语义。
|
2026-08-20 11:14:26 +08:00 |
|
TermiNexus
|
184d84b10b
|
fix(gen): 修正 CallGenCall 类体首行注释缩进
|
2026-08-20 10:41:31 +08:00 |
|
TermiNexus
|
d9a5dfac58
|
chore(gen): 清理 CallGen 拆分残留的重复方法注释块
拆分重构时方法注释头被复制两份(32 处),纯删除 302 行注释,代码零改动。
|
2026-08-20 10:40:09 +08:00 |
|
TermiNexus
|
898a5c2624
|
fix(gen): 兄弟 Mixin 方法兜底——MRO 链外按 struct 表查定义类
方法不在本类 MRO 链(如 BaseB 内 self.helper() 调兄弟 BaseA.helper)时遍历已注册 struct 表找定义类方法,与 TPC HandlesExprCall 行为一致;this 由 _adjust_this_for_inherited_method 前移。
|
2026-08-20 10:28:34 +08:00 |
|
TermiNexus
|
7ba3c74411
|
fix(gen): StmtGenCifMixin 补 ExprCallBase import(迁移 If/For 方法体引用)
TPC 编译报 "跨模块调用 'ExprCallBase.find_func_in_module' 找不到模块 SHA1":
If/For/While 迁移进 StmtGenCifMixin 的方法体引用 ExprCallBase.find_func_in_module
(原 ForHandleIter _handle_oop_iter 等),但该 Mixin 原本未 import ExprCallBase。
已用脚本扫描 Gen/Handles 全部 .vp 交叉核对 import,其余迁移文件无遗漏。
|
2026-08-20 09:33:01 +08:00 |
|
TermiNexus
|
12e8d6bdf8
|
fix(stub): vpi 全局注入补全 src_sha1 mangling——修复 a42923c 笔误致空名全局
a42923c 声称"注入名带 src_sha1 前缀",但实际把 new_global_variable 的
gname_v 写成未定义变量 gv_name_m(mangle 逻辑从未实现)→ 注入空名
"@ = external global %MemBuddy*" → llc "expected top-level entity"
(SlotsBugTest 回归)。
修复:_inject_global_variable_declare 签名加 src_sha1,计算 mangled 名
"<sha1>.<name>"(对齐定义端 5f7a873 与查找端 from-import 三方一致),
去重与创建均用 mangled 名;调用点传 ParseVpiIntoModule 的 src_sha1。
|
2026-08-20 08:06:12 +08:00 |
|
TermiNexus
|
281d26915c
|
fix(gen): 分派改回 Handles 委托壳——NoVTable 同链跨类 self 调用仍 mangle 失败
bootstrap 链接报 undefined symbol: StmtGenDeclMixin.translate_return/if/while/for。
实测 Viper NoVTable 静态绑定下,StmtGenMixin 调父链(StmtGenDeclMixin→StmtGenCifMixin)
方法仍 mangle 成 StmtGenDeclMixin 前缀符号(定义却在 StmtGenCifMixin),同继承链
也不可靠。分派统一改经 Handles 委托壳桥回 gen 单例;HandlesReturn 补 translate_return 壳。
|
2026-08-20 07:02:43 +08:00 |
|
TermiNexus
|
9f396f4874
|
refactor(gen): 完成 P6 机械化迁移——Handler 类并入 Gen Mixin,语句实现单层化
- 10 个 Handler 类主方法迁入 Gen:Assign/AnnAssign/AugAssign→AssignGenMixin,
If/While/For/Return→StmtGenCifMixin,Match→新建 MatchGenMixin(注册 Generator MRO),
Imports→ImportsGenMixin;方法体 self.Trans→trans,签名加 trans 首参
- 分派改:StmtGenMixin.translate_stmt 同链 self.translate_xxx + 跨链经 Handles 委托壳
(NoVTable 静态绑定约束);ExprCall 分派改走 ExprCallCall 壳
- 清理:HandlesTranslator 删 11 个 Handler 字段与 _init_state 创建段;
StmtGenCifMixin 删 5 个 NewXxxHandle 工厂;main/BuildPipeline 补 HandlesAssign._g_gen 注入
- 委托壳保留:跨 Mixin 桥(Assign/AnnAssign/AugAssign/Match/Imports)待编译器缺陷修复后删
|
2026-08-20 06:40:37 +08:00 |
|
TermiNexus
|
e07ea491a5
|
chore(gen): 全量备份——Handles 委托壳瘦身与单例注入统一
- 删除 Handles 各模块已迁移至 Gen 的旧函数体,保留一行委托壳(25 文件 -798 行)
- main.vp / BuildPipeline.vp 全局单例注入改为 _g_gen 直接赋值
- 机械化迁移测试前的基线备份
|
2026-08-20 05:33:59 +08:00 |
|
TermiNexus
|
a42923cf25
|
fix(stub): vpi 注入全局变量声明带源模块 SHA1 前缀
"跨模块全局变量 _op_head 类型未知(stub 未注入)" 根因:VpiReader
_inject_global_variable_declare 从 vpi(源码级裸名)注入依赖全局声明时用
短名 @_op_head,而 5f7a873 后定义端已是 @<tokens_sha1>._op_head →
from-import 精确查找(带前缀)在翻译时找不到 → fail-fast 误杀
(函数注入 _inject_function_declare 早已带 src_sha1 mangling,全局漏做)。
修复:_inject_global_variable_declare 注入名用 src_sha1 前缀 mangle
(对齐定义端与查找端三方一致),调用点传 ParseVpiIntoModule 已提取的
src_sha1;去重改按 mangled 名匹配。
另:ExprGenName from-import 全局未注入时由 fail-fast 改为 _deps_pending
(依赖 vpi 按文件序未就绪属 Phase A 收敛正常态,真实错误由收敛检查暴露)。
|
2026-08-20 05:11:25 +08:00 |
|
TermiNexus
|
601db9e265
|
fix(gen): from-import 模块名截断后再查 SHA1(非 NUL 结尾退化裸名)
undefined symbol: _op_head 根因:lookup_from_import 返回指向 from_imports
内部的指针(非 NUL 结尾,后随空格分隔的其他条目,如 "ast.tokens
TokenType:ast.tokens ...")。ExprGenName 的 from-import 全局查找直接用
该值 LookupSha1ByModName → 整串查不到 → _mangle_name_with_sha1(None)
退化裸名 → 引用 @_op_head 而非 @<tokens_sha1>._op_head → 链接 undefined
(tokens 定义端已带 SHA1 前缀)。ExprGenAttr 别名解析同病。
修复:ExprGenName 新增 _cut_from_import_mod(截断到空格/冒号/NUL),
两处 from-import 分支截断后再查 SHA1;ExprGenAttr 别名解析内联截断。
对齐 CallGenBase._lookup_sha1_from_modname_raw / ExprGenCdef 既有截断逻辑。
|
2026-08-20 05:01:21 +08:00 |
|
TermiNexus
|
99df2aef99
|
fix(gen): 全局变量引用加引号(SHA1 前缀名以数字开头)
llc "expected instruction opcode" 根因:模块级全局带 SHA1 前缀后名以
数字开头("sha1.name"),LLVM 无引号标识符不能以数字开头。stub/text
打印端早已按 _ll_name_needs_quote 加引号,但引用端(make_global_ref /
_find_pool_var 兜底 / 定义端 ref_name)一律 @%s 无引号 → 组合 IR 指令里
store i32 0, i32* @748d0424e8976fa0._pass_count 解析失败。
修复三处引用生成按 _vtable_name_needs_quote(数字开头或含 .)加引号,
对齐函数引用路径(ExprGenName/FuncGenMixin 的 needs_quote 判断)。
组合 IR 去重(_HasGlobalInBuf 等)按打印格式名匹配,带引号一致无需改。
|
2026-08-20 04:42:20 +08:00 |
|
TermiNexus
|
252d15ba9f
|
fix(gen): 模块属性访问支持别名解析(import X as Y → Y._attr)
直接写 GenGenerator._g_gen = gen(别名模块属性)此前不可用:
_resolve_module_attribute_global 未解析别名,_lookup_module_sha1
("GenGenerator") 查不到(Sha1Store 用原始模块名)→ 退化裸名 →
全局带 SHA1 前缀后 undefined symbol。
修复:查目标模块 SHA1 前经 from_imports 解析别名(lookup_from_import
返回原始模块名 lib.core.Gen.Generator)。别名属性写与 setter 调用等价
(写同一 @<模块sha1>._g_gen),且更高效(无函数调用/链接依赖)。
|
2026-08-20 04:37:50 +08:00 |
|
TermiNexus
|
5f7a87341a
|
fix(gen): 模块级全局变量命名带 SHA1 前缀,消除 ld.lld duplicate symbol
多个模块声明同名模块级全局(如 _mbuddy)时全部生成裸名强定义(zeroinit)
→ 链接时 ld.lld duplicate symbol: _mbuddy(大量 warning)。函数名早已
mangled,全局变量漏做。
修复(对齐函数名 _mangle_name,SymTab key 保持裸名查找逻辑零改动):
1. 定义端 TranslatorGenMixin:全局名 = {模块sha1}.{变量名}
2. 模块属性访问 ExprGenAttr:按目标模块 SHA1 前缀精确查找/创建(含嵌套
模块 w32.xxx 与 t 类型对象裸名 linkonce_odr 特例),引用用完整名
3. from-import 全局 ExprGenName:带源模块 SHA1 前缀查找,引用用完整名
4. _find_pool_var 兜底:linkonce_odr + zeroinitializer 定义(每模块独立,
不再依赖裸名链接合并共享;运行时未初始化则真实崩溃暴露,不掩盖)
|
2026-08-20 04:31:39 +08:00 |
|
TermiNexus
|
cf6c917e83
|
fix(gen): 泛型特化类记录触发文件,作废重译正确重置 MethodsEmitted
ld.lld undefined symbol list[ast.ClassDef|t.CPtr].* 根因:Phase A _deps_pending
作废重译时 reset_module_methods_emitted 按当前文件 sha1 精确匹配,特化类
ModuleSha1=模板 sha1(方法名带模板前缀)匹配不到,MethodsEmitted 残留 1
→ 下遍 _specialize_generic_class 补译分支(==0 才补译)跳过 → text.ll 只有
call 无 define → 链接失败。
修复:StructEntry 新增 SpecTriggerSha1(特化类触发文件 sha1),
_specialize_generic_class 全部返回路径经 _record_spec_trigger 记录,
reset_module_methods_emitted 按 ModuleSha1 或 SpecTriggerSha1 匹配重置。
|
2026-08-20 04:04:40 +08:00 |
|
TermiNexus
|
b68ae16639
|
fix(stubmerger): 依赖 worklist 去重,修复 64KB 溢出(app_deps 与 BFS 展开均无去重,公共模块重复累积导致溢出;三处逐模块词边界去重,溢出检查保留作防线)
|
2026-08-20 03:11:48 +08:00 |
|
TermiNexus
|
b08a0aff48
|
perf(phase2): 缓存 BuildCombinedIR 全目录扫描结果
Phase B 编译 .obj 慢得像同步编译的根因:BuildCombinedIR 对每个源文件
调用一次 _collect_stub_sha1s 递归扫描 temp_dir 全部切片子目录(90 文件
× 全目录枚举 O(N×S)),且目录扫描与 llc 并行无关(llc 并行已生效)。
按 temp_dir 缓存扫描结果(StubMerger._stub_scan_cache_*,stdlib 分配
跨 reset 存活),首次扫描后复用,temp_dir 变化时自动重建。BuildCombinedIR
的所有调用点(Phase B 主循环/Phase B+ includes 编译/stubgen)统一受益。
|
2026-08-20 01:15:05 +08:00 |
|
TermiNexus
|
efc0e47058
|
chore(gen): 移除 [DBG-ANNOT]/[LLC-DBG] 调试插桩
EdgeCaseTest/MultiInheritTest 已修复验证,清理 e770fef/dc5bb21/0d2e912
遗留的调试输出:TypeGenResolve.vp resolve_annotation_type 的 [DBG-ANNOT]
(含多余 import stdio),BuildPipeline.vp llc 并行路径的 [LLC-DBG]/
[LLC-DBG2](10 处 region debug-point)。
|
2026-08-20 00:50:18 +08:00 |
|
TermiNexus
|
8947c5c5ee
|
fix(gen): 多继承 this-adjust 对无字段父类跳过字节调整(对齐 TPC,Vec2Extra 误报未注册修复)
|
2026-08-20 00:31:33 +08:00 |
|
TermiNexus
|
e770fef0f7
|
fix(gen): 恢复 ClassGenBase 基类别名解析(_resolve_base_alias)
ClassGenMixin 拆分(47ac2dd)时 _resolve_base_alias 丢失:_get_parent_class
/_collect_parents 不再解析 from-import 别名基类(from t import CStruct as cs
→ class CsPoint(cs)),'cs' 被当真实父类 → find_struct('cs') 失败 → 类 defer
永不注册 → 变量注解解析失败(EdgeCaseTest Test12 回归)。恢复
_resolve_base_alias 并在两处调用;_collect_parents 增 trans 参数透传(别名
解析需 from_imports)。TypeGenResolve 增 [DBG-ANNOT] 插桩待验证后移除。
|
2026-08-20 00:05:32 +08:00 |
|
TermiNexus
|
dc5bb2111b
|
fix(phase2): 句柄数组改回 list[str] 显式 elem_size=8
插桩确认 list[t.CPtr] 构造正常(pool 有效 elem=8 data 有效)但 append
仍读零页崩溃(list[ptr] append 的 store/参数类型生成待查)。改用全库
验证稳定的 list[str](str=bytes=i8*,显式 elem_size=8 走 else 分支),
append(t.CPtr(th.handle)) / t.CPtr(get(j)) 显式转换,join/close 对句柄
操作不变。保留 [LLC-DBG2] 构造状态插桩。
|
2026-08-19 23:12:33 +08:00 |
|
TermiNexus
|
0d2e9124d9
|
debug(phase2): 打印 list[ptr] 构造后内部状态定位 append 崩溃
崩溃仍在 list[ptr].append 的 pool.alloc(0xf8→0x128 偏移变化说明
elem_size 修复生效),需区分 __pool__ 未初始化(__init__ 未调/写错位)
与 MemBuddy 内部损坏。新增 [LLC-DBG2] 打印 pool/count/cap/elem/data。
|
2026-08-19 23:01:48 +08:00 |
|
TermiNexus
|
0faf44e179
|
refactor(phase2): 句柄数组改回 list[t.CPtr]
TPC 已根修 list[t.CPtr] 特化(_resolve_generic_slice_type 保留 t.CPtr
带前缀 + mangled 名统一 'ptr'),不再需要 list[str] 绕开。句柄数组
方案保留:start() 后立即取 handle,join/close 直接对句柄操作。
|
2026-08-19 22:44:21 +08:00 |
|
TermiNexus
|
0810f9f9e8
|
fix(phase2): llc 线程 join 改用句柄数组替代 Thread 对象存取
插桩证实 list[vthreading.Thread|t.CPtr] 的 get(0)/get(1) 返回同一
对象指针(栈对象地址复用),j=0 的 close() 把 handle 置 NULL 后 j=1
的 join 用 NULL 句柄 → WaitForSingleObject 立即 WAIT_FAILED → alive=0
→ e5fb 线程句柄从未被 join(失败槽 Result=-1 误报)。改为 start()
后立即取出 handle 存入 list[t.CPtr](8 字节指针存取稳定),join/close
直接对句柄 WaitForSingleObject/CloseHandle,不再依赖 Thread 对象存续;
join 索引用全局 batch_start+j(handles 跨批次累积)。
|
2026-08-19 22:19:33 +08:00 |
|
TermiNexus
|
88778dc422
|
debug(phase2): join 前打印 th 指针/handle/started 定位 join 立即返回
ClassArrayTest join(0) 已正常等待 edd8(645e8e0 生效),但 join(1) 仍
立即返回 alive=0 且 e5fb Result=-1(worker 未写 Result)。新增
[LLC-DBG2] 插桩打印 th_j 指针/handle/started,区分句柄无效(存取错)
与 e5fb 线程已死两种可能。
|
2026-08-19 22:10:11 +08:00 |
|
TermiNexus
|
645e8e0fbf
|
fix(phase2): llc 线程数组元素类型改为指针 Thread|t.CPtr
list[vthreading.Thread] 的 store/load 类型不一致:append 存 8 字节
(th 指针,elem_ptr 降级 i8*),get 却按 Thread 结构体返回槽地址
(HandlesExprAttr._infer_element_struct_class 推断元素类)→ th_j 是
list 数据槽地址,join 把对象地址当线程句柄 → WaitForSingleObject
立即 WAIT_FAILED → alive=0 → 误报 llc 失败(4bd254a 只修了槽间距,
未修类型不一致)。改为 list[vthreading.Thread | t.CPtr](与已稳定的
list[ast.AST | t.CPtr] 同理),store/load 均为 8 字节指针,
join/is_alive/close 拿到真实线程句柄。
|
2026-08-19 22:03:22 +08:00 |
|
TermiNexus
|
3f3e3d5898
|
fix(phase2): _run_cmd_wait 清零 STARTUPINFOA 等结构体
TPV 的 T() 构造仅 alloca 不 memset(无 __init__ 时只 InitStructDefaults,
extern 结构体无默认值记录 → no-op)。_run_cmd_wait 的 si 只设 cb,
dwFlags 等 15 个字段为栈垃圾:多线程并发调用时垃圾值随机,dwFlags
垃圾位令 CreateProcessA 使用垃圾句柄作子进程 stdio → 子进程行为不定
/父进程线程崩溃(ClassArrayTest e5fb worker 崩、edd8 正常的概率崩溃
根因,70c8810 引入 _run_cmd_wait 时即存在)。si/sa/pi 全部显式清零。
|
2026-08-19 21:50:56 +08:00 |
|
TermiNexus
|
4bd254a27f
|
fix(phase2): llc 并行线程数组修复 list 元素间距与容量越界
1b5246f 引入 list[Thread] 时误把 max_threads 当作 list 构造的
容量参数传入,实际第二参数是 elem_size=16 → 槽间距 16 字节远小于
Thread 结构体大小,set(j, th) 元素重叠覆盖(get 返回混合垃圾对象);
且 list 初始容量仅 8,batch>8 时 set(8..15) 无容量检查越界写堆 →
llc 全部成功后随机 ACCESS_VIOLATION(ClassArrayTest 崩溃根因,ASAN
构建下更早触发)。改为不传 elem_size(默认取 T.__sizeof__())+
append 自动扩容(8→16→32 覆盖 LLC_MAX_THREADS=16 批量)。
|
2026-08-19 21:36:26 +08:00 |
|
TermiNexus
|
42aa90c1af
|
fix(gen): translate_c_deref 支持转换链包裹推断指针目标
对齐 TPC HandlesSpecialCall._infer_deref_target_type 增强:
1. 新增 _IsTypeExpr/_IsCastWrappingDeref 模块级辅助,判定
c.Deref 是否处于类型转换链包裹(如 (T | t.CPtr)(t.CPtr(c.Deref(p))))
2. translate_c_deref 推断条件从仅直接 RHS 扩展为直接 RHS 或
转换链包裹 Deref,新增 dref_is_ptr 允许指针目标推断
(bitcast 后 load 8 字节),修复 llc 并行线程数组 list[Thread]
之外仍受 i8* 退化的场景(1b5246f 只绕开了一处)
|
2026-08-19 21:19:38 +08:00 |
|
TermiNexus
|
1b5246f29f
|
fix(phase2): llc 并行线程数组改用 list[Thread]
c.Deref 对 i8* 无法推断加载类型时只读 1 字节(旧编译器),th_ptrs 存
Thread* 后 join/is_alive 拿到垃圾句柄立即失败——llc 并行"5 秒误报失败"
的直接原因(ClassArrayTest 2 模块并发必现)。改 list[Thread] 保类型,
get 返回明确类型,不再依赖 Deref 推断。含 [LLC-DBG] 插桩,验证后移除。
|
2026-08-19 21:14:20 +08:00 |
|
TermiNexus
|
c68eb22052
|
debug(phase2): 细化插桩区分 CreateProcessA 卡点与 join 等待行为
|
2026-08-19 21:03:47 +08:00 |
|
TermiNexus
|
70c88107ce
|
fix(phase2): llc worker 改用 CreateProcessA 替代 system,修 asan 并发挂起
插桩证实:ClassArrayTest 固定 llc 失败是 e5fb16127bce8f68 的 worker 卡在
stdlib.system() 内(LLC2 未打印,Result 保持 -1)。Python 复现 os.system
并发无问题,差异仅剩 asan 构建环境——Windows asan 的 RTL allocator hook
经 CreateProcess 启动子进程时受干扰(LLVM issue #111166 同类)。
新增 _run_cmd_wait:CreateProcessA 直接执行 + WaitForSingleObject +
GetExitCodeProcess,继承父控制台输出(同 system 语义),全 stdlib/栈分配
线程安全。含 [LLC-DBG] 插桩,验证后移除。
|
2026-08-19 20:57:52 +08:00 |
|
TermiNexus
|
f3c94917e5
|
debug(phase2): 插桩 llc worker 打印 system 返回码,定位 ClassArrayTest 固定 llc 失败误报
|
2026-08-19 20:48:01 +08:00 |
|
TermiNexus
|
f5b3e46543
|
fix(gen): while 1 无限循环无 break 判定 merge 不可达
HandlesWhile 翻译 while 后无条件置 _ctrl_merge_reachable=1,导致末句为
`while 1:`(条件常量真且循环体仅 return 无 break)的函数在收尾检查被
误判"流程掉出末尾未显式 return"(vrandom.gammavariate TypeError)。
新增 _IsConstTrue/_StmtHasBreak(跳过嵌套循环子树):常量真且无本层
break 时 merge 结构性不可达 → 置 0,函数收尾对末句 While 生成 unreachable。
|
2026-08-19 20:35:22 +08:00 |
|
TermiNexus
|
b2e69c2f75
|
chore(gen): 移除全部 [DIAG] 调试打印
|
2026-08-19 10:11:37 +08:00 |
|
TermiNexus
|
63caf152c2
|
perf(phase2): llc 并行线程数 8 提升到 16
对齐 TPC Phase2Translator n_workers=os.cpu_count()(本机 16 核)。
|
2026-08-19 07:56:31 +08:00 |
|
TermiNexus
|
6807082853
|
fix(gen): this-adjust 失败静默跳过改 fail-fast
非第一父类方法调用时,this-adjust 任一步失败(父类/子类 struct 未注册、
首字段缺失、字段查找失败)此前静默用未调整的 obj_ptr 当 self -> 方法按
自身布局读字段读到垃圾(lookup_reexport strcmp 概率崩溃根因候选)。
新增第一父类判定(前缀对齐 delta==0 免调整),其余失败路径 fatal_error
报出方法/定义类/接收类。
|
2026-08-19 07:51:37 +08:00 |
|
TermiNexus
|
edd842b6af
|
fix(phase2): free_llc_task 误 free 任务槽导致 double-free
LlcTask 记录是 llc_tasks 数组的连续槽(非独立 malloc),free_llc_task
此前对槽调 stdlib.free,循环后又对数组整体 free -> 同一 32 字节区域
double-free(ASan)。修复:free_llc_task 只释放命令串并置 None,记录
由调用方随数组整体释放。
|
2026-08-19 07:34:57 +08:00 |
|
TermiNexus
|
18b9b8bfa8
|
perf(phase2): llc 编译改多线程异步并行
Phase B 主循环从'每文件同步跑 llc'改为'循环内写 .ll + 构造 LlcTask
(命令串 stdlib.malloc,避免主池 reset_to(mark2) 回收悬空),循环后
run_llc_parallel 分批发 LLC_MAX_THREADS(8) 个线程并发跑 llc,join 后
校验结果。worker 只调 stdlib.system(),不做任何池分配(MemBuddy 非线程
安全);ASan 模式 opt 插桩也在 worker 内并行。includes 编译路径与
单文件 run_pipeline 保持同步不变。
|
2026-08-19 07:28:08 +08:00 |
|
TermiNexus
|
eb0398eae3
|
fix(gen): this-adjust 基类 bitcast 前确保 opaque 类型声明
_translate_method_call/_translate_super_call 的多继承字节偏移调整会生成
bitcast i8* -> %SHA1.ClassGenBase*,但 PrintModule 只扫描函数签名、
不扫函数体指令,跨模块基类类型未被声明导致 llc 报 use of undefined type。
在 bitcast 前调用 module_ensure_opaque_for_type(幂等,仅对未定义类型
添加 = type opaque)。
|
2026-08-19 06:25:33 +08:00 |
|
TermiNexus
|
e8a3fd0a65
|
fix(attr): ALL_CAPS 非 CDefine 回退跨模块全局变量
Phase1.PYI_BUF_SIZE: t.CSizeT = 262144 是 i64 模块级全局而非 CDefine 宏,
语义同 C 的 extern size_t PYI_BUF_SIZE。原 ALL_CAPS 属性路径在 CDefine
查找失败后直接 fail-fast,从不尝试跨模块全局。修复:
- ExprGenAttr 模块限定路径:CDefine 失败时先查 find_global_in_module,
命中则按跨模块全局引用加载,仅全局也不存在时才 fail-fast;
- ExprGenName 裸名路径:from-import 确认后同样回退跨模块全局加载
(覆盖 from Phase1 import PYI_BUF_SIZE 形式)。
|
2026-08-19 05:41:21 +08:00 |
|
TermiNexus
|
aa2a1e593f
|
revert(cdef): 撤销跨模块 CDefine 匹配放宽
t.CSizeT 等注解的模块级常量是全局变量而非宏,不应走 CDefine 宏路径
(正确语义:Phase1.PYI_BUF_SIZE 按 extern size_t 跨模块全局引用)。
恢复行匹配仅认 t.CDefine。
|
2026-08-19 05:41:14 +08:00 |
|
TermiNexus
|
677373c629
|
fix(cdef): 跨模块 CDefine 匹配放宽到 t.C 类型注解
原行匹配只认 "t.CDefine"(9 字符精确),漏掉 t.CSizeT/t.CInt 等注解的
模块级常量全局(如 Phase1.PYI_BUF_SIZE: t.CSizeT = 262144,是 i64 全局
常量而非 CDefine)→ "跨模块 CDefine 未找到" 误报。本函数仅被 ALL_CAPS
名触发,放宽为 t.C<大写> 类型 + 字面量初值即视为编译期常量;模块限定
(Phase1.PYI_BUF_SIZE)与 from-import 裸名(from Phase1 import PYI_BUF_SIZE)
两条路径均经本函数,一并覆盖。
|
2026-08-19 05:35:02 +08:00 |
|
TermiNexus
|
cf9207f171
|
fix(struct): PARENT_MAX 16→64 修复 Generator 43 父类字段截断
拆分重构使 Generator 父类增至 43 个,PARENT_MAX=16 使 _collect_parents/
set_parent_names 只收前 16 个父类 → StmtGenMixin(#40) 等字段丢失 → 结构体
缺 DiagStmtCount → __init__ 写 self.DiagStmtCount "属性写入失败"。FIELD_MAX
128→256 防字段静默截断;MRO_MAX 16→64 保证父类方法解析可达。两处常量
(HandlesStruct/StructGenMixin)同步提升。
|
2026-08-19 05:11:51 +08:00 |
|
TermiNexus
|
46170c20ef
|
fix(gen): ExprGenCls/Fstr 补本地 DOC/FSTR 常量副本
ExprGenMixin 拆分后 DOC/FSTR 系列常量只定义在 ExprGenMixin.vp(M),而 ExprGenCls(C)/ExprGenFstr(F) 按文件序先于 M 编译,跨模块 CDefine 全局表未注册 → NameError 未定义名称。按 CallGen 既有本地副本惯例补定义,消除文件序依赖。
|
2026-08-19 05:06:08 +08:00 |
|