TermiNexus
|
76df3f0225
|
perf(gen): 结构体/类型查找去线性化并守卫全量遍历残量
StructGenMixin: 加「名 | Ty 指针值 -> 首注册下标」索引,find_struct/find_struct_by_module/find_struct_by_type 走 O(1) 快速路径;每次注册占槽保序,中和/改名后键不等自然跳过,未命中或索引不可信回退原扫描。并补 _struct_name_hash/_struct_ty_hash(32 位 FNV,常量均小于 2^63 以避开大十进制字面量解析风险)。
TypeSpec.InternSpec: 加「文本键 -> 驻留下标」开放寻址索引,去重由 O(n) 降为期望 O(1);命中返回原同一实例,注册顺序/容量 fail-fast 语义不变。
register_struct/lookup_field/get_class_name_by_type 的按 Ty 指针首匹配改走 find_struct_by_type;CallGenLeafKit/CallGenCall 的按序号全量遍历补守卫注释(避免后续误改为按名查找)。
|
2026-09-13 18:56:16 +08:00 |
|
TermiNexus
|
0dd7511a9b
|
fix(tpv): 修常量折成0致alloc(0)与多处fail-fast,并落地热点优化
TypeGenCDef: CDefine 表名深拷贝(vpi 注入名为零拷贝指针且 vpi_buf 提前释放,悬空名致常量查出错误值 0)
VpiReader: 模块级 SHA1_LEN(16) 改名 SHA1_HEX_LEN,消除与 Phase1.SHA1_LEN(17) 的跨模块同名冲突
CallGenCall: 实参翻译失败/漏传必需实参改 fail-fast,禁用零值兜底(堵住 SHA1_LEN 未解析变 alloc 0 的通路)
MatchGenMixin: 序列 match 的 case _ 分支补容量守卫(原先会越界写穿 pool 块、破坏空闲链)
Phase1Main/Phase1Scan: 预扫描缓冲分配失败改 fail-fast;加临时取证打点
CallGenBase: find_func_in_module 4 趟链表扫描合并为 2 趟
ImportsGenMixin: import 查找加哈希索引(键为 NUL 结尾副本,未命中回退原扫描)
TypeGenBase/TypeGenResolve: 库 typedef 按模块一次性门禁与缓存
VpiReader: vpi 注解解析补 rowptr[T] 分支
|
2026-09-13 17:50:03 +08:00 |
|
TermiNexus
|
af2c66e7d7
|
chore(tpv): 永久池扩容至 1 GiB
PERM_POOL_SIZE 由 512MB (536871176) 调整为 1 GiB (1073741824),为 REnum 注册表挂到 PermPool 后留足余量。
|
2026-09-12 23:14:52 +08:00 |
|
TermiNexus
|
eef84657a1
|
fix(tpv): 修正 REnum 表按名查找与 match 分派,恢复 str() 指针强转
str() 对整数(sizet/i64)走 snprintf 十进制格式化(Python 语义),不是 i8* 强转;用它读 sizet|t.CPtr 联合表元素再 strcmp 永不相等 => _is_renum_class_name 恒 0、变体名查不到(__types.vp:407 bits / :159 Void 根因)。IR 实证 output/a8891afb66d3eda4.text.ll L5551-5558。
- ClassGenEnum: RenumClassNames/RenumVariantNames 读侧统一改 (str)(t.CVoid(x, t.CPtr));新增 _is_renum_by_entry 与 RenumTableDump;REnum 注册静默早退改 fail-fast
- MatchGenMixin/CallGenMixin: match 分派 2a/2b 与变体构造入口并上 by_entry 判据
- TypeGenResolve: 泛型下标 Phase B 解析不出特化时 fail-fast
- CallGenProp: 泛型特化名末段按括号外点切分
- CompilerFactory/ClassGenBase: REnum 注册表改挂编译期单例
- ClassGenDef: CEnum/REnum 分派歧义 fail-fast
|
2026-09-12 23:14:23 +08:00 |
|
TermiNexus
|
e0e024ee93
|
fix(tpv): 注解裸名按 from-import 归属查找(D26 闭环)
stub 注入注解时 trans.ModuleSha1 是正在翻译的文件,而注解里的类归属 stub 源模块;仅靠当前模块 sha1 加全局可见性在 App 严格模式下查不到(AsyncGenMixin 未 import ast.Expression),导致 ast/__init__.vpi 的 parse_expression -> rowptr[Expression] 返回类型解析失败 fail-fast。TypeGenResolve 的 Name 分支在 own 之后、可见性之前插入 from_imports 归属查找(LookupModNameByAlias 到 LookupSha1ByModName 到 find_struct_by_module)。TPV 自举 Phase1 从 28/53 推进到 40/53
|
2026-09-12 19:37:55 +08:00 |
|
TermiNexus
|
ea2abba574
|
refactor(tpv): 删除 _deps_pending 置位面与 Phase A pending 多遍收敛机制
69 个工程成功编译且 _phaseA_pending.log 恒 0 字节,证实 14 个置位点全部零命中。删除 14 个 _MarkDepsPending 调用点(原「依赖未就绪」分支保留默认类型或原报错路径);删除 _MarkDepsPending 与 _AppendPhaseAPending 及 _phaseA_pending.log 读写;删除 Phase A 出口「pending 则不写盘、回滚 MethodsEmitted、continue」整段;删除 _deps_pending 与 _pf_dbg_pend_flagged 字段及全部读取分支;清理遗留探针 [PF-DBG] 与 [METHDBG]。16 files changed, +37 / -558
|
2026-09-12 19:24:52 +08:00 |
|
TermiNexus
|
17f109e204
|
fix(tpv): 修复 vpi 重导出包前缀与 D25 变量名悬垂,补齐 fatal_error 刷盘
VpiReader 包 __init__ 重导出补包前缀,类注册与方法声明两遍化,按需注入依赖 vpi(先登记后注入防环,失败撤销登记);VarGenMixin 的 add_var 深拷贝变量名,符号表条目不再依赖 AST tree 生命周期;CallGenCall 的 list 内建与泛型基类判定类名来源回退到接收者实际 struct 名;TypeGenErr 的 fatal_error 退出前 fflush;StubMergerBuild 每模块重置 vpi 注入去重表
|
2026-09-12 19:00:19 +08:00 |
|
TermiNexus
|
626f79cbd1
|
fix(tpv): vpi 相对导入补回包前缀(D26)
- vpi 只存 module=base(前导点记在 level),from-import 映射写字面 base 时,解析端按精确 LookupSha1ByModName 查不到 ast.base ⇒ 裸类名(AST 等)解析失败 ⇒ rowptr[AST] 等注解 fail-fast(TPV→TPV 自举 includes/ast/parser.vp parse 根因)
- 按 stub 自身相对路径还原包名(ast/parser.vp → ast),level==1 拼成 ast.base 再登记;_stub_add_imported 与 _stub_add_from 两处同步
|
2026-09-12 15:59:37 +08:00 |
|
TermiNexus
|
3c45895878
|
fix(tpv): alloca 退化守卫收窄到「裸泛型模板基类」形态(避免误杀同名重声明换类型)
- parser.vp:964 'node: rowptr[AST] = Slice(...)' 命中上一版守卫(旧 alloca 是 Tuple*)——但 Tuple* vs AST* 是同名重声明换具体类,两者都是 8 字节指针槽,属合法用法,不该 fatal
- 收窄判据:仅当旧 alloca 的 pointee 是**裸泛型模板基类**(剥 sha1 前缀后不含 '[' 且 _find_generic_template 命中)时才 fail-fast —— 这正是 D25 的退化形态(丢类型实参 → 方法调用按错误元素类型特化 → 截断)
|
2026-09-12 15:24:23 +08:00 |
|
TermiNexus
|
590a6a2bbe
|
fix(tpv): 复用的 alloca 与注解类型不一致时 fail-fast(D25 alloca 退化根治)
- get_or_create_sym 只用「名字+作用域」复用(ty 不参与判定),可能命中类型不同的旧 alloca(同名重声明 / 退化 alloca,如裸 list* 对上 list[ast.ASTptr]*)→ alloca 类型与使用点注解类型分裂 → 方法调用按错误元素类型特化 → inttoptr 截断
- 只比较「双方都是指针且 pointee 都是结构体」这一最典型退化形态:结构体名不同即 fatal_error,报出变量名与两个类型,直接暴露退化点(不兜底)
|
2026-09-12 15:13:41 +08:00 |
|
TermiNexus
|
b206e7d9c1
|
fix(tpv): 泛型类型实参禁止静默默认 int(D25 fail-fast 两处)
- CallGenMixin: 裸名泛型构造推断不出类型实参时不再默认 int,改 fatal(与 _infer_generic_ctor_type_arg 注释「绝不默认 int」对齐)
- CallGenCall._translate_method_call: 泛型模板基类(剥 sha1 前缀后不含 '[')上的非 list 内建方法调用改 fatal —— 此前静默按默认 list[int] 特化,元素按 i32 处理 → 方法返回 i32 → inttoptr 截断指针 → 读垃圾 AST 节点(D21/D25 崩溃族)
- list 内建方法仍走内联路径(运行时 __elem_size__),不受影响
|
2026-09-12 14:52:23 +08:00 |
|
TermiNexus
|
ced50bd78b
|
fix(tpv): 注解 mangled 名算键统一——补回丢失的 from_imports(D25 根因第 1 步)
- extract_class_name_from_annotation 的 Subscript 分支递归取 base 时漏传 from_imports(同函数其余调用点都传了),导致同一注解在「派发名 / 查表键 / 注册键」三处算出不同 mangled 名
- 症状:MatchGenMixin._handle_renum_match 两遍对同一裸 list* alloca 分别按 list[ast.ASTptr] 与 list[ast.ClassDefptr] 解释 → .get 误分派 → 节点指针被截断 → StmtGenMixin._translate_stmt_impl ASan 崩溃(D21 复发,见 Debugger/_Type.md D25)
|
2026-09-12 14:32:57 +08:00 |
|
TermiNexus
|
967095df5b
|
refactor(tpv): _deps_pending 置位收敛到唯一入口 _MarkDepsPending(S4 第一步)
- CallGenBase 新增 _MarkDepsPending(trans,kind,cls,method,dep,extra):一处实现「置标志 + 统一格式 [DEPDBG] + 持久化 _phaseA_pending.log」三连
- 14 处置位点(D7-1 清单:attr_read/attr_write/method_ret/mro_ret/mro_anc/special_ret/prop_ret/dispatch_ret/dispatch_sp/func_ret/func_mangled/global_stub/class_parent/class_field_ty)全部改经该入口
- 行为不变;DEPDBG 行格式统一为 pending(<kind>): mod=.. cls=.. method=.. dep=.. extra=..,供下一步按 kind 统计命中数、删除死点
|
2026-09-12 13:53:20 +08:00 |
|
TermiNexus
|
7e68e76ec4
|
refactor(tpv): SHA1 前缀判定收敛到 GenApi 唯一真源(C10/D3 收尾)
- CallGenCall: list 泛型前缀剥离(719) 与类型名提 sha1(907/1190) 改 GenApi.sha1_prefix_len,不再盲取前 16 字节当 sha1
- CallGenCBuiltin._asm_name_is_mangled / CallGenLib._is_sha1_mangled_call: 改真源(去大写 A-F、去扫描任意位置 '.')
- CallGenFd: 类型名提 sha1 加前缀格式校验(裸名不再误取前 16 字节)
- CallGenMixin: CExport declare 前缀判定改真源
- StructGenMixin / TypeGenResolve: 类型名、模块段判定改真源;StructGenMixin 补漏掉的 GenApi import(L596/L943 引用原会 fail-fast)
|
2026-09-12 12:59:01 +08:00 |
|
TermiNexus
|
471bedbcf4
|
fix(tpv): 去掉条目指针数组往返,改上界/量长直写(修自举 ASan strcat -1 崩溃)
|
2026-09-12 12:43:08 +08:00 |
|
TermiNexus
|
82eea2719f
|
refactor(tpv): rowptr[T] 迁移 + D 表定长缓冲改精确分配 + SHA1 前缀判定收敛(D1/D3/D4/D5/D6/D7/C10)
|
2026-09-12 11:09:35 +08:00 |
|
TermiNexus
|
7471cc64f9
|
docs(tpv): 精简 CompilerFactory 装配设计注释块
|
2026-09-12 10:52:00 +08:00 |
|
TermiNexus
|
679758c05b
|
refactor(tpv): 删无符号判定的旧字符串兜底,真源唯一(S4 去字符串化收尾)
删 _type_name_unsigned_legacy / _annot_str_unsigned_scan / _annot_str_unsigned_legacy / _last_dot_tail / _is_simple_ident;_type_name_unsigned 与 _annot_str_unsigned 变为真源唯一(spec_sign_of_annot)。
依据:真源已含顶层 | 分段、去括号/空白、IDENT[INNER] 取元素、去模块前缀、精确名白名单、CTypedef 链展开,旧路径能力是它的真子集(S2 已把旧路径修到与真源一致),差异面就是假阳性区 —— strstr 子串扫描正是 A4/A5 根因(BYTEPTR 含 BYTE、任何含 uint32 的 mangled 名都被判无符号)。现语义:真源 UNKNOWN=不表态 => 返回 0;若日后发现漏判,补白名单/补 CTypedef,不恢复子串扫描。
|
2026-09-12 10:26:51 +08:00 |
|
TermiNexus
|
cc17a8f8db
|
refactor(tpv): 去掉函数内懒导入,改用顶层 import
Viper 的 import 是编译期的,懒导入在编译型语义下毫无作用,模块环不需要也不应该用它规避。
TypeSpec 顶层 import GenApi(GenApi→GenTypes→TypeSpec 成环但编译期无碍);CallGenLib 的既有懒导入(VpiReader)一并改顶层(VpiReader 不反向依赖 Call 层,无环)。
|
2026-09-12 10:23:08 +08:00 |
|
TermiNexus
|
7fbf69ae63
|
fix(tpv): InternSpec 表满改为 fatal(不再返回 None 静默丢类型信息)
表容量超限原实现只是 return None,但注释声称 fail-fast:None 会沿调用链传到 entry.Spec,条目静默失去类型信息(_entry_spec_unsigned 恒返回 0 ⇒ zext/sext 方向取错),属静默数据损坏。
改为 GenApi.fatal_error(InternalCompilerError);TypeSpec 与 GenApi 互为依赖(GenApi→GenTypes→TypeSpec),故函数内懒 import 破环(同 CallGenLib.vp:220 既有模式)。仅当 fatal_error 无 gen 通道时退化为不驻留返回完整实例,守住不返回 None 的底线。SPEC_INTERN_MAX 仍为 8192(当前未触发)。
|
2026-09-12 10:21:27 +08:00 |
|
TermiNexus
|
1039969f69
|
refactor(tpv): CPtr 标记语义定为注解基名精确比较(第 5 处收敛)
CallGenMixin 闭包 vs 函数指针分派:原 strstr(注解名, CPtr) 子串匹配改为 SpecTypeNameBaseIs(fp_annot, CPtr)。
语义:CPtr 标记 = 注解基名精确等于 CPtr(裸 t.CPtr / from t import CPtr)。不能改用 Spec 判定——t.Callable[[A], R] 解析结果同样是 Ptr(i8)(TypeGenResolve.vp:2525-2531),与 t.CPtr 完全同型,类型层无区分度,故标记只能由注解名承载,不新增 Spec 字段。副作用:含 CPtr 子串的类名(如 CPtrHolder)不再被误判为闭包指针。已知局限(与改造前一致):Foo | t.CPtr 的 SourceName 只留 Foo,该形态判为非标记。
|
2026-09-12 10:12:01 +08:00 |
|
TermiNexus
|
ae63f4f6ab
|
refactor(tpv): 容器判断改基名精确比较(SpecTypeNameBaseIs)
TypeSpec 新增 SpecTypeNameBaseIs(name, base):基名 = 截断第一个 '[' 起的泛型实参后,取最后一个 '.' 之后(去模块名 / LLVM 注册名的模块 sha1 前缀),再精确比较;零分配,复用 _spec_name_eq。
4 处容器判断改写:StmtGenCifMixin:1133/1142/1498(读注解名)、CallGenDispatch:1685(读 LLVM 注册名)。原 strstr 子串匹配会误命中 MyDictHelper / playlist;副作用是 GSList 等用户类不再被误判为内置 list,改由 OOP __iter__/__next__ 路径处理。第 5 处 CallGenMixin:973 的 CPtr 属标记判断(SourceName 会丢掉联合里的标记),需先定标记语义,本次不动。
|
2026-09-12 10:10:14 +08:00 |
|
TermiNexus
|
19fca19ca7
|
refactor(tpv): get_llvm_type_bits 双副本收敛到 TSpec.SpecTypeBits
TypeSpec 新增 SpecTypeBits 作为「LLVMType → 整数位宽」块的唯一实现(对齐 SpecTypePtrLevel 的收拢先例);ExprGenBase/TypeGenErr 两份同码副本改为委托,TypeGenErr 补 TypeSpec 导入(无环)。
保留方法名与 self. 调用点:@t.NoVTable 静态绑定下 Mixin 内部大量 self.get_llvm_type_bits 依赖其存在,只换实现体不动签名。副本分叉会导致同一类型两处算出不同位宽的隐蔽不一致。
|
2026-09-11 23:14:51 +08:00 |
|
TermiNexus
|
41c5908c5e
|
refactor(tpv): Y 类兜底改 fail-fast(vpi 声明返回/形参 + vpi 类型文本)
新增 GenApi.fatal_error:VpiReader/Converter 等模块级函数无 self.Gen,统一经此报错通道;GenApi._g_gen 为空时回退 Generator._g_gen(Phase 1 vpi 生成早于 BuildPipeline 注入 GenApi._g_gen)。
VpiReader._inject_function_declare/_inject_method_declare 共 4 处:有注解却解析不出类型 → fatal;无注解的 i32 返回/i8* 形参合法默认保留。Converter._PyiTypeStr 未知节点类型不再静默写 int。
|
2026-09-11 22:46:39 +08:00 |
|
TermiNexus
|
db8220801c
|
refactor(tpv): Z 类兜底改 fail-fast(返回类型/模块级变量/枚举成员)
- ClassGenVTable 方法返回:有注解但解析失败即 fatal;State/CExport/CExtern 标记归一为 Void
- TranslatorGenMixin 模块级变量:有注解但解析失败即 fatal(保留无注解合法默认)
- ClassGenEnum._resolve_enum_member_type 4 处:Attribute 缺失名/Name 缺失 id/两处解析失败均改 fatal
(无注解与 t.State 标记的 i32 默认保留)
|
2026-09-11 22:17:45 +08:00 |
|
TermiNexus
|
cc3359faea
|
refactor(tpv): 形参类型注解解析失败改 fail-fast(不再静默用 i32)
- FuncGenDef 前向声明形参 / 定义签名形参:resolved is None 即 fatal
- FuncGenBase create_function 形参:同上(暴露调用方未传 trans 上下文)
- ClassGenVTable _translate_method 形参:同上(签名/调用点/实现体三方一致)
- TypeGenCDef 整数 CDefine 值缓冲分配失败改 fatal(对齐同文件浮点/字符串分支)
- FuncGenMixin._type_byte_size 类型缺失改 fatal(case _ 保留 8,注释说明无布局查询能力)
|
2026-09-11 22:14:10 +08:00 |
|
TermiNexus
|
22c71388d4
|
docs(tpv): 更新 TypeSpec 注释(IsPtrElement 已删,仅容器种类待后续)
|
2026-09-11 22:09:32 +08:00 |
|
TermiNexus
|
a4bc5dc0ce
|
refactor(tpv): 删除 IsPtrElement 字段,指针元素语义承载于 Spec.ElemBits
- TypeSpec 抽 _spec_clone(消除 SpecWithSign/Source/ElemBits 三处重复逐字段拷贝)
- 新增 SpecWithElemBits:覆盖元素槽位宽(独立副本不驻留,ElemBits 不在驻留键内)
- set_var_ptr_element 改写 Spec.ElemBits=64;Spec 不可承载(非指针/缺失)即 fail-fast
- 新增 var_is_ptr_element(PtrLevel>=1 且 Elem.Bits==8 且 ElemBits==64,排除真实 i64* 与纯 str)
- ExprGenName 4 处下标读写切读该入口;GenTypes 删 VarEntry.IsPtrElement
|
2026-09-11 22:09:18 +08:00 |
|
TermiNexus
|
e55ec5fde0
|
docs(tpv): 更新 TypeSpec 设计注释至 S4 现状(TypeStr/AnnotClassName 已删)
|
2026-09-11 22:06:20 +08:00 |
|
TermiNexus
|
9e461d21cb
|
refactor(tpv): 删除 AnnotClassName 字段,注解类名统一承载于 Spec.SourceName
- GenTypes 删 VarEntry.AnnotClassName / FieldEntry.AnnotClassName
- set_var_annot_class_name / add_field 改为写入 Spec(Spec 为 None 时建 TS_UNKNOWN 承载,
不表态具体类型,等价原 Spec 缺失);删 1b 的 AnnotClassName 专属深拷贝
- var_annot_class_name / get_field_annot_class_name 去旧字段回退分支
- 剩余 7 处直读(StmtGenCifMixin list/dict 5 处、CallGenMixin CPtr 2 处)改走封装
|
2026-09-11 22:06:00 +08:00 |
|
TermiNexus
|
95133d8483
|
refactor(tpv): 变量/字段注解类名读取统一走 Spec.SourceName 封装
- VarGenMixin 新增 var_annot_class_name(SourceName 优先,回退 AnnotClassName)
- 变量侧类名恢复与诊断读取切读:ExprGenAttr(5) / ExprGenOps(6) / ExprGenName(1)
/ CallGenDispatch(3) / CallGenCall / CallGenProp / CallGenVt / ExprGenCls / AssignGenMixin / MatchGenMixin
- ExprGenAttr 字段侧直读改走 get_field_annot_class_name
|
2026-09-11 22:02:28 +08:00 |
|
TermiNexus
|
8aad248c25
|
fix(tpv): SpecWithSign 不复制 SourceName,避免驻留表来源名污染
InternSpec 键不含 SourceName,若带来源名的副本入表,后续同键查找会把该来源名
污染给无关条目(键相同必须语义相同 ⇒ 表内实例 SourceName 恒为 None)
|
2026-09-11 21:54:29 +08:00 |
|
TermiNexus
|
029a423f55
|
feat(tpv): Spec 增 SourceName 承接注解来源名(类名块基础设施)
- TypeSpec 新增 SourceName 字段:注解书写形态名(裸名/模块限定名/t.XXX attr/mangled),
与 BaseName(LLVM 注册名)命名域不同;不参与驻留键,避免条目暴增与线性查找变慢
- 新增 SpecWithSource(独立副本、不驻留、幂等)/ SpecSourceName 读取入口 / _spec_set_source_name
- set_var_annot_class_name 与 add_field 注解侧填 SourceName
- get_field_annot_class_name 切读 SourceName 优先(3 个调用点自动生效)
|
2026-09-11 21:54:10 +08:00 |
|
TermiNexus
|
7028399366
|
refactor(tpv): 无符号判定切读 Spec(条目级 TS_UINT 优先)
- 新增 _entry_spec_unsigned:Spec.Kind==TS_UINT 为注解明确无符号的强信号
- _node_type_unsigned 的 Name/Subscript 分支、Attribute 字段分支切读 Spec 优先
- 只切无符号方向(TS_INT 含未表态,不可反推 SIGNED,仍走字符串真源)
|
2026-09-11 21:51:11 +08:00 |
|
TermiNexus
|
7fedf8daad
|
feat(tpv): Spec 注解侧填符号性(SpecWithSign + 变量/字段接入)
- TypeSpec 新增 SpecWithSign:整数 TS_INT↔TS_UINT 切换 + 驻留(SpecToText 键区分符号)
- set_var_annot_class_name 接入:注解类名提取符号性,补 Spec 无符号性
- add_field 接入:字段注解类名提取符号性,补 Spec 无符号性
|
2026-09-11 21:48:23 +08:00 |
|
TermiNexus
|
0a108e6289
|
refactor(tpv): 删除 FuncEntry.TypeStr 旧路径,函数类型文本改由 Spec 派生
- 删 FuncEntry.TypeStr 字段、_build_func_type_str 生产者、_check_func_spec_text 闸门
- update_global_func_typestr 改名 update_global_func_spec,仅填 Spec(去 pool 参数)
- ClassGenVTable vtable 合并 func_valid 分支,统一 SpecToLLVMText 派生
- 同步 FuncGenDef/ClassGenVTable/GenApi/VpiReader 调用点
|
2026-09-11 21:33:58 +08:00 |
|
TermiNexus
|
a173ba0296
|
refactor(tpv): ClassGenVTable vtable 类型文本切到 SpecToLLVMText
- 删除 _format_func_type_str(512 缓冲 + >100 参截断的 TypePrint 重复实现)
- _generate_vtable 当前类方法分支改为 SpecToLLVMText 派生,回退全局表 TypeStr
- Spec/TypeStr 皆失败时 fail-fast
|
2026-09-11 21:21:01 +08:00 |
|
TermiNexus
|
0e973d5f23
|
feat(tpv): SpecToLLVMText 格式化器与函数签名一致性闸门,并修驻留键静默截断
- SpecToLLVMText/_spec_llvm_text/_spec_llvm_append 逐分支对齐 llvmlite.TypePrint
- CallGenLeafKit.update_global_func_typestr 增 _check_func_spec_text 闸门,不一致即 fatal
- _spec_text_append 溢出返回哨兵;_spec_to_text 各结构分支检查哨兵
- SpecBaseText 前缀先算长度;InternSpec 键装不下返回完整实例不写截断键
|
2026-09-11 21:13:28 +08:00 |
|
TermiNexus
|
ff7caa57e8
|
feat(tpv): S3 条目双写接线,三个唯一创建点填 TypeSpec
- GenTypes: VarEntry / FieldEntry / FuncEntry 各加 Spec 字段(FuncEntry 合并为单个整签名 Spec,替代设计 D4 的 RetSpec+ParamSpecs,理由见注释)
- VarGenMixin: add_var 新增 _spec_of_var_alloca,用 alloca.Ty 的 pointee 构造 Spec(is_ptr_type 判定)
- StructGenMixin: add_field 统一在两条写入分支之后填 Spec(PermPool 驻留故无需 DeepCopyType)
- CallGenLeafKit: _register_global_func / add_func_to_table 初始化为 None;update_global_func_typestr 新增 _build_func_spec 填整签名 Spec(用 function_get_param_head 两遍遍历,变参取 func.IsVarArg,避免 SpecFromLLVMType 的 Func 分支丢变参)
- 注: 当前尚无读取方;驻留表溢出会导致该条目 Spec=None(已记录,S4 改 fatal)
|
2026-09-11 20:43:17 +08:00 |
|
TermiNexus
|
f0deff931d
|
refactor(tpv): S3 无符号判定切读真源,指针层级收拢到 TypeSpec
- ExprGenOps: _type_name_unsigned / _annot_str_unsigned 改为真源优先(UNSIGNED->1 / SIGNED->0),仅真源不表态 UNKNOWN 时按需回退旧子串路径(热路径避免双份开销)
- ExprGenOps: 删除 S2 的双写一致性闸门 _spec_sign_check(切读后读即取真源,比对恒等、无意义)
- TypeSpec: 新增 SpecTypePtrLevel -- 指针层级推导的唯一实现,原 get_ptr_level 记录的 match codegen 缺陷规避写法随实现移入
- ExprGenBase: get_ptr_level 删去同码副本,改为委托 TSpec.SpecTypePtrLevel(行为等价)
- TypeGenCType: spec_sign_of_annot 注释更新为无符号判定的读入口
- 注: 值级切读(读 Spec.PtrLevel)仍需条目双写(VarEntry.Spec / FieldEntry.Spec 等)接线,S2 路线 C 未做,留待下一步
|
2026-09-11 20:40:26 +08:00 |
|
TermiNexus
|
b7100e9dc1
|
feat(tpv): S2 落无符号判定双写闸门,并修 i8 拓宽丢符号与 WCHARPTR 旧判
- TypeSpec: 新增 SpecFromLLVMType(LLVM 类型 -> TypeSpec 结构转换器,当前无调用点);SpecSignFromTypeName 拆出零分配切片版 Span
- TypeGenCType: 新增 lookup_ctypedef_span 与独立符号性真源 spec_sign_of_annot(精确名白名单 + CTypedef 链逐层展开)
- ExprGenOps: 旧判定改名 *_legacy,外层加双写闸门 _spec_sign_check(新真源明确表态且不一致即 fatal;S2 不切读)
- ExprGenOps: 修旧符号性两个洞 -- 子串表补 WORD、裸别名沿 CTypedef 链展开(闸门实测暴露 WCHARPTR 旧判 signed、新真源 unsigned)
- ExprGenOps: should_zext_widen 的 i8 分支补「源注解明确有符号则 sext」例外,修 b8470c1 引入的 TypeCastTest 回归(t.CInt32T(v) 丢符号);新增 _node_type_signed
- TypeGenBase: 补 import lib.core.Gen.Type.TypeSpec(此前遗漏)并接入驻留表 ensure_spec_arena(PermPool 惰性创建)
- 修两条链接错误: TypeSpec.vp 残留 stdlib.atoi 改 string.atoi;模块别名与模块内类名同名会被误解析为该类静态方法(隐式补 self 实参),四处导入别名统一改 TSpec
|
2026-09-11 20:32:55 +08:00 |
|
TermiNexus
|
b1090abe70
|
feat(tpv): 新增 TypeSpec 统一类型描述符(S1,未接线)
类型信息目前散落在 AnnotClassName/IsPtrElement/TypeStr 等字符串与布尔里,
导致「无符号/指针层级/数组维度/函数签名」到处重复解析且结论不一致
(Debugger/_Type.md 二次盘点 A/C 类)。
新增 App/lib/core/Gen/Type/TypeSpec.vp 作为统一描述符:
- TypeSpec:Kind/Bits/IsSigned/PtrLevel/Elem/ArrayCount/BaseName/Ret/Params/
ParamCount/IsVarArg/Storage,以及元素语义三元组 ElemBits/IsElemPtr/
DerefBase(替代单一 IsPtrElement 布尔——同一 Ptr(i8) 下存在两种相反语义)
- TypeSpecArena 驻留表(对象持有,非全局表)+ InternSpec 去重(键=规范文本)
- SpecToText/TextToSpec 规范文本编解码(驻留键/日志/vpi 通道)
- 构造器 NewTypeSpec/NewTypeStruct/NewTypePtr/NewTypeArray/NewTypeFunc
- 访问器 SpecIsPtr/SpecPointedTo/SpecIsUnsigned/SpecBitWidth
- SpecSelfCheck 自检(不参与编译流程)
- 实例与数组一律 PermPool 分配(跨 mark 持久,跨模块可直接传指针)
GenTypes 仅加 import 使该模块参与编译(否则新文件不会被编译、无法验证);
未改动任何既有调用点,产物 IR 应与上一版一致。
|
2026-09-11 20:02:52 +08:00 |
|
TermiNexus
|
b8470c1cae
|
fix(tpv): 拓宽方向统一为单一真源,并修 TypeStr 变参与 should_zext_widen 缺参
三项独立缺陷(均来自类型系统盘点 _Type.md D7):
1) should_zext_widen 签名缺 trans 形参,函数体内的 trans 退化为隐式全局(恒
None),而 translate_binop 两处调用早已在传第 5 实参(被静默丢弃)⇒ 注释所
述「源无符号 → zext」补救从未生效:Name/Subscript 形态的无符号源(uint16/
uint32 变量、数组元素)在比较/二元路径恒被 sext 扩展(ide.vp/timer.vp 根因)。
修:should_zext_widen 补 trans 形参并明确为拓宽方向的单一真源;
translate_compare 两处补传 trans;ExprGenBase._zext_or_sext_val 改为委托
should_zext_widen(wide_val=None 使「宽侧常量」启发式自然失效)。
2) _translate_t_type_cast 原以「目标类型名符号性」决策整数拓宽,且 target_name
未知时默认 zext,与 coerce_to_type / should_zext_widen 的默认 sext 极性相反。
修:统一由源的符号性决定(与 coerce 同源),并删除已无使用点的 target_name
形参(1 处签名 + 7 处调用点)。
3) TypeStr 生成(FuncEntry.TypeStr 的唯一生产者)与其现算现用副本
(ClassGenVTable._format_func_type_str)都未打印变参后缀 ...,而 FuncGenDef
对 *args 会设 IsVarArg=1,且继承方法强制走 TypeStr 回退 ⇒ vtable 中的函数
指针类型与真实签名不符。修:按 llvmlite IR 打印规则补齐(有参 ", ...",
无参 "...")。
|
2026-09-11 19:57:18 +08:00 |
|
TermiNexus
|
c71642dca0
|
清理一部分异
|
2026-09-11 18:55:33 +08:00 |
|
TermiNexus
|
cfb92e5da5
|
初步清理 t. 类型异味
|
2026-09-11 18:36:32 +08:00 |
|
TermiNexus
|
4ce55e3ea3
|
fix(tpv): 泛型注解预特化下沉到 AnnAssign Handle 路径,修 .get() 误分派崩溃
translate_annassign 解析注解前未先注册泛型特化,`list[ast.AST | t.CPtr]
| t.CPtr` 会退化为裸 list*,随后 body_list.get(i) 被分派到默认
list[int].get(返回 i32)→ inttoptr 截断指针 → 读垃圾 AST 节点,
StmtGenMixin._translate_stmt_impl 崩溃(寄存器指纹与既有潜伏崩溃一致,
IR 实证见 Debugger/ViperOS3.md 第十九节)。
抽出 _prespecialize_generic_annotation 供 pre_scan_allocas 与
translate_annassign 共用(该补救原先只存在于预扫描路径),使两处解析一致。
同批(P1-A):赋值/返回路径把目标类型作为 target_ty 传入 translate_value,
使 `x: uint64 = 12345` 与 `u64(12345)` 物化出同一条 i64 常量、省去 coerce
的 zext。站点:translate_annassign(global/nonlocal/模块级/局部四处)、
translate_assign(单 Name 目标)、translate_return。target_ty 仅被
Constant 节点消费,不影响调用/二元/属性路径。
|
2026-09-11 18:10:19 +08:00 |
|
TermiNexus
|
d3690f9143
|
fix(tpv): 依赖注入期默认参数按定义模块 SHA1 登记,消除跨模块同名函数串味
N17:VpiReader 注入函数/方法 declare 时显式传入 src_sha1(被依赖模块自身
sha1),add_func_to_table 透传至 _register_global_defaults;调用点默认值查找
改用 find_func_entry_in_table_owned 按 "{owner_sha1}." 前缀限定。修复
usb.uhci.init 误命中 mm.init 的 5 形参/2 默认值而凭空补 2 个 i32 0 的 ABI
错位(IR 实证:call @...init(i16 %4, i32 0, i32 0) → (i16 %4))。
同轮并入的其他编译器侧改动:
- N11 Converter.vp:无 -> 但带 @c.CReturn 时合成 tuple 返回注解,与 define 对齐
- N12 VpiReader.vp:union 指针(T | t.CPtr)stub 解析与定义侧收敛到 i8*
- N14 ExprGenFstr.vp:f-string 32 位整型不再写 l 修饰符
- N2 撤回 ExprGenOps.vp:删除在 _node_type_unsigned 热点查/填 vpi 缓存的
_call_ret_annot_unsigned(有副作用,触发 fat32_diskio.vp match 路径崩溃)
|
2026-09-11 17:39:21 +08:00 |
|
TermiNexus
|
e66d9e3adb
|
fix(tpv): 修 N 系列 codegen 缺陷(常量位宽/无符号判定/实参扩宽/结构体取址)
- N1 ExprGenConst/CallGenDispatch: CONST_INT 按 target_ty 位宽物化, 修 uint64(0xFFFFFFFFFFFFFFFF) 被降 i32 再 zext
- N2 ExprGenOps: 新增 _call_ret_annot_unsigned 查被调方 vpi 返回注解, 修 uint32 返回值 >> 生成 ashr
- N3 TypeGenResolve: 联合注解提取跳过存储类限定宏, 修模块级全局 uint32 比较生成 sge/slt
- N5 CallGenLib: 常量实参按形参扩宽 + _coerce_args_to_def_params 支持 3 段方法调用
- N17 CallGenLeafKit/CallGenMixin: 默认值表按定义模块 sha1 限定 + 收紧交叉校验守卫
- N18 ExprGenBase/CallGenLib: rvalue 结构体实参落栈取址
|
2026-09-11 15:50:09 +08:00 |
|
TermiNexus
|
751fbccb29
|
feat(tpv): vtable 对象全局 storage 也按字段默认值折叠
补 f5ee178 未覆盖的 vtable 分支:抽出 _build_stg_struct_body_text,_build_stg_struct_init_text 改为其包装;vtable 分支以 start_idx=1 复用默认值折叠,字段默认值全零时回退原零值循环(元素个数语义不变)。
|
2026-09-11 15:29:43 +08:00 |
|
TermiNexus
|
f5ee178407
|
feat(tpv): 模块级对象全局按字段默认值生成 storage 初始化器
- 新增 _default_val_const_text:字段默认值 AST -> 常量文本(仅整型/字符/负号字面量可折叠,其余零值兜底)
- 新增 _build_stg_struct_init_text:按 StructEntry 字段默认值生成完整 struct 常量初始化器(LLVM 要求列全字段);无非零默认值返回 None
- storage 分支新增 elif:无 vtable 对象全局走默认值初始化器(vtable 路径不变)
- 效果:fat32.default_fs 的 .stg 由 zeroinitializer 变为含 sector_size=512/root_cluster=2/free_clusters=0xFFFFFFFF/backup_sector=6/winsect=-1 的完整常量;drive_lock 等零值等价场景保持 zeroinitializer
|
2026-09-11 14:52:29 +08:00 |
|
TermiNexus
|
e20a6f3d11
|
fix(tpv): 修 VKernel 暴露的 codegen 缺陷(浮点 CDefine/__sizeof__ packed/CONST_STR/alloca/无符号/ABI)
- 浮点 t.CDefine 初值序列化与源恢复(gfx PI 编成 0.0)
- __sizeof__ 按 packed 计算(cpu _tss memset 越界写 4B)
- 数组初始化器支持 CONST_STR 单字符;模块级别名不再产出 global i32 0 假全局
- 临时缓冲/构造临时量 alloca 提升至入口块(B6 未覆盖路径)
- 无符号判定补 CSizeT/小写别名/结构体字段 + udiv/urem + range 位宽与符号 + zext 扩展
- 跨模块 declare 形参按 vpi 定义侧收敛(修 _vpi_method_param_annot 拒绝 cls_name=None 导致 coerce 恒失效)
|
2026-09-11 14:26:54 +08:00 |
|
TermiNexus
|
bd46b47b22
|
docs(readme): 按事实重写 README, 反映自举已完成与真实源码结构
- 自举状态: 重写中 -> 已完成自主编译, TransPyC 明确为自举种子
- 目录结构: 全文 .py 名称纠正为真实 .vp 布局 (Phase/ Stub/ core/Gen/ 树, Gen 52 文件)
- 工程配置: project.json -> project.vpj; 产物路径 output/ -> .tpv_build/output/
- CLI 表补齐 --asan/--phase2command/--nowarn-register/--no-llvmpeephole/--detection/--show-args/--build-dir/--version
- 内存模型: 补常驻池 512 MiB 与 CompilerFactory 单例, 说明自举后 _mbuddy 需逐模块注入
- 规模数据改为实测值 (App 76 文件 64656 行 / Gen 52 文件 / Test 39 用例)
- 修复失效链接 wiki/01-overview.md
|
2026-09-10 22:33:23 +08:00 |
|
TermiNexus
|
a5260f4441
|
fix(tpv): ASan 运行库改由 project.vpj 声明; read_all 容量语义修正与超限源文件 fail-fast
- --asan: 移除 BuildPipeline 中硬编码的 clang64 libclang_rt 注入, 改由工程在 linker.static_libs / dynamic_libs / flags 中自行声明; 新增 Config.asan_runtime_declared(), main.vp 在未声明时 fail-fast 并列出所需运行库, 不再给含混的 undefined reference
- read_all: 容量参数含终止符(最多读 cap-1 字节), 故删除 12 处恒不可达的 else 截断兜底; 并在读取前按 f.size() fail-fast 拒绝超限源文件(main.vp / BuildPipeline / Phase1Main / Phase1Scan / Phase2), 避免静默截断后报出莫名其妙的语法错误
- project.vpj(根 / Test / NegativeTest / Sha1Test): linker.cmd 由裸 clang++ 改为绝对路径并补 -fuse-ld=lld
|
2026-09-10 22:33:18 +08:00 |
|
TermiNexus
|
76f03b5987
|
fix(tpv): 修模块级浮点全局零初始化、跨模块 CDefine 重导出、默认参数快照、typedef 诊断悬垂指针
- TranslatorGenMixin/AssignGenMixin: 模块级全局补 CONST_FLOAT 初始化分支。
此前无此分支 → init_kind 保持 0 → t.CDouble 全局一律退化成 zeroinitializer
(torch 的 LCG_A/LCG_M/_rng_state 全变 0 → _next_rand() 得 0.0/0.0 = NaN
→ Kaiming 初始化写入全 NaN 权重 → 推理 softmax 分母 NaN → 十个概率全为 0)。
浮点值不走 AST 的 float_val(会被 pool 操作覆写),改为按变量名从当前源文件
重读恢复;_recover_cdefine_float 泛化为 _recover_float_literal。
- ExprGenCdef: 跨模块 CDefine 重导出链支持绝对导入(from pkg.sub import *),
此前只认相对 from .X → vqt6 包(__init__.vp 用 from vqt6._types import *)
里的 CDefine 全查不到,报 "跨模块 CDefine 未找到: 'vqt6.QT_ALIGN_CENTER'";
相对导入基准改用"当前模块所属包"而非模块名本身,修正子模块 from .X 拼接
(对齐 CallGenBase._lookup_reexport_from_vpi 的包名口径)。
- CallGenLeafKit: 默认参数常量快照支持一元字面量(USub/UAdd/Invert 且操作数为
整型 Constant)。此前只认 Constant/Name → ex3: t.CInt = -1 这类默认值快照为空,
跨模块重建时报 "跨模块默认参数无法重建(快照缺失)"。其余形态仍保持 kinds=0,
重建时 fail-fast,不静默兜底。
- TypeGenCType/TypeGenResolve/TypeGenBase: builtins typedef 诊断串改为自有缓冲
副本(stdlib.malloc,clear_ctypedefs 释放)。调用方常传临时段缓冲,直接存指针
会悬垂,_build_ann_fail_msg 的 snprintf 读已释放内存(ASan heap-use-after-free)。
|
2026-09-10 14:22:02 +08:00 |
|
TermiNexus
|
adfd202218
|
feat(tpv): 支持 --no-llvmpeephole 关闭 llvmlite 本地窥孔(T2/T3)便于 IR 对比; 移除 project.json(改用 project.VPj)
|
2026-09-09 21:10:20 +08:00 |
|
TermiNexus
|
1d76280d0e
|
perf(tpv): find_func_in_table 两遍扫描合并为单遍
|
2026-09-09 10:38:34 +08:00 |
|
TermiNexus
|
bb9bb76653
|
fix(tpv-asm): c.Asm clobber 独立上限 ASM_MAX_CLOBBERS=32,修复 >16 项 clobber 截断致寄存器冲突崩溃
|
2026-09-09 10:38:34 +08:00 |
|
TermiNexus
|
7611d10072
|
fix(stubgen): CONST_STR 引号改用字符串字面量,修复 char 隐式转指针
|
2026-09-09 08:57:29 +08:00 |
|
TermiNexus
|
3e4f3b88b0
|
fix(tpv-class): lookup_field_by_class 识别 16hex 类键前缀为 sha1,修复 GSList[Param] 模块解析误报
|
2026-09-09 08:57:29 +08:00 |
|
TermiNexus
|
82558bd86b
|
fix(tpv-expr): list 内置内联按元素原型类 load,支持链式 get(0).method() 分派
|
2026-09-08 21:30:56 +08:00 |
|
TermiNexus
|
709c3570fb
|
fix(tpv-class): REnum 自引用字段注册后回填别名类型,修复 match 绑定变量退化为整数
|
2026-09-08 21:30:56 +08:00 |
|
TermiNexus
|
ab814f55e6
|
fix(tpv-call): 裸名调用同模块函数优先(owner_sha1),修复跨模块同名 stub 抢占致 _advance 误绑
|
2026-09-08 20:47:54 +08:00 |
|
TermiNexus
|
a260b9316d
|
style(stubgen): Converter.vp 去除 .vpi 类/函数定义后多余空行
|
2026-09-07 22:35:21 +08:00 |
|
TermiNexus
|
1146719de1
|
fix(generic): 泛型显式实例化 Box[t.CInt](v) 实参提取 Attribute 直读字段
TypeGenResolve._get_type_name_from_annotation 的 Attribute 分支改用 at.attr/at.value 直读:ast.attribute_get_attr 等跨模块访问器在 Phase A 阶段 text.ll 未生成时为 stub 无体返回 None → tn_raw 为空 → Box[t.CInt](v) 泛型类型实参提取失败 → 构造调用 func 名 '?' → RHS None(GenericTest4 main.vp:22 根因)。与 Name 分支 L53-55 同源;同时移除 CallGenCtor 残留 [EXTRACT-DBG] 诊断日志。
|
2026-09-07 22:11:05 +08:00 |
|
TermiNexus
|
4496738a24
|
fix(asm,irbuf): c.Asm 输出类型收集时缓存 + 大模块 IR 缓冲 1MB→8MB
1) c.Asm 输出操作数类型改为收集时直接从 alloca 缓存(单输出 scalar、多输出按序数组 out_ptys),不再依赖从 pool AsmOperand 槽二次读回 Value.Ty.Pointee。修 atom/__atomic_test_and_set 与 vrandom rdrand*_step:此前槽读回不稳定 → ret 静默 Void → 发射带名 void asm(llc 'instructions returning void cannot have a name')或报输出操作数类型缺失。2) 超大模块 IR 截断:ast/parser.vp 的 text.ll >1MB,Phase1(PHASE1_IR_SIZE)/Phase2(PHASE_A_IR_SIZE、PBP_IR_SIZE) 写缓冲与 StubMergerBuild 读缓冲(STUB_READ_BUF_SIZE) 均 1MB 单次截断 → 合并 IR 尾部丢字(opt 'end of file in global variable name');统一提到 8MB。
|
2026-09-07 22:06:26 +08:00 |
|
TermiNexus
|
bcedb15b23
|
fix(generic,rowptr): SlotsBugTest 编译修复——T.__sizeof__ 特化与 rowptr[sha1.Class] 注解解析
1) CallGenDispatch __sizeof__:指针包装判断(X|t.CPtr 联合与 rowptr[X])移到 dot-strip 之前。类型实参规范化名如 rowptr[7565e081d88517ac.AST] 内嵌 '.',strrchr('.') 会把括号内 .AST 剥成 'AST]',rowptr[ 前缀判断失配 → 落回把接收者 Name(T) 当实例翻译 → NameError 'T'(list[rowptr[AST]] 特化 list.__init__ 根因)。2) TypeGenResolve:a) 注解 Name 分支支持 '{16hex}.Class'(_norm_type_arg_name 产物,模块段即 SHA1)经 find_struct_by_module 直解;b) _parse_type_string 下标内层以数字开头(sha1 前缀类名)且单实参无嵌套/无逗号时手工拆 base+slice 递归解析——完整 lexer 会把 7565e081d88517ac 当数值误扫 → slice 变 Constant 占位 → 特化方法 append 参数 'item' 类型解析失败。3) CallGenMixin:泛型类模板缺失分支补内建下标 cast:(rowptr[list[int]])(x)/(t.CPtr[T])(x)/(t.CArray[i8,N])(x) 按 resolve_annotation_type 出类型后单参 _translate_t_type_cast,替代误报 '泛型类 rowptr 未找到模板'(ast/base.vp L392 根因)。
|
2026-09-07 19:36:57 +08:00 |
|
TermiNexus
|
41ed7176e9
|
fix(codegen): __sizeof__ 缺 rowptr[X] 指针尺寸分支,泛型特化 T.__sizeof__() 报未定义名称 'T'
list[rowptr[AST]] 特化翻译 list.__init__ 的 T.__sizeof__() 时,T 解析为新一代指针包装 rowptr[AST],尺寸表全部 miss 后落回把接收者 Name(T) 当实例翻译 → NameError: 未定义名称 'T'(SlotsBugTest ast 包 rowptr[list[rowptr[AST]]] 泛型特化根因)。在旧语法联合 X|t.CPtr → 8 分支旁补 rowptr[ 前缀 → 8(指针大小),与联合类型口径对齐。
|
2026-09-07 15:31:18 +08:00 |
|
TermiNexus
|
ed373a3ef2
|
基线重置,修复了一些 bug
|
2026-09-07 14:46:48 +08:00 |
|
TermiNexus
|
6b368b46a7
|
feat(tpv): App 与 TPVAppBK 新代版本对齐(rowptr 配套实现全套)
把 TransPyV/App 覆盖为 TPVAppBK 内容(39 文件):6 参注册式 _BuildReachableSha1Set 全套(StubMergerBuild/Store/Collect/__init__/IncludesScanner/Phase1Scan 等)、CallGen 与 TypeGenResolve 等新代实现。配套根 includes 为 rowptr 工作区(另有 includes_rowptr_bk 备份)。
|
2026-09-05 14:13:03 +08:00 |
|
TermiNexus
|
c35246f426
|
fix(phase1): 旧 5 参 def 前补全量 includes 预注册(1a-pre),修复'无法构建 SHA1 映射'
178ea40 重构把全量 includes 扫描/注册(PopulateSha1MapStore + 逐文件 import 依赖 PopulateIncludesDeps)从 Phase1Main 移除,依赖注册式 def 在 BFS 中自行登记。改用旧 5 参只读 def(调用点同步改回 5 参)后 store 无预注册 → _BuildIncludesSha1Map 返回 0 → '无法构建 SHA1 映射' 终止。
按 ab0f37e 1a-pre 模式补回:scan_includes 全量扫描 → PopulateSha1MapStore 登记 store → 逐文件 declare_only=2 解析 import 依赖(含 _inject_auto_container_visibility)→ PopulateIncludesDeps(文件级 mark/reset 防 OOM)。_BuildReachableResult 增加 reachable_set/count 过滤,result 只保留可达 includes 子集(1a/1b 只翻译可达文件)。
|
2026-09-05 12:56:10 +08:00 |
|
TermiNexus
|
50d53d3ce6
|
fix(link): 补 CallGenLib._promote_clib_call_args 定义;BuildPipeline PYI_BUF_SIZE 改 t.CDefine 宏
CallGenMixin.translate_call 调用 self.Gen.CallGenLib._promote_clib_call_args(B3 裸名 C 库函数第三参 i64 提升),但 CallGenLib 缺该方法 → ld.lld undefined symbol。按 TPVAppBK 旧语法移植完整方法。
PYI_BUF_SIZE 是跨模块共享裸全局(@PYI_BUF_SIZE),Phase1/__init__ 与 BuildPipeline 两模块各定义强符号 → duplicate symbol。BuildPipeline 侧改用 t.CDefine 宏(同 SRC_BUF_SIZE),不再产生全局。
|
2026-09-05 12:48:03 +08:00 |
|
TermiNexus
|
8dda9f7c2d
|
feat(linker): TPV 支持 project.vpj linker.dynamic_libs 动态链接 .dll/.so(Config 解析+绝对路径解析+链接命令合并 static/dynamic,Viper str+= 拼接改用 snprintf)
|
2026-09-01 22:01:20 +08:00 |
|
TermiNexus
|
75db09e18a
|
fix(call): 跨模块返回类型解析兜底修复——star import 候选验证失败时先验证原模块(stdlib.malloc extern def 不再误归 stdint);包模块 vpi 未命中时经 reexport 定位定义模块查返回注解(fltk.Fl_Input_value 返回 str 不再退化 i32)
|
2026-09-01 21:23:12 +08:00 |
|
TermiNexus
|
131f3a9a4d
|
fix(phase1): 移除 [CYCBREAK] 临时诊断 printf
|
2026-09-01 21:07:24 +08:00 |
|
TermiNexus
|
178ea401b7
|
fix(phase1): 含 class 定义的 includes 模块强制翻译,修复增量编译跨模块类构造 find_struct_by_module 落空(fltk.Fl_Window 返回类型 fail-fast)
|
2026-09-01 21:06:31 +08:00 |
|
TermiNexus
|
c7c37e1007
|
fix(call): star import 再导出改为多候选验证定义模块
- _lookup_reexport_from_vpi:from X import * 累积全部候选(空格分隔),不遇首个星行即返回
- CallGenMixin:按候选逐个验证 is_cexport_func/_is_state_func_from_vpi 确认定义模块(Fl_init_all→_cfl)
- 修复 fltk/__init__ 依次 from _types/_enums/_cfl import * 时定位到首个模块(_types)的误判
|
2026-09-01 20:39:19 +08:00 |
|
TermiNexus
|
60deee1d17
|
fix(call): _lookup_reexport_from_vpi 支持 star import 再导出定位
- from X import * 的 re-export(如 fltk/__init__ 再导出 _cfl 全部 extern FFI)此前无法定位定义模块
- fltk.Fl_init_all 被误加 SHA1 前缀走 mangled 精确解析 → extern def 无 define → fail-fast
- 命中后由 is_cexport_func/_is_state_func_from_vpi 二次校验裸名
|
2026-09-01 20:26:14 +08:00 |
|
TermiNexus
|
29667672e4
|
feat(linker): TPV 支持 project.vpj 静态链接 .a/.obj
- Config.vp 新增 LinkerStaticLibs(读取 linker.static_libs 数组并基于 project_dir 解析绝对路径)
- BuildPipeline link_obj_to_exe/link_objs_to_exe/run_pipeline 支持 static_libs(位于 .obj 之后、-l 之前)
- main.vp/Phase2.RunMultiFileProject 全链传递 linker_static_libs
|
2026-09-01 20:15:26 +08:00 |
|
TermiNexus
|
9b46e1da78
|
fix(compiler): for x in ptr/数组 实现解引用为空终止(指针/浮点元素支持 + 数组长度上限+NULL终止)
|
2026-08-30 08:37:39 +08:00 |
|
TermiNexus
|
d14415a4e6
|
fix(compiler): asm 约束映射补全 8 位寄存器 clobber(AL/AH/BL/BH/CL/CH/DL/DH)
|
2026-08-30 08:12:44 +08:00 |
|
TermiNexus
|
a0d6dced00
|
fix(compiler): va_arg 截断回目标宽度(%d 高位垃圾)+ 比较按无符号类型选 ULT/ULT/UGT/UGE
|
2026-08-30 07:54:24 +08:00 |
|
TermiNexus
|
4db68ff5c4
|
fix(compiler): 修复模块级全局初始化数据丢失(-1 与字符数组全 0)
|
2026-08-30 07:27:40 +08:00 |
|
TermiNexus
|
23e7f5b1fb
|
fix(compiler): storage vtable 初始化改完整 struct 初始化器(LLVM 拒绝部分初始化)
llc 报 initializer has wrong # elements。__vtable__ 字段(索引 0)= i8* @vtable,其余用户字段按类型生成零值(Ptr→null/Int→0/Float→0.0/Array→zeroinitializer),列全 FieldCount 字段。
|
2026-08-29 18:46:18 +08:00 |
|
TermiNexus
|
fa4c69f95d
|
fix(compiler): storage 对象类全局初始化 vtable 首字段(@t.CVTable)
storage 方案 @g.stg 全零初始化 → @t.CVTable 模块级全局对象 vtable=0 → 用户程序入口虚调用 call [vtable+0x10] 跳 0x0 #PF(HelloWorld 启动即崩)。@g.stg 初始值改为 { i8* @Class.vtable }(首字段 vtable 地址,其余零),无 vtable 的 @t.Object 保持 zeroinitializer。
|
2026-08-29 18:39:28 +08:00 |
|
TermiNexus
|
c2b9a26c62
|
fix(tpv): vpi 注入完整类型定义 + list elem_size + 路径修复,清理临时诊断
- VpiReader: 值 struct 全局/数组元素/函数返回类型注册完整定义,修复 llc use of undefined type;vpi 注入类后补 add_field 字段表(LARGE_INTEGER.QuadPart 恒 0 根因)
- TypeGenResolve: list[str](pool, elem_size) 语义修复(参数个数误当 elem_size,Mat4 崩溃根因);t/c 内置命名空间 Subscript 特判
- Config: _join_path 防双份路径
- GenApi: 新增 add_field 代理
- 移除 DBG-VK/PHASEADBG/GAP-DIAG/DBG-EMP 临时诊断
|
2026-08-29 17:27:29 +08:00 |
|
TermiNexus
|
1fe7878074
|
fix(compiler): 对象类模块级全局改静态 BSS storage,修复页 0 混叠与栈悬垂
对象类全局(裸类名注解)此前编译为 NULL 指针,实例建在栈 alloca 后悬垂,对象字段落在物理页 0(IVT+BDA 混叠),导致 VKernel devfs/fat32/sched 全部对象失效。新增 @g.stg 静态 storage(BSS),@g 编译期指向它;赋值/构造点(translate_assign/translate_annassign 全局分支)检测 storage 后绑定引用并复制对象,消除 NULL 与悬垂。
|
2026-08-29 17:27:21 +08:00 |
|
TermiNexus
|
2b2c242d14
|
fix(tpv): extern declare 返回类型含真实类型时不再误归 Void + 白名单兜底
vpi 注入 extern declare 时 has_state→Void 无条件触发:注解 HANDLE | t.State(FindFirstFileA/GetStdHandle)被归为 void → declare 返回 void,运行期 FindFirstFileA 句柄丢失 → 文件存在性判断失效(文件实际存在但报不存在)。修复:仅纯标记注解归 Void;含真实类型但解析 miss 时回退外部函数返回类型白名单(FindFirstFileA/GetStdHandle→i8*),GenApi 新增 infer_external_func_ret_ty 委托。
|
2026-08-29 12:03:12 +08:00 |
|
TermiNexus
|
efc8f7948f
|
fix(tpv): void 函数 return <expr> 丢弃值 + ret void(llc ret i32 vs define void)
GenApi.add_global_name 声明 -> None 但 body 为 return g.TranslatorGen.add_global_name(...)(委托返回 i32)→ translate_return 对带值 return 直接 build_ret(val) 生成 ret i32,与 define void 冲突 → llc 'value doesn't match function result type void'。修复:函数返回类型为 void 时 return <expr> 仅求值丢弃 + ret void(Python 语义)。
|
2026-08-29 11:12:23 +08:00 |
|
TermiNexus
|
b7eeb504ee
|
fix(tpv): 空类 FieldCount=0 中和重建 + 移除 [ATTR]/[DET] 调试打印
1) WIN32_FIND_DATAA 等空类(FieldCount=0)字段访问:模块限定路径补 FC==0 容忍(返回 None 交 pending,对齐裸名路径);ClassGenDef 空类不再 pending 延迟(多遍死锁),改为中和旧 entry 走完整注册重建。2) 用户要求移除 [ATTR](FuncGenBase/FuncGenDef)与 [DET](CallGenCtor)无条件调试打印。3) 拓宽 [DBG-REG]/[DBG-ADDF] 过滤器到 WIN32_FIND_DATAA 定位空类注册来源。
|
2026-08-29 10:44:43 +08:00 |
|
TermiNexus
|
a99db2a29b
|
fix(tpv): REnum 变体引用作值返回 tag 常量 + kind() 注解兜底
1) 表达式中的 REnumClass.Variant 无括号引用(llvmlite.LLVMType.Struct)此前未处理 → 与 kind() 返回的 i32 tag 比较时条件翻译失败(TranslatorGenMixin L517 根因)。仿枚举成员访问,translate_attribute 增加变体引用 → tag 常量。2) kind() 特殊处理在运行时类型退化(联合 i8*)时无法识别 REnum 类,补变量注解类名兜底。
|
2026-08-29 10:28:39 +08:00 |
|
TermiNexus
|
58d61badcb
|
fix(tpv): 跨模块调用返回类型解析支持 import 别名(GenApi.translate_printf_call)
模块限定调用 GenApi.translate_printf_call 的 mod_ret_sha1 用 LookupSha1ByModName(别名) 查不到 → None → 误走裸名外部函数路径 fatal_if_unknown=1 fail-fast 误杀。改经 _resolve_module_sha1(LookupModNameByAlias 别名还原 → 精确/后缀)解析,与 L620-629 模块归属校验的既有模式一致。
|
2026-08-29 10:14:32 +08:00 |
|
TermiNexus
|
8d0241e0c3
|
fix(tpv): lookup_field_by_class 模块限定路径补 REnum 变体字段别名回退
llvmlite.LLVMType.Pointee 等模块限定 REnum 字段访问:类命中(FieldCount=4)但变体字段名(_p1/_p2 槽位别名)不是普通字段,此前变体别名回退只在裸名路径,模块限定路径 fatal 先触发永远走不到(CallGenDispatch L1005 根因)。在模块限定路径字段未找到时补 _lookup_renum_field_alias 回退,与裸名路径一致。同时移除已定位完成的 REEXPORT-DBG 临时诊断。
|
2026-08-29 10:03:10 +08:00 |
|
TermiNexus
|
9af7b2ead4
|
fix(tpv): from . import Y 跳过包目录名 SHA1 校验(无 __init__.vp 目录包)
from . import CallGenBase(CallGenCall.vp L12)解析后 resolved 是包目录名 lib.core.Gen.Call——无 __init__.vp 的目录包也允许这样导入,目录本身不是模块文件、无 SHA1,对它做 _check_import_sha1 恒失败误报。真实目标子模块 pkg.Y 由下方 LookupSha1ByModName/本地兄弟文件分支逐个校验,此处跳过包级校验即可。
|
2026-08-29 09:48:42 +08:00 |
|
TermiNexus
|
d3bdfd5205
|
fix(tpv): 修复包重导出两个前置判定 bug(level 判定 + __init__ 后缀偏移)
1) 相对导入判定改 sifr.level>0:parser 把前导点存 level,module 字段不含点,原 sifr_mod[0]=='.' 恒假,走绝对分支查不到 ast.exprs,sub_sha1=None 重导出被跳过。2) __init__ 判定改 strstr:原 strcmp(rel_path+len-9) 对 ast/__init__.vp 指向 init__.vp 恒不匹配,is_pkg=0。两 bug 叠加致包重导出从未触发,ast.Attribute 未注册(AssignGenMixin L46 fail-fast 根因)。
|
2026-08-29 09:32:12 +08:00 |
|
TermiNexus
|
25363120f8
|
debug(tpv): 临时诊断定位 ast.Attribute 包重导出失败根因(REEXPORT-DBG)
|
2026-08-29 09:15:33 +08:00 |
|
TermiNexus
|
99ddff2d87
|
fix(tpv): t.CArray/t.CPtr 下标元素解析失败改为返回 None 交多遍收敛
阶段2 删 map_t_type stdint 硬编码后,UINT 等 typedef 仅经 CTypedef 动态表解析;Phase 1a(declare_only=1)无 vpi 注入,依赖 typedef 的类(zhuff_code)被跳过,导致 t.CArray[zhuff_code, N] 元素解析被误 fatal 中断编译(zhuff.vp L19 根因)。与裸名 CArray 路径及 ClassGenDef 字段 pending 机制保持一致,真实类型错误由 Phase A 收敛检查暴露。
|
2026-08-29 09:01:42 +08:00 |
|
TermiNexus
|
0a84ca8db3
|
debug(tpv): 临时诊断定位 SECURITY_ATTRIBUTES 空类注册来源
- register_struct/add_field 打印 [DBG-EMP](SECURITY_ATTRIBUTES 过滤)
- ClassGenDef 空类报错改为 pending + 打印(定位期间不中断编译)
- 定位后移除
|
2026-08-29 08:42:26 +08:00 |
|
TermiNexus
|
7b81e3c7cf
|
fix(tpv): vpi 注入不再注册空类(FieldCount=0)——避免阻塞源模块真实定义
- vpi 存根不含类字段(只序列化 class 名 + def 签名),_inject_class_struct_declare
的 field_count 恒为 0 → 注册空类
- 空类在源模块编译时被 find_struct_by_module 命中 → "结构体已注册但字段数为0"
InternalCompilerError(win32base.SECURITY_ATTRIBUTES 根因)
- field_count==0 时不注册:依赖已编译命中真实类(L1604-1608),未编译走
_deps_pending 多遍收敛
|
2026-08-29 08:20:26 +08:00 |
|
TermiNexus
|
6540e27844
|
fix(tpv): translate_attribute 读路径字段未找到时标记 _deps_pending
- fileio.vp li.QuadPart 报错:LARGE_INTEGER(win32base)未编译时只有 vpi
空 stub,读路径字段查找失败未标记 pending → 直接 fatal 中断多遍收敛
- 读路径对齐写路径:字段未找到 → 标记 trans._deps_pending=1 下遍重译
|
2026-08-29 08:14:25 +08:00 |
|
TermiNexus
|
20ba8e0297
|
fix(tpv): 字段访问依赖未就绪时标记 _deps_pending 而非 fail-fast
- subprocess.vp sa.nLength 报错根因:SECURITY_ATTRIBUTES 定义侧(win32base)
未编译时只有 vpi stub 空类(FieldCount=0),lookup_field_by_class 裸名
回退命中空 stub → 字段未找到 → fatal_error 中断多遍收敛
- lookup_field_by_class:期望 sha1 未匹配且命中 FieldCount==0 空 stub →
返回 None(不 fatal),交给上层 pending
- get_attribute_ptr 写路径:字段未找到 → 标记 trans._deps_pending=1 下遍
重译(对齐读路径/AssignGenMixin L1793),真实错误由 Phase A 收敛检查暴露
|
2026-08-29 07:46:15 +08:00 |
|