Commit Graph
415 Commits
Author SHA1 Message Date
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