Commit Graph
100 Commits
Author SHA1 Message Date
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
TermiNexus 0b0cf5ba66 refactor(tpv): _parse_type_string 用 Expression 注解访问 body(源头修正后简化)
- ast.parse_expression 返回注解已改为 Expression | t.CPtr(includes/ast),
  expr_node 直接以 Expression 注解声明,去掉强转与 kind 检查
2026-08-29 07:26:12 +08:00
TermiNexus f75a4d795a fix(tpv): _parse_type_string 的 expr_node.body 修正——Expression 包装强转访问
- parse_expression 返回 Expression 节点,body 是 Expression 类字段
  (stmts.vp),ast.AST 基类无 body 字段(仅 children)
- 原注解 ast.AST 直接访问 expr_node.body 类型错误;补 kind 检查 +
  (ast.Expression) 强转后访问
2026-08-29 07:23:13 +08:00
TermiNexus 9e72393a11 fix(tpv): ExprGenName 三处 LLVMType.Int8() 模式修正为 Int(bits)+bits==8
- LLVMType 是 REnum,整数变体统一为 Int(Bits 字段),无 Int8 变体;
  Int8 仅是模块级工厂函数(返回 Int(8)),LLVMType.Int8 类成员不存在
- case llvmlite.LLVMType.Int8(): 永不匹配 → T|t.CPtr 退化 i8* 的
  8 字节步长 GEP 特判静默失效(走 i8 1 字节步长,指针截断)
- 三处(L858/1049/1087)改为 case Int(bits) + bits==8
2026-08-29 07:19:36 +08:00
TermiNexus ec4fb0bcf8 refactor(tpv): ClassGenVTable 的 self._mangle_name 统一为 self.Gen.FuncGenBase 显式调用
- 继承链 ClassGenVTable→ClassGenBase(无父类)不含 FuncGenBase,
  5 处 self._mangle_name 沿 MRO 解析不到定义(依赖编译器兜底)
- 统一为 self.Gen.FuncGenBase._mangle_name(对齐项目其他 Mixin 写法)
2026-08-29 07:16:43 +08:00
TermiNexus 98efd9b1d2 fix(tpv): __sizeof__ 模块限定类按模块归属匹配,防跨模块同名类误匹配
- w32.win32base.SECURITY_ATTRIBUTES.__sizeof__() 仅取 attr 丢失模块前缀,
  get_struct_type 裸名全局匹配误命中跨模块同名类(FieldCount=0)
- Attribute 形式保留完整模块路径(w32.win32base.SECURITY_ATTRIBUTES),
  结构体查找先按模块归属 find_struct_by_module 精确匹配,miss 再裸名
2026-08-29 07:06:11 +08:00
TermiNexus 8a69719acf fix(tpv): 裸名 typedef 强转改 resolve_typedef_or_map 统一口径(BYTEPTR 等)
- 阶段2 删除 map_t_type 的 stdint 别名后,BYTEPTR(x) 裸名 typedef 强转
  判定 map_t_type 返回 None → 误走外部函数路径 fail-fast
  (string.vp L104 TypeError 根因)
- 裸名 typedef call(BYTEPTR/HANDLE/size_t 等)改经 resolve_typedef_or_map:
  CTypedef 动态表优先 + t/c 核心 map_t_type 兜底,所有 CTypedef/t 库类型
  call 恢复强转语义
2026-08-29 06:22:30 +08:00
TermiNexus fa90586a83 refactor(tpv): 类型系统收敛——正常库分析优先,t/c 库内部特判兜底
- 阶段1a:Name 分支 from-import 别名反查(from t import CInt as XXX 可解析,
  支撑 YYY: t.CTypedef = XXX 复杂别名链)
- 阶段1b:Attribute 路径 CTypedef 动态表优先(stdint.INT 走库定义)
- 阶段2:map_t_type 删除与 stdint.vp 重复的 ~70 个硬编码别名(保留 t/c 核心
  原语 + float/double + HANDLE/LPCSTR/LPCWSTR),新增 resolve_typedef_or_map/
  get_type_size_bytes 统一口径 + GenApi 委托,改造 VpiReader/ClassGenEnum/
  TypeGenErr 旁路调用点
- 阶段3:__sizeof__/REnum 尺寸/无符号名单三张派生表加 CTypedef 动态兜底
2026-08-29 06:15:00 +08:00
TermiNexus 2610f361fd fix(tpv): 泛型特化名分裂——嵌套泛型实参递归 SHA1 规范化(_Type.md 问题 7)
- _norm_type_arg_name 顶层 '|' 分割改括号感知(list[A|B] 不再误分)
- 新增嵌套泛型实参递归:list[list[AST]] → list[list[{sha1}.AST]],
  内部按顶层 ',' 分割逐个 SHA1 规范化
- 所有 module 表示统一为 Hash Namespace({SHA1}.Class),消除跨模块
  特化名分裂(undefined symbol)
2026-08-29 05:51:49 +08:00
TermiNexus 4415f1f38b fix(tpv): 窄化截断加常量溢出诊断(_Type.md 问题 8)
- coerce_to_type 宽→窄 trunc 前检测编译期常量正溢出目标位宽无符号
  范围 → fatal_error(OverflowError),消除 buf[idx] = 0x1FF 类静默截断
- 负常量按模 2^bits 语义放行(-1 → 0xFF 合法);非常量运行时窄化保留
  trunc(值域可能安全,无法静态判定)
2026-08-29 05:48:15 +08:00
TermiNexus 4748915472 fix(tpv): 外部函数返回类型不可收敛时 fail-fast,豁免 from-import 与多层模块限定调用
- _infer_external_func_ret_ty 白名单未命中改为 fatal_error(Python 风格
  traceback),移除默认 i32 的 WARN 输出
- 裸名调用 fail-fast 前查 from_imports 可解析性:from-import 函数走
  mangled 精确解析收敛(SSAValue 场景),纯外部 C 函数才 fail-fast
- mod_ret_sha1 解析支持多层模块路径(w32.win32file.CreatePipe 场景),
  避免嵌套模块限定调用被误判为裸名外部函数
- 移除 FuncGenBase/StructGenMixin 遗留调试输出
2026-08-29 05:46:25 +08:00
TermiNexus 5551db3432 fix(tpv): try_extract_callable_ret 调用多传第 6 个参数(签名仅 5 参数)
- ab0f37e 引入:误加尾参 0(疑为 depth 参数),签名实为 (pool, annot, imported_modules, from_imports, trans)

- 删除多余参数,恢复 5 参数调用
2026-08-28 15:35:28 +08:00
TermiNexus 85e7011b6c refactor(tpv): INTPTR/UINTPTR 去硬编码,依赖 stdint.vp CTypedef 声明
- map_t_type 删除 INTPTR/UINTPTR = Ptr(i32) 硬编码(与 stdint.vp L10/L14 声明重复)

- INTPTR = t.CInt|t.CPtr、UINTPTR = UINT|t.CPtr 由 CTypedef 动态查表解析(L1377 先于 map_t_type 兜底)

- stdint.vp 成为单一事实源;语义不变(INTPTR 是 int* 历史命名,非 C 标准 intptr_t 整数)
2026-08-28 15:33:45 +08:00
TermiNexus 8445af93d2 fix(tpv): 泛型污染检测改 token 边界匹配(根治 strstr 误杀合法特化)
- _list.vp L57 elem_ptr: T | t.CPtr 在 list[AST|t.CPtr] 特化时被误报污染:strstr('e9dfb296a8674aee.AST|t.CPtr', 'T') 把 AST 内部字符 T 当参数名

- 新增 _str_contains_ident:独立标识符检测(两侧非字母/数字/_),实参内部字符不算污染

- T→T 完全自映射仍直接报错(明确污染);子串场景按边界判定
2026-08-28 15:06:30 +08:00
TermiNexus 27ba74c720 fix(tpv): REnum 别名表去指针化(class 槽位改 perm_pool 字符串 + strcmp 内容比较)
- _register_renum_field_alias: class_name strcpy 到 perm_pool,去重检查改 strcmp

- _lookup_renum_field_alias/_lookup_renum_field_alias_ty/_lookup_renum_member_ty: 指针值比较改 strcmp 内容比较

- 删除 _update_renum_alias_class_ptr 及调用点(去指针化后无需指针统一)

- 根治 'LLVMType 字段 Pointee 未找到' 反复报错(注册 AST 指针 vs 查找 entry.Name 池拷贝指针恒不等)
2026-08-28 15:00:50 +08:00
TermiNexus a8eb7fe5fe fix(tpv): 类型静默退化改编译期报错 + 统一整数拓宽 zext/sext
- FuncGenDef: 有返回注解但解析失败 → fatal_error(不再静默回退 i32;无注解函数保留 i32 默认)

- TypeGenResolve: 泛型类型实参污染(T→T 自映射 / 实参含类型参数名)→ fatal_error(不再 return None 静默退化)

- ExprGenBase: coerce_to_type 窄→宽接入 _zext_or_sext_val(i1/i8 默认 zext、无符号类型名 zext、否则 sext),修正 t.CUInt32T 等无符号值被符号扩展的隐蔽数据损坏
2026-08-28 14:57:46 +08:00
TermiNexus 24ae2dc966 refactor(tpv): 删除 Handles 目录,核心逻辑合并进 Gen
- 新建 Gen/Translator.vp:Translator 类 + Mixin + 常量 + _mbuddy 自 HandlesTranslator 迁入(删 7 个委托壳与 _g_gen)

- GenApi 下沉 7 个 global/nonlocal 管理委托(add/is_global_name、add/is_nonlocal_name、get_nonlocal_type/index、clear_scope_names)+ update_global_func_typestr

- CallGenLeafKit 并入 ExprCallHandle 类,NewExprCallHandle 改本地引用

- 删除 Handles/HandlesExpr/ExprCallTable/HandlesBase(60+ 委托零消费者/纯委托壳)与 Handles 目录整体

- 全 App 56 文件 import 改指 lib.core.Gen.*,清理死 import,委托调用改 GenApi,main/BuildPipeline _g_gen 注入删除
2026-08-28 14:29:25 +08:00
TermiNexus d99b6268de refactor(tpv): Gen 目录按前缀分组迁移子目录 + REnum.kind() 编译期转 __tag
- Gen/*.vp 按前缀分组迁入 Call/Class/Expr/Func/Stmt/Type 子目录,import 同步更新(BuildPipeline/Generator/StructGenMixin 等)

- CallGenDispatch: REnum.kind() 前置拦截 → bitcast i32* + load(读 __tag),杜绝方法查找兜底误绑 AST.kind(this 偏移语义错误)

- 留根:Assign/Async/Base/Imports/Match/Struct/Translator/Var 单文件前缀 + GenApi/GenTypes/Generator/__init__
2026-08-28 14:16:03 +08:00
TermiNexus b3a4be21d3 feat(tpv): VLogger 迁移 f-string + 模块限定构造 SHA1 解析 + 包重导出别名注册
- VLogger 全面改用栈 f-string 传参,移除 fmtbuffer 静态缓冲(Phase1Scan/Config/Converter/StubMergerStore/StubMergerTopo/ClassGenDef/StmtGenDeclMixin/CallGenCtor 等)

- CallGenMixin: Module.Class(...) 按模块名解析 SHA1 精确命中类(Scene3D 跨模块同名根因);import X as Y 别名三级还原(精确→后缀→LookupModNameByAlias)

- CallGenCtor: lookup_field_by_class 传 kw 节点与 from_imports;REnum 错误 f-string 化;新增 [DET] ctor 入口 can 核对

- StructGenMixin/GenApi/VpiReader: 包重导出类以包 sha1 注册别名 entry(ast.Attribute 归属错位)

- main: 版本号更新、VLogger API(get_logger→init_logger/logger)、新增 --show-args/--build-dir

- TypeGenCType: 移除 CDEF-MISS 调试日志;.gitignore 忽略 output_dbg/
2026-08-28 13:29:26 +08:00
TermiNexus 19171ee165 feat(tpv): vpi 预生成失败输出失败文件路径与原因(含 AST 解析错误行列) 2026-08-28 08:05:46 +08:00
TermiNexus 6daec5fa58 feat(tpv): translate_unaryop 支持单目 * / &(Deref/AddrOf) 2026-08-28 07:35:03 +08:00
TermiNexus d971bae7cd 移除了 VLogger fmt buffer 缓冲区,使用栈 f-string 2026-08-28 06:01:17 +08:00
TermiNexus 54462320d2 简化了一些表达,最后仍使用 fb 缓冲区的版本(新版本使用 栈f-string) 2026-08-28 04:50:09 +08:00
TermiNexus c542442987 fix(structgen): 裸名回退字段未找到时返回 None 而非 fatal_error,让 REnum 变体别名回退生效
- ce62546 新增的裸名回退分支在类命中但字段未找到时 fatal_error,
  截断了 ExprGenAttr L853-864 的 REnum 变体别名回退(LLVMType.Pointee
  → _p2 槽位是变体别名非普通字段)→ AssignGenMixin.vp:1002
  "类 llvmlite.LLVMType 裸名回退但字段 Pointee 未找到"
- 改为字段未找到 return None,对齐主 SHA1 匹配分支语义,让调用方
  有机会走 REnum 别名/继承链回退
2026-08-27 16:16:03 +08:00
TermiNexus ce62546e90 fix(structgen): lookup_field_by_class 模块归属未命中回退裸名同名类(唯一时),修复 ast.Attribute 归属错位误报
- 场景:ast.Attribute(ast/exprs.vp 定义,ModuleSha1=c0def010dcebadb1)经
  lookup_field_by_class 模块归属解析,模块段 "ast" 走包名回退 → ast/__init__.vp
  的 sha1 (35245c385b0ddd7b)→ find_struct_by_module 不匹配 → 误报
  "类 ast.Attribute 未找到"(AssignGenMixin.is_cdefine_annotation 的 at.attr 触发)
- 修复:模块可解析但类未注册时,统计裸名同名类数量,唯一时回退查找字段
  (Attribute 短名无跨模块同名,安全);多同名仍 fail-fast(防 sched.Thread 顶掉)
2026-08-27 16:10:48 +08:00
TermiNexus 907f7892f9 fix(callgen): 跨模块返回类型解析的 mod_ret_sha1 显式初始化 None,修复裸名调用读栈残留崩溃
- CallGenMixin.translate_call 中 mod_ret_sha1 原声明在 Attribute 分支内、
  elif mod_ret_sha1 is not None 在外层读取,裸名调用(cl.func 是 Name,
  如 LLVMModuleCore.CreateGlobalInt 内裸名 create_global_int)时该 alloca
  从未 store,读到栈残留垃圾(0x1)→ _LookupMethodRetTyFromTextLL 的
  strlen(0x1) 零页访问(llvmlite/__init__.vp 翻译时 0xC0000005)
- 前移声明并显式初始化为 None,裸名调用不再进入跨模块返回类型解析
2026-08-27 15:52:09 +08:00
TermiNexus c54e87bd6d fix(imports): from . import Y 的 Y 是包内符号(非子模块)时跳过 SHA1 校验
- translate_import_from_module 对 from . import Y 曾无条件把每个 name 拼成
  resolved.Y 当子模块校验 SHA1 → json/__parser.vp 的 from . import JsonValue
  等符号(json/__init__.vp 定义)被误报"模块 json.JsonValue 未注册 SHA1"
- 仅在完整名已注册 SHA1(真子模块)或本地文件时才校验+登记;符号映射
  由 translate_import_from_names 的 from-import / re-export 处理
- 顺带:Reexport 懒初始化改用 CompilerFactory.factory.PermPool(配合 TPC
  跨模块全局写端修复)
2026-08-27 14:27:24 +08:00
TermiNexus a603736f64 修正:直接操作操作跨模块变量(VLogger),避免间接 global 函数 2026-08-27 13:14:39 +08:00
TermiNexus ab0f37e1a8 更新,可自举 2026-08-27 09:48:20 +08:00
TermiNexus 07db560510 fix(gen): 裸名回退时 malloc/calloc/realloc/alloc/alloc_buf 的 size 参数按 i64 提升——desktop 第 4 次 mm.malloc 返回值被破坏收到 0x0、用户 App vpsdk malloc 同理 2026-08-27 00:55:52 +08:00
TermiNexus f185241a71 fix(gen): translate_subscript 支持 Slice 切片表达式(a[start:end])——此前返回 None 导致函数实参被丢弃(create_process(path[n:],entry) 丢 name、entry 错位 → p.entry 垃圾 → 用户进程 iretq 垃圾地址 PF) 2026-08-27 00:45:22 +08:00
TermiNexus ee6d78bbb1 fix(structgen): lookup_field SHA1 隔离改用 strncmp 前 16 字符比较,消除 stdlib.free 对 pool 子块的 bad-free(ASAN) 2026-08-26 23:58:07 +08:00
TermiNexus cc9112b54a fix(structgen): lookup_field SHA1 隔离临时缓冲改用 stdlib.malloc(lookup_field 无 pool 参数)并补 free 2026-08-26 23:54:22 +08:00
TermiNexus ad1089d9af fix(structgen): lookup_field 名称回退按类型 SHA1 精确隔离,禁止 strstr 裸名跨模块抓同名类(sched.Thread 被 vthreading.Thread 顶掉 → th.arg 索引错成 func(3) → 线程 call 0 #UD) 2026-08-26 23:52:37 +08:00
TermiNexus ec48b315d3 debug(structgen): add_field 打印每字段名+索引,确认 Thread.arg 是否漏注册或字段名悬空 2026-08-26 23:45:13 +08:00
TermiNexus d082bb3996 debug(exprgenattr): 字段查找 arg/func 时打印 attr/类型/索引/实际字段名,定位 Thread.arg 索引错解析成 func(3) 根因 2026-08-26 23:40:22 +08:00
TermiNexus d8286295d1 fix(callgen): 外部函数返回类型白名单补 malloc→i8*,修复跨模块裸名 @malloc 调用返回类型推断为 i32 截断 64 位指针(uhci frame list / desktop bg_row_buf 判 None 根因) 2026-08-26 22:56:35 +08:00
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