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
|
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
|
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
|
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
|
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
|
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
|
01b45c0630
|
修正了 import 路径,修正了部分代码谬误
|
2026-08-22 02:29:08 +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
|
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
|
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 |
|