Commit Graph
100 Commits
Author SHA1 Message Date
TermiNexus d0736b4978 修正了目录 2026-08-22 02:07:49 +08:00
TermiNexus e18609e184 feat(tpv): 支持 coro.Coroutine = c.Addr(task()) 就地解读句柄赋值
- c.Addr(Call) 分支:求值存临时槽(entry alloca)返回槽地址,
  供 coerce 指针→结构体 load 就地解读(Coroutine={__ptr__} 8 字节)
- 协程登记扩展:c.Addr(async_call) 也登记 _coro_var_async
- 新增 _coro_frame_ptr_from_arg 统一提取帧指针:pointee 是 Struct
  (Coroutine 变量,translate_value 返回 alloca 地址)GEP __ptr__ load,
  普通指针 bitcast 直通;5 处拦截函数(run/destroy/exception/msg/gather)替换
2026-08-22 01:55:54 +08:00
TermiNexus 609635c73e fix(tpv): 帧池访问改 Value 视图 + ConstNull 补 name 参数
- GlobalVariable 非 Value 子类,create/destroy 直接 build_load/store
  按 Value 布局读字段错位(Ty 读到 void、Name 为空)→ 生成
  "load i64, void" 非法 IR;改构造 SSAValue(Ty=Ptr(i64), Name="@coro_pool_<n>") 视图
- ConstNull 签名 (pool, ty, name),6 处漏传 name → v.Name=None →
  "store i8* (None), i8**" 非法 IR;全部补 "null"
2026-08-22 01:25:12 +08:00
TermiNexus 82a86761b9 feat(tpv): 语言内协程 M1-M7 移植——async/await 状态机 + 异常传播 + 帧池
- M1: async def -> 帧结构体 + create_/resume_ 状态机 + coro.coro_run 内联
- M2: async 参数、嵌套 await 提升 __await_N、If/While 内 await
- M3: For 内 await(range->While)、coro_sleep 轮询挂起、coro_destroy 回池
- M4: raise 存码、await 子帧异常传播、coro_exception、coro_gather
- M5/M6: try/except 链式匹配 + as e 绑定 + 异常类型码
- M7: try/finally、异常消息 msg 槽、自定义异常类、帧池复用
2026-08-22 00:34:32 +08:00
TermiNexus f0a70748d7 fix(match): default case body 的 dbody 类型推断退化 list[int] 截断指针
dbody = dmc.children(普通赋值)触发 TPC 对跨模块属性访问
ast.MatchCase.children 的 RHS 类型推断,失败时静默退化为 list[int],
dbody.get() 被编译成 list[int].get(返回 i32),AST 节点指针被截断为
0x0000c1120bd0 → translate_stmt 读 vtable 崩溃(EnumTest RENUM match ASan)。

与 case body 循环(body_list 用带注解 AnnAssign,类型稳定正确)对照,
default 块改用带注解的 AnnAssign 中转(dbody2)保持
list[ast.AST | t.CPtr] 类型。三处同型修复(_handle_renum_match /
_handle_sequence_match / _handle_tuple_match)。
2026-08-21 08:46:45 +08:00
TermiNexus 426bff7daa fix(gen): 补回拆分时丢失的 6 个常量(枚举/泛型/vtable/元数据)
- ENUM_MEMBER_MAX_LOCAL/RENUM_CLASS_MAX/RENUM_VARIANT_PER_CLASS/RENUM_ALIAS_MAX 补回 ClassGenEnum
  (未定义名在常量上下文折叠为 0 → 枚举成员收集被静默禁用 → register_enum 永不调用
  → EnumTable 恒空 → `OpKind.Add` 裸名 NameError,includes/ast/base.vp L241 根因)
- SPEC_CACHE_MAX 补回 ClassGenGeneric(原 HandlesClassDef 定义)
- VTBL_METHOD_MAX 补回 ClassGenVTable
- META_MAX/META_KEY_LEN 补回 ClassGenBase
2026-08-21 06:58:47 +08:00
TermiNexus 89995dffde refactor(gen): 去除 Handles 委托层——链式化 + GenTypes/GenApi 迁移
- Gen 内部 1742 处 HandlesX.func() 改 self.Gen.Y.method() 链式调用
- 数据类/常量迁移 GenTypes.vp(10 类 + CLASS_META_*/META_*/SEQ_KIND_*/FIELD_MAX 等)
- 管线/保留文件经 GenApi.vp 模块级入口(48 函数带类型注解,从 Gen 方法签名自动生成)
- 删除 26 个纯委托 Handles 文件,仅留 5 个实体文件(Base/Translator/Expr/ExprCall/ExprCallTable)
- 修复字段分裂:TypeGenErr CurrentFile/TraceCount 链式化;CallGenBase TempDir/Cexport 真源化
2026-08-21 06:32:40 +08:00
TermiNexus ca1453c0ec refactor(tpv): set_asan_mode 移除改直接赋 _asan_mode bool;ClassGenEnum 加 Renum 字段 0xb0 崩溃定位临时诊断(定位后移除) 2026-08-21 01:37:51 +08:00
TermiNexus 0e48190ba9 chore(tpv): 清理过时注释——run_llc_parallel 步进说明、追加89 -> None 说明、Gen 模块迁移说明 2026-08-21 01:37:46 +08:00
TermiNexus a088f21bce fix(BuildPipeline): run_llc_parallel 分批步进错误,修复 llc 线程 join 误报 600 秒超时
batch_start 改用 range(task_count)(步进 1)后,后续批次 join 循环 handles.get(batch_start+j) 取到上一批已 CloseHandle 的句柄 → WaitForSingleObject 返回 WAIT_FAILED(-1) 立即返回 → 误报 llc 线程 join 超时/失败(实际未到 600 秒)。

修复:for batch_start in range(0, task_count, max_threads) 保持原分批语义(步进 max_threads)。
2026-08-21 01:05:07 +08:00
TermiNexus f7f3bbac02 fix(TVP): get_class_name_by_type strstr 回退改后缀匹配,修复链式方法调用类名解析
特化类型名 SHA1.GSList[Param] 被 strstr 子串回退错误命中基础名 GSList → GSList.append 查找失败 → 兄弟 Mixin 兜底误匹配 LinkedNode.append(this 前移 sizeof(LinkedNode)=-48)→ 写穿 GSList 容器前 48 字节 → LLvmLiteTest Test 3 崩溃(function_add_param/function_add_block/block_append_line 链式调用根因)。

后缀匹配(SHA1.ClassName 尾部)比 strstr 子串匹配安全,保留精确匹配路径。
2026-08-20 16:45:27 +08:00
TermiNexus 9e6e76fcab fix(gen): 兄弟 Mixin this 调整改用模块级 HandlesClassDef._get_type_size
765702b 用 self._get_type_size(定义在 ClassGenEnumMixin)跨 Mixin 调用按 self 类型解析失败 → 链接 undefined symbol: CallGenCall._get_type_size。改为 HandlesClassDef._get_type_size(模块级函数,_field_byte_offset 同源用法)。
2026-08-20 11:54:39 +08:00
TermiNexus 765702bb5f fix(gen): this-adjust 补兄弟 Mixin 分支——BaseB 内调 BaseA.helper 前移 sizeof(BaseA)
兄弟 Mixin 兜底(086e792)找到 BaseA.helper 后,this 调整在 BaseB 中查不到 BaseA 首字段'a'走 fail-fast(NoVTableCrossMixinTest BaseB.caller 根因)。对齐 TPC _adjust_this_for_inherited_method 的 sibling 分支:this 前移 -sizeof(定义类 struct),使 BaseA.helper 按自身布局读 self 字段。
2026-08-20 11:35:35 +08:00
TermiNexus 086e792b30 fix(gen): 兄弟 Mixin 兜底过滤泛型特化类名——防误绑定 list 特化函数
Config.vp Load_project_config 的 root.__getitem__(JsonValue 方法)在 found_func 未命中时被兄弟兜底遍历 struct 表误绑定到 list[ASTptr].__getitem__(泛型特化函数在模块中存在),this 按 list 布局前移 sizeof(list) → 运行期读 -1 崩溃。兜底现仅对不含 '[' 的普通类名生效,对齐 TPC 侧 class_methods 校验语义。
2026-08-20 11:14:26 +08:00
TermiNexus 184d84b10b fix(gen): 修正 CallGenCall 类体首行注释缩进 2026-08-20 10:41:31 +08:00
TermiNexus d9a5dfac58 chore(gen): 清理 CallGen 拆分残留的重复方法注释块
拆分重构时方法注释头被复制两份(32 处),纯删除 302 行注释,代码零改动。
2026-08-20 10:40:09 +08:00
TermiNexus 898a5c2624 fix(gen): 兄弟 Mixin 方法兜底——MRO 链外按 struct 表查定义类
方法不在本类 MRO 链(如 BaseB 内 self.helper() 调兄弟 BaseA.helper)时遍历已注册 struct 表找定义类方法,与 TPC HandlesExprCall 行为一致;this 由 _adjust_this_for_inherited_method 前移。
2026-08-20 10:28:34 +08:00
TermiNexus 7ba3c74411 fix(gen): StmtGenCifMixin 补 ExprCallBase import(迁移 If/For 方法体引用)
TPC 编译报 "跨模块调用 'ExprCallBase.find_func_in_module' 找不到模块 SHA1":
If/For/While 迁移进 StmtGenCifMixin 的方法体引用 ExprCallBase.find_func_in_module
(原 ForHandleIter _handle_oop_iter 等),但该 Mixin 原本未 import ExprCallBase。
已用脚本扫描 Gen/Handles 全部 .vp 交叉核对 import,其余迁移文件无遗漏。
2026-08-20 09:33:01 +08:00
TermiNexus 12e8d6bdf8 fix(stub): vpi 全局注入补全 src_sha1 mangling——修复 a42923c 笔误致空名全局
a42923c 声称"注入名带 src_sha1 前缀",但实际把 new_global_variable 的
gname_v 写成未定义变量 gv_name_m(mangle 逻辑从未实现)→ 注入空名
"@ = external global %MemBuddy*" → llc "expected top-level entity"
(SlotsBugTest 回归)。

修复:_inject_global_variable_declare 签名加 src_sha1,计算 mangled 名
"<sha1>.<name>"(对齐定义端 5f7a873 与查找端 from-import 三方一致),
去重与创建均用 mangled 名;调用点传 ParseVpiIntoModule 的 src_sha1。
2026-08-20 08:06:12 +08:00
TermiNexus 281d26915c fix(gen): 分派改回 Handles 委托壳——NoVTable 同链跨类 self 调用仍 mangle 失败
bootstrap 链接报 undefined symbol: StmtGenDeclMixin.translate_return/if/while/for。
实测 Viper NoVTable 静态绑定下,StmtGenMixin 调父链(StmtGenDeclMixin→StmtGenCifMixin)
方法仍 mangle 成 StmtGenDeclMixin 前缀符号(定义却在 StmtGenCifMixin),同继承链
也不可靠。分派统一改经 Handles 委托壳桥回 gen 单例;HandlesReturn 补 translate_return 壳。
2026-08-20 07:02:43 +08:00
TermiNexus 9f396f4874 refactor(gen): 完成 P6 机械化迁移——Handler 类并入 Gen Mixin,语句实现单层化
- 10 个 Handler 类主方法迁入 Gen:Assign/AnnAssign/AugAssign→AssignGenMixin,
  If/While/For/Return→StmtGenCifMixin,Match→新建 MatchGenMixin(注册 Generator MRO),
  Imports→ImportsGenMixin;方法体 self.Trans→trans,签名加 trans 首参
- 分派改:StmtGenMixin.translate_stmt 同链 self.translate_xxx + 跨链经 Handles 委托壳
  (NoVTable 静态绑定约束);ExprCall 分派改走 ExprCallCall 壳
- 清理:HandlesTranslator 删 11 个 Handler 字段与 _init_state 创建段;
  StmtGenCifMixin 删 5 个 NewXxxHandle 工厂;main/BuildPipeline 补 HandlesAssign._g_gen 注入
- 委托壳保留:跨 Mixin 桥(Assign/AnnAssign/AugAssign/Match/Imports)待编译器缺陷修复后删
2026-08-20 06:40:37 +08:00
TermiNexus e07ea491a5 chore(gen): 全量备份——Handles 委托壳瘦身与单例注入统一
- 删除 Handles 各模块已迁移至 Gen 的旧函数体,保留一行委托壳(25 文件 -798 行)
- main.vp / BuildPipeline.vp 全局单例注入改为 _g_gen 直接赋值
- 机械化迁移测试前的基线备份
2026-08-20 05:33:59 +08:00
TermiNexus a42923cf25 fix(stub): vpi 注入全局变量声明带源模块 SHA1 前缀
"跨模块全局变量 _op_head 类型未知(stub 未注入)" 根因:VpiReader
_inject_global_variable_declare 从 vpi(源码级裸名)注入依赖全局声明时用
短名 @_op_head,而 5f7a873 后定义端已是 @<tokens_sha1>._op_head →
from-import 精确查找(带前缀)在翻译时找不到 → fail-fast 误杀
(函数注入 _inject_function_declare 早已带 src_sha1 mangling,全局漏做)。

修复:_inject_global_variable_declare 注入名用 src_sha1 前缀 mangle
(对齐定义端与查找端三方一致),调用点传 ParseVpiIntoModule 已提取的
src_sha1;去重改按 mangled 名匹配。

另:ExprGenName from-import 全局未注入时由 fail-fast 改为 _deps_pending
(依赖 vpi 按文件序未就绪属 Phase A 收敛正常态,真实错误由收敛检查暴露)。
2026-08-20 05:11:25 +08:00
TermiNexus 601db9e265 fix(gen): from-import 模块名截断后再查 SHA1(非 NUL 结尾退化裸名)
undefined symbol: _op_head 根因:lookup_from_import 返回指向 from_imports
内部的指针(非 NUL 结尾,后随空格分隔的其他条目,如 "ast.tokens
TokenType:ast.tokens ...")。ExprGenName 的 from-import 全局查找直接用
该值 LookupSha1ByModName → 整串查不到 → _mangle_name_with_sha1(None)
退化裸名 → 引用 @_op_head 而非 @<tokens_sha1>._op_head → 链接 undefined
(tokens 定义端已带 SHA1 前缀)。ExprGenAttr 别名解析同病。

修复:ExprGenName 新增 _cut_from_import_mod(截断到空格/冒号/NUL),
两处 from-import 分支截断后再查 SHA1;ExprGenAttr 别名解析内联截断。
对齐 CallGenBase._lookup_sha1_from_modname_raw / ExprGenCdef 既有截断逻辑。
2026-08-20 05:01:21 +08:00
TermiNexus 99df2aef99 fix(gen): 全局变量引用加引号(SHA1 前缀名以数字开头)
llc "expected instruction opcode" 根因:模块级全局带 SHA1 前缀后名以
数字开头("sha1.name"),LLVM 无引号标识符不能以数字开头。stub/text
打印端早已按 _ll_name_needs_quote 加引号,但引用端(make_global_ref /
_find_pool_var 兜底 / 定义端 ref_name)一律 @%s 无引号 → 组合 IR 指令里
store i32 0, i32* @748d0424e8976fa0._pass_count 解析失败。

修复三处引用生成按 _vtable_name_needs_quote(数字开头或含 .)加引号,
对齐函数引用路径(ExprGenName/FuncGenMixin 的 needs_quote 判断)。
组合 IR 去重(_HasGlobalInBuf 等)按打印格式名匹配,带引号一致无需改。
2026-08-20 04:42:20 +08:00
TermiNexus 252d15ba9f fix(gen): 模块属性访问支持别名解析(import X as Y → Y._attr)
直接写 GenGenerator._g_gen = gen(别名模块属性)此前不可用:
_resolve_module_attribute_global 未解析别名,_lookup_module_sha1
("GenGenerator") 查不到(Sha1Store 用原始模块名)→ 退化裸名 →
全局带 SHA1 前缀后 undefined symbol。

修复:查目标模块 SHA1 前经 from_imports 解析别名(lookup_from_import
返回原始模块名 lib.core.Gen.Generator)。别名属性写与 setter 调用等价
(写同一 @<模块sha1>._g_gen),且更高效(无函数调用/链接依赖)。
2026-08-20 04:37:50 +08:00
TermiNexus 5f7a87341a fix(gen): 模块级全局变量命名带 SHA1 前缀,消除 ld.lld duplicate symbol
多个模块声明同名模块级全局(如 _mbuddy)时全部生成裸名强定义(zeroinit)
→ 链接时 ld.lld duplicate symbol: _mbuddy(大量 warning)。函数名早已
mangled,全局变量漏做。

修复(对齐函数名 _mangle_name,SymTab key 保持裸名查找逻辑零改动):
1. 定义端 TranslatorGenMixin:全局名 = {模块sha1}.{变量名}
2. 模块属性访问 ExprGenAttr:按目标模块 SHA1 前缀精确查找/创建(含嵌套
   模块 w32.xxx 与 t 类型对象裸名 linkonce_odr 特例),引用用完整名
3. from-import 全局 ExprGenName:带源模块 SHA1 前缀查找,引用用完整名
4. _find_pool_var 兜底:linkonce_odr + zeroinitializer 定义(每模块独立,
   不再依赖裸名链接合并共享;运行时未初始化则真实崩溃暴露,不掩盖)
2026-08-20 04:31:39 +08:00
TermiNexus cf6c917e83 fix(gen): 泛型特化类记录触发文件,作废重译正确重置 MethodsEmitted
ld.lld undefined symbol list[ast.ClassDef|t.CPtr].* 根因:Phase A _deps_pending
作废重译时 reset_module_methods_emitted 按当前文件 sha1 精确匹配,特化类
ModuleSha1=模板 sha1(方法名带模板前缀)匹配不到,MethodsEmitted 残留 1
→ 下遍 _specialize_generic_class 补译分支(==0 才补译)跳过 → text.ll 只有
call 无 define → 链接失败。

修复:StructEntry 新增 SpecTriggerSha1(特化类触发文件 sha1),
_specialize_generic_class 全部返回路径经 _record_spec_trigger 记录,
reset_module_methods_emitted 按 ModuleSha1 或 SpecTriggerSha1 匹配重置。
2026-08-20 04:04:40 +08:00
TermiNexus b68ae16639 fix(stubmerger): 依赖 worklist 去重,修复 64KB 溢出(app_deps 与 BFS 展开均无去重,公共模块重复累积导致溢出;三处逐模块词边界去重,溢出检查保留作防线) 2026-08-20 03:11:48 +08:00
TermiNexus b08a0aff48 perf(phase2): 缓存 BuildCombinedIR 全目录扫描结果
Phase B 编译 .obj 慢得像同步编译的根因:BuildCombinedIR 对每个源文件
调用一次 _collect_stub_sha1s 递归扫描 temp_dir 全部切片子目录(90 文件
× 全目录枚举 O(N×S)),且目录扫描与 llc 并行无关(llc 并行已生效)。

按 temp_dir 缓存扫描结果(StubMerger._stub_scan_cache_*,stdlib 分配
跨 reset 存活),首次扫描后复用,temp_dir 变化时自动重建。BuildCombinedIR
的所有调用点(Phase B 主循环/Phase B+ includes 编译/stubgen)统一受益。
2026-08-20 01:15:05 +08:00
TermiNexus efc0e47058 chore(gen): 移除 [DBG-ANNOT]/[LLC-DBG] 调试插桩
EdgeCaseTest/MultiInheritTest 已修复验证,清理 e770fef/dc5bb21/0d2e912
遗留的调试输出:TypeGenResolve.vp resolve_annotation_type 的 [DBG-ANNOT]
(含多余 import stdio),BuildPipeline.vp llc 并行路径的 [LLC-DBG]/
[LLC-DBG2](10 处 region debug-point)。
2026-08-20 00:50:18 +08:00
TermiNexus 8947c5c5ee fix(gen): 多继承 this-adjust 对无字段父类跳过字节调整(对齐 TPC,Vec2Extra 误报未注册修复) 2026-08-20 00:31:33 +08:00
TermiNexus e770fef0f7 fix(gen): 恢复 ClassGenBase 基类别名解析(_resolve_base_alias)
ClassGenMixin 拆分(47ac2dd)时 _resolve_base_alias 丢失:_get_parent_class
/_collect_parents 不再解析 from-import 别名基类(from t import CStruct as cs
→ class CsPoint(cs)),'cs' 被当真实父类 → find_struct('cs') 失败 → 类 defer
永不注册 → 变量注解解析失败(EdgeCaseTest Test12 回归)。恢复
_resolve_base_alias 并在两处调用;_collect_parents 增 trans 参数透传(别名
解析需 from_imports)。TypeGenResolve 增 [DBG-ANNOT] 插桩待验证后移除。
2026-08-20 00:05:32 +08:00
TermiNexus dc5bb2111b fix(phase2): 句柄数组改回 list[str] 显式 elem_size=8
插桩确认 list[t.CPtr] 构造正常(pool 有效 elem=8 data 有效)但 append
仍读零页崩溃(list[ptr] append 的 store/参数类型生成待查)。改用全库
验证稳定的 list[str](str=bytes=i8*,显式 elem_size=8 走 else 分支),
append(t.CPtr(th.handle)) / t.CPtr(get(j)) 显式转换,join/close 对句柄
操作不变。保留 [LLC-DBG2] 构造状态插桩。
2026-08-19 23:12:33 +08:00
TermiNexus 0d2e9124d9 debug(phase2): 打印 list[ptr] 构造后内部状态定位 append 崩溃
崩溃仍在 list[ptr].append 的 pool.alloc(0xf8→0x128 偏移变化说明
elem_size 修复生效),需区分 __pool__ 未初始化(__init__ 未调/写错位)
与 MemBuddy 内部损坏。新增 [LLC-DBG2] 打印 pool/count/cap/elem/data。
2026-08-19 23:01:48 +08:00
TermiNexus 0faf44e179 refactor(phase2): 句柄数组改回 list[t.CPtr]
TPC 已根修 list[t.CPtr] 特化(_resolve_generic_slice_type 保留 t.CPtr
带前缀 + mangled 名统一 'ptr'),不再需要 list[str] 绕开。句柄数组
方案保留:start() 后立即取 handle,join/close 直接对句柄操作。
2026-08-19 22:44:21 +08:00
TermiNexus 0810f9f9e8 fix(phase2): llc 线程 join 改用句柄数组替代 Thread 对象存取
插桩证实 list[vthreading.Thread|t.CPtr] 的 get(0)/get(1) 返回同一
对象指针(栈对象地址复用),j=0 的 close() 把 handle 置 NULL 后 j=1
的 join 用 NULL 句柄 → WaitForSingleObject 立即 WAIT_FAILED → alive=0
→ e5fb 线程句柄从未被 join(失败槽 Result=-1 误报)。改为 start()
后立即取出 handle 存入 list[t.CPtr](8 字节指针存取稳定),join/close
直接对句柄 WaitForSingleObject/CloseHandle,不再依赖 Thread 对象存续;
join 索引用全局 batch_start+j(handles 跨批次累积)。
2026-08-19 22:19:33 +08:00
TermiNexus 88778dc422 debug(phase2): join 前打印 th 指针/handle/started 定位 join 立即返回
ClassArrayTest join(0) 已正常等待 edd8(645e8e0 生效),但 join(1) 仍
立即返回 alive=0 且 e5fb Result=-1(worker 未写 Result)。新增
[LLC-DBG2] 插桩打印 th_j 指针/handle/started,区分句柄无效(存取错)
与 e5fb 线程已死两种可能。
2026-08-19 22:10:11 +08:00
TermiNexus 645e8e0fbf fix(phase2): llc 线程数组元素类型改为指针 Thread|t.CPtr
list[vthreading.Thread] 的 store/load 类型不一致:append 存 8 字节
(th 指针,elem_ptr 降级 i8*),get 却按 Thread 结构体返回槽地址
(HandlesExprAttr._infer_element_struct_class 推断元素类)→ th_j 是
list 数据槽地址,join 把对象地址当线程句柄 → WaitForSingleObject
立即 WAIT_FAILED → alive=0 → 误报 llc 失败(4bd254a 只修了槽间距,
未修类型不一致)。改为 list[vthreading.Thread | t.CPtr](与已稳定的
list[ast.AST | t.CPtr] 同理),store/load 均为 8 字节指针,
join/is_alive/close 拿到真实线程句柄。
2026-08-19 22:03:22 +08:00
TermiNexus 3f3e3d5898 fix(phase2): _run_cmd_wait 清零 STARTUPINFOA 等结构体
TPV 的 T() 构造仅 alloca 不 memset(无 __init__ 时只 InitStructDefaults,
extern 结构体无默认值记录 → no-op)。_run_cmd_wait 的 si 只设 cb,
dwFlags 等 15 个字段为栈垃圾:多线程并发调用时垃圾值随机,dwFlags
垃圾位令 CreateProcessA 使用垃圾句柄作子进程 stdio → 子进程行为不定
/父进程线程崩溃(ClassArrayTest e5fb worker 崩、edd8 正常的概率崩溃
根因,70c8810 引入 _run_cmd_wait 时即存在)。si/sa/pi 全部显式清零。
2026-08-19 21:50:56 +08:00
TermiNexus 4bd254a27f fix(phase2): llc 并行线程数组修复 list 元素间距与容量越界
1b5246f 引入 list[Thread] 时误把 max_threads 当作 list 构造的
容量参数传入,实际第二参数是 elem_size=16 → 槽间距 16 字节远小于
Thread 结构体大小,set(j, th) 元素重叠覆盖(get 返回混合垃圾对象);
且 list 初始容量仅 8,batch>8 时 set(8..15) 无容量检查越界写堆 →
llc 全部成功后随机 ACCESS_VIOLATION(ClassArrayTest 崩溃根因,ASAN
构建下更早触发)。改为不传 elem_size(默认取 T.__sizeof__())+
append 自动扩容(8→16→32 覆盖 LLC_MAX_THREADS=16 批量)。
2026-08-19 21:36:26 +08:00
TermiNexus 42aa90c1af fix(gen): translate_c_deref 支持转换链包裹推断指针目标
对齐 TPC HandlesSpecialCall._infer_deref_target_type 增强:
1. 新增 _IsTypeExpr/_IsCastWrappingDeref 模块级辅助,判定
   c.Deref 是否处于类型转换链包裹(如 (T | t.CPtr)(t.CPtr(c.Deref(p))))
2. translate_c_deref 推断条件从仅直接 RHS 扩展为直接 RHS 或
   转换链包裹 Deref,新增 dref_is_ptr 允许指针目标推断
   (bitcast 后 load 8 字节),修复 llc 并行线程数组 list[Thread]
   之外仍受 i8* 退化的场景(1b5246f 只绕开了一处)
2026-08-19 21:19:38 +08:00
TermiNexus 1b5246f29f fix(phase2): llc 并行线程数组改用 list[Thread]
c.Deref 对 i8* 无法推断加载类型时只读 1 字节(旧编译器),th_ptrs 存
Thread* 后 join/is_alive 拿到垃圾句柄立即失败——llc 并行"5 秒误报失败"
的直接原因(ClassArrayTest 2 模块并发必现)。改 list[Thread] 保类型,
get 返回明确类型,不再依赖 Deref 推断。含 [LLC-DBG] 插桩,验证后移除。
2026-08-19 21:14:20 +08:00
TermiNexus c68eb22052 debug(phase2): 细化插桩区分 CreateProcessA 卡点与 join 等待行为 2026-08-19 21:03:47 +08:00
TermiNexus 70c88107ce fix(phase2): llc worker 改用 CreateProcessA 替代 system,修 asan 并发挂起
插桩证实:ClassArrayTest 固定 llc 失败是 e5fb16127bce8f68 的 worker 卡在
stdlib.system() 内(LLC2 未打印,Result 保持 -1)。Python 复现 os.system
并发无问题,差异仅剩 asan 构建环境——Windows asan 的 RTL allocator hook
经 CreateProcess 启动子进程时受干扰(LLVM issue #111166 同类)。
新增 _run_cmd_wait:CreateProcessA 直接执行 + WaitForSingleObject +
GetExitCodeProcess,继承父控制台输出(同 system 语义),全 stdlib/栈分配
线程安全。含 [LLC-DBG] 插桩,验证后移除。
2026-08-19 20:57:52 +08:00
TermiNexus f3c94917e5 debug(phase2): 插桩 llc worker 打印 system 返回码,定位 ClassArrayTest 固定 llc 失败误报 2026-08-19 20:48:01 +08:00
TermiNexus f5b3e46543 fix(gen): while 1 无限循环无 break 判定 merge 不可达
HandlesWhile 翻译 while 后无条件置 _ctrl_merge_reachable=1,导致末句为
`while 1:`(条件常量真且循环体仅 return 无 break)的函数在收尾检查被
误判"流程掉出末尾未显式 return"(vrandom.gammavariate TypeError)。
新增 _IsConstTrue/_StmtHasBreak(跳过嵌套循环子树):常量真且无本层
break 时 merge 结构性不可达 → 置 0,函数收尾对末句 While 生成 unreachable。
2026-08-19 20:35:22 +08:00
TermiNexus b2e69c2f75 chore(gen): 移除全部 [DIAG] 调试打印 2026-08-19 10:11:37 +08:00
TermiNexus 63caf152c2 perf(phase2): llc 并行线程数 8 提升到 16
对齐 TPC Phase2Translator n_workers=os.cpu_count()(本机 16 核)。
2026-08-19 07:56:31 +08:00
TermiNexus 6807082853 fix(gen): this-adjust 失败静默跳过改 fail-fast
非第一父类方法调用时,this-adjust 任一步失败(父类/子类 struct 未注册、
首字段缺失、字段查找失败)此前静默用未调整的 obj_ptr 当 self -> 方法按
自身布局读字段读到垃圾(lookup_reexport strcmp 概率崩溃根因候选)。
新增第一父类判定(前缀对齐 delta==0 免调整),其余失败路径 fatal_error
报出方法/定义类/接收类。
2026-08-19 07:51:37 +08:00
TermiNexus edd842b6af fix(phase2): free_llc_task 误 free 任务槽导致 double-free
LlcTask 记录是 llc_tasks 数组的连续槽(非独立 malloc),free_llc_task
此前对槽调 stdlib.free,循环后又对数组整体 free -> 同一 32 字节区域
double-free(ASan)。修复:free_llc_task 只释放命令串并置 None,记录
由调用方随数组整体释放。
2026-08-19 07:34:57 +08:00
TermiNexus 18b9b8bfa8 perf(phase2): llc 编译改多线程异步并行
Phase B 主循环从'每文件同步跑 llc'改为'循环内写 .ll + 构造 LlcTask
(命令串 stdlib.malloc,避免主池 reset_to(mark2) 回收悬空),循环后
run_llc_parallel 分批发 LLC_MAX_THREADS(8) 个线程并发跑 llc,join 后
校验结果。worker 只调 stdlib.system(),不做任何池分配(MemBuddy 非线程
安全);ASan 模式 opt 插桩也在 worker 内并行。includes 编译路径与
单文件 run_pipeline 保持同步不变。
2026-08-19 07:28:08 +08:00
TermiNexus eb0398eae3 fix(gen): this-adjust 基类 bitcast 前确保 opaque 类型声明
_translate_method_call/_translate_super_call 的多继承字节偏移调整会生成
bitcast i8* -> %SHA1.ClassGenBase*,但 PrintModule 只扫描函数签名、
不扫函数体指令,跨模块基类类型未被声明导致 llc 报 use of undefined type。
在 bitcast 前调用 module_ensure_opaque_for_type(幂等,仅对未定义类型
添加 = type opaque)。
2026-08-19 06:25:33 +08:00
TermiNexus e8a3fd0a65 fix(attr): ALL_CAPS 非 CDefine 回退跨模块全局变量
Phase1.PYI_BUF_SIZE: t.CSizeT = 262144 是 i64 模块级全局而非 CDefine 宏,
语义同 C 的 extern size_t PYI_BUF_SIZE。原 ALL_CAPS 属性路径在 CDefine
查找失败后直接 fail-fast,从不尝试跨模块全局。修复:
- ExprGenAttr 模块限定路径:CDefine 失败时先查 find_global_in_module,
  命中则按跨模块全局引用加载,仅全局也不存在时才 fail-fast;
- ExprGenName 裸名路径:from-import 确认后同样回退跨模块全局加载
  (覆盖 from Phase1 import PYI_BUF_SIZE 形式)。
2026-08-19 05:41:21 +08:00
TermiNexus aa2a1e593f revert(cdef): 撤销跨模块 CDefine 匹配放宽
t.CSizeT 等注解的模块级常量是全局变量而非宏,不应走 CDefine 宏路径
(正确语义:Phase1.PYI_BUF_SIZE 按 extern size_t 跨模块全局引用)。
恢复行匹配仅认 t.CDefine。
2026-08-19 05:41:14 +08:00
TermiNexus 677373c629 fix(cdef): 跨模块 CDefine 匹配放宽到 t.C 类型注解
原行匹配只认 "t.CDefine"(9 字符精确),漏掉 t.CSizeT/t.CInt 等注解的
模块级常量全局(如 Phase1.PYI_BUF_SIZE: t.CSizeT = 262144,是 i64 全局
常量而非 CDefine)→ "跨模块 CDefine 未找到" 误报。本函数仅被 ALL_CAPS
名触发,放宽为 t.C<大写> 类型 + 字面量初值即视为编译期常量;模块限定
(Phase1.PYI_BUF_SIZE)与 from-import 裸名(from Phase1 import PYI_BUF_SIZE)
两条路径均经本函数,一并覆盖。
2026-08-19 05:35:02 +08:00
TermiNexus cf9207f171 fix(struct): PARENT_MAX 16→64 修复 Generator 43 父类字段截断
拆分重构使 Generator 父类增至 43 个,PARENT_MAX=16 使 _collect_parents/
set_parent_names 只收前 16 个父类 → StmtGenMixin(#40) 等字段丢失 → 结构体
缺 DiagStmtCount → __init__ 写 self.DiagStmtCount "属性写入失败"。FIELD_MAX
128→256 防字段静默截断;MRO_MAX 16→64 保证父类方法解析可达。两处常量
(HandlesStruct/StructGenMixin)同步提升。
2026-08-19 05:11:51 +08:00
TermiNexus 46170c20ef fix(gen): ExprGenCls/Fstr 补本地 DOC/FSTR 常量副本
ExprGenMixin 拆分后 DOC/FSTR 系列常量只定义在 ExprGenMixin.vp(M),而 ExprGenCls(C)/ExprGenFstr(F) 按文件序先于 M 编译,跨模块 CDefine 全局表未注册 → NameError 未定义名称。按 CallGen 既有本地副本惯例补定义,消除文件序依赖。
2026-08-19 05:06:08 +08:00
TermiNexus 6d627d67cf fix(gen): fatal_error 后补 return 样板,修复属性访问/写入掉出末尾
translate_attribute 与 get_attribute_ptr 的 match 末 arm(case _)调
fatal_error 后无 return None → 块未 terminated → 该 arm 被 match 收尾
误判掉出 → br end_bb → merge 可达 → 方法收尾 fail-fast '流程掉出末尾'
(返回类型 Value*)。补显式 return None(块设计约定:fatal_error 后也
必须保证块 terminated)。
2026-08-19 04:58:12 +08:00
TermiNexus d766eaf656 fix(gen): 依赖未就绪时保持默认 i32 而非 Void,修复表达式 fatal
根因(ExprGenAttr._get_cderef_attr_base 'if 条件表达式翻译失败'):Phase A 按
文件系统顺序编译,ExprGenAttr(A) 先于父类模块 ExprGenBase(B)。方法调用
self.is_ptr_type() 返回类型无法解析 → _deps_pending=1 + call_ret_ty=Void →
build_call(Void) 返回 None → 调用结果喂进 if 条件/比较时 fatal,多遍重译
机制(本遍不写盘、下遍重译)根本走不到。对齐跨模块函数路径 L8167-8195
'保持默认类型继续'语义:pending 时保持默认 i32(错误类型不进入产物,
下遍依赖就绪后精确解析)。共修 6 处(CallGenCall L395/L852/L878/L1417、
CallGenDispatch L1080、CallGenProp L135)。
2026-08-19 04:49:26 +08:00
TermiNexus 4d7a6db31a fix(match): case 体末句控制流全 return 补 unreachable 不 br end_bb
根因(ClassGenEnum._get_type_align 掉出末尾):case 体末句是 If/控制流且
全分支 return 时,处理器把 builder 停在无 terminator 的 merge 块,case
循环的 is_terminated 误判未终止 → 补 br end_bb → rm/sq/sm_merge_reach=1
→ 全 case return 的 match 被误判 merge 可达 → 函数收尾 fail-fast
'流程掉出末尾'。新增模块级 _case_tail_unreachable:末句控制流
(If/While/For/Match)且 _ctrl_merge_reachable==0 时补 unreachable,
与 HandlesIf L309-315 / ClassGenVTable L1084 同语义;应用于 renum/
sequence/simple 三路的 case 体与 default 收尾(不含 Try/With,其处理器
不维护该标志)。
2026-08-19 03:16:16 +08:00
TermiNexus fa52fbd4e5 fix(gen): REnum 变体检测避免指针减法生成非法 sub i8*
rc_mq_dot - rc_mq_path 两操作数都是 str(i8*),TPC 直接发 sub i8*, i8*
非法 IR,opt ASan 插桩失败。改用 strlen 整数差计算模块前缀长度
(strlen(path) - strlen(cls) - 1),与既有 d_i - d_start 整数减法写法一致。
2026-08-19 02:54:08 +08:00
TermiNexus e700de1055 fix(gen): REnum 变体构造支持模块限定形式 mod.Class.Variant
CallGenMixin.translate_call 的 REnum 变体检测只认单层 Name(ClassName.Variant),
llvmlite.LLVMType.Struct(...) 这类嵌套属性漏检 → 误走跨模块函数路径 →
_lookup_module_sha1('llvmlite.LLVMType') 查无 → '跨模块调用找不到模块 SHA1'。
根因修复:扩展检测到嵌套 Attribute,取路径末段为 REnum 类名、前缀为模块,
仅要求最左模块已导入(跨模块任意同名可接受,不做类归属校验),命中后走
_translate_renum_construct 构造变体。对应 TPC HandlesExprCall 静态方法路径。
2026-08-19 02:45:10 +08:00
TermiNexus 941ba2feb0 fix(call): 模块属性调用不回退局部变量,修同名局部变量劫持 VLogger.fmt_buf
found_func 未命中时仅裸名调用(Name)回退查局部变量(函数指针/闭包);模块属性调用(VLogger.fmt_buf())目标是模块符号,跨模块任意同名可接受(CallGenLeafKit 局部 fmt_buf 曾劫持 VLogger.fmt_buf → 误走函数指针调用报 t.Callable 缺失),仅 from-import 裸名 yyy 重名才冲突
2026-08-19 02:30:18 +08:00
TermiNexus ebf0aed5b1 fix(cbuiltin): translate_c_addr 补末尾 return None(真实掉出)
arg0 非 Name/Attribute/Subscript 时三个分支都不进入 → 流程真实掉出函数末尾,补显式 return None(fail-fast 不允许掉出)
2026-08-19 02:30:11 +08:00
TermiNexus c40c00f933 fix(match): renum match merge 标志声明作用域修正(a45b806 补充)
m_merge_reach 声明放 Handle 分派函数,renum match 内引用退化为隐式全局跨 match 污染 → get_struct_name(LLVMType REnum match)收尾读到残留 1 仍 fail-fast。声明移入 _handle_renum_match 局部(rm_merge_reach),置 1 与收尾覆盖同步修正
2026-08-19 01:58:32 +08:00
TermiNexus a45b806afa fix(match): merge 可达性用局部标志记录,消除 case 体内嵌套 if 污染
主 match/sequence/simple 三条路径:case 体内嵌套 If(无 else + return)翻译时把 _ctrl_merge_reachable 置 1,全 case return 的 match 被误判 merge 可达 → 函数收尾 fail-fast '流程掉出末尾'(LLvmLiteTest includes/llvmlite/__module.vp _is_opaque_struct)。改用局部变量记录本 match 自身的 br end_bb,收尾覆盖全局标志
2026-08-19 01:04:42 +08:00
TermiNexus 132c48d41a fix(gentype): register_ctypedef_from_source 先清表再注册,修 stdint.vp strcmp 悬空遍历崩溃
clear_ctypedefs 只在 translate 前调用,文件 reset_to(mark1) 回收后上一文件 CTypedefNames 表悬空(非 None);本函数去重遍历读已回收内存 → ASan strcmp 读地址 0x4(1.log)。开头 clear_ctypedefs 重建表,杜绝悬空遍历
2026-08-19 00:45:08 +08:00
TermiNexus 55d4c4102a fix(call): super() void 命中用 hit_box 区分未命中 + CTypedef 预注册修复 mode_t NameError
- CallGenDispatch/CallGenMixin/ExprCallHandle: super() 命中 void 方法返回 None 属预期,用 hit_box 命中标志区分未命中,避免误走裸名调用报 'super 未定义'
- HandlesAnnAssign.Handle + TranslatorGenMixin.handle_module_level_var: CTypedef 按需注册(翻译期表已被 clear_ctypedefs 清空),修复 posix.vp S_ISREG(mode: mode_t) 参数解析 NameError
2026-08-19 00:28:48 +08:00
TermiNexus 65838da0dc fix(Generator): 补全 ClassGenBase 拆分遗漏的 17 个字段初始化
结构体由 mb.alloc 分配,未初始化字段是内存垃圾。异常表字段(ExceptionCount/ExceptionNames/ExceptionParents/ExceptionCodes/NextExceptionCode/_exception_codes_tmp_count)此前未初始化,无用户异常类的项目(如 FuncTest)从不触发 _ensure_exception_tables 懒分配,is_exception_name 里非 null 垃圾指针通过 is not None 检查后 strcmp 越界(ASAN heap-buffer-overflow)。一并补上 RenumAliasTy/RenumAliasVariant/ClassMeta 4 个/Decorator 4 个/GenericSpecDepth 字段。
2026-08-18 12:40:21 +08:00
TermiNexus d18f9a7e7f fix(phase1): CTypedef 改源码文本扫描注册,彻底修 stdint.vp 访问违规崩溃
AST 字符串字段(attr/id)token 零拷贝指向 src_buf,跨阶段内容不稳定
(悬空)——ScanCTypedefDeclarations 读 attr 在两次运行间内容不同
(上轮 prefix=1 有效、本轮直接崩),0xC0000005。修复:
1. Phase1 1b translate 前用 RegisterCTypedefFromSource 纯文本逐行匹配
   'NAME: t.CTypedef = TYPE' 注册(src_buf 有效期内),不依赖 AST 内容
2. 移除 translate 内 ScanCTypedefDeclarations 调用(已被文本扫描替代)
2026-08-18 10:22:26 +08:00
TermiNexus 23945cd168 fix(gentype): ctypedef 检查 strcmp 改 strncmp 限长比较,修 stdint.vp 读穿崩溃
prefix=1(attr 内容 'CTypedef' 正确)后仍崩——attr 是零拷贝引用
src_buf 的 token 字符串,无 NUL 结尾(后跟空格/其他字符),strcmp
无限读穿到页边界 0xC0000005。改 strncmp 限长 8 + 第 9 字节分隔符
校验;mod_id 的 strcmp 同样改 strncmp。
2026-08-18 10:02:26 +08:00
TermiNexus 8db2d1c23b fix(assign): _is_scalar_ty_name 改白名单,修 list[str].get 返回类型不匹配
原实现排除 Ptr/str/bytes/| 后默认返回 1(标量),把未知类名(如泛型
上下文污染产生的 llvmlite.Value)误判为标量 → IsPtrElement=0 →
elem_ptr[0] 走通用路径生成 Value*,list[str].get 声明 i8* 与 ret
Value* 不匹配(8fbba llc 报错)。改白名单:已知整数/浮点/字符标量
才返回 1,未知类名按 8 字节指针槽(list 元素本就是 8 字节槽)。
2026-08-18 09:51:54 +08:00
TermiNexus 0f25dc1511 chore(gentype): resolve_annotation_type 加 T 替换断点(方法体局部注解路径)
上一轮 resolve_generic_type_name 断点无输出——方法体局部注解
(elem_ptr: T|t.CPtr)的 T 替换走 resolve_annotation_type 的
Name(T) 分支(gen.GenericTypeArgs),非 resolve_generic_type_name。
在此打印 T 实际替换值,确认 list[str].get 的 T→str 还是 T→Value。
2026-08-18 09:48:11 +08:00
TermiNexus 5ec6a3baef chore(gentype): resolve_generic_type_name 加 T 替换断点,定位 list[str].get 类型不匹配
8fbba(ForHandleIter.vp 的 list[str].get)声明返回 i8* 但函数体
ret Value*——get 方法体里 T|t.CPtr 的 T 疑似被替换成 Value(泛型
上下文 GenericTypeArgs 被嵌套特化污染)。打印 T 替换结果确认。
2026-08-18 09:43:10 +08:00
TermiNexus 8db5dc63a5 chore(gentype): ctypedef attr 手动逐字节检查(防 strcmp 读穿崩),定位内容损坏与读越界 2026-08-18 09:32:12 +08:00
TermiNexus 7178d169e3 chore(gentype): ctypedef 检查加 attr 读取断点,对比构造与读取地址 2026-08-18 09:25:36 +08:00
TermiNexus 7a7c3939db fix(gentype): CTypedef/注解类型名处理改用 ast 字段访问器,修 stdint.vp 访问违规崩溃
断点确认 AnnAssign 字段地址全部合理(stub 字段访问正常),崩溃在
_is_ctypedef_annotation / _get_type_name_from_annotation 对 Attribute.
attr/Name.id 等字段的访问(跨模块 stub GEP 偏移错 → strcmp 读垃圾
0xC0000005)。改用 ast.name_get_id/attribute_get_attr/attribute_get_
value/binop_get_*/constant_get_str_val 访问器(ast 模块完整类型内读取)。
并加 kind() 虚调用断点,若 vtable 错可立即确认。
2026-08-18 08:59:10 +08:00
TermiNexus 2847d358c8 chore(gentype): ScanCTypedefDeclarations 加 AnnAssign 字段地址断点
stdint.vp 崩溃已定位到 ScanCTypedefDeclarations(容器可见性完成后)。
加断点打印 AnnAssign 节点与 annotation/target/value 字段地址,
垃圾地址即确认跨模块 ast stub 字段访问偏移错。
2026-08-18 08:50:50 +08:00
TermiNexus 407f047411 chore(phase1): translate 流程加 printf 断点,定位 stdint.vp 访问违规崩溃点
stdint.vp 翻译中崩溃(退出码 -1073741815=0xC0000005 访问违规),
发生在 translate 内部 printf.fmt 创建后。在 translate 声明完成/
main 检查/模块级各步骤(import、容器可见性、CTypedef 扫描、vpi 注入、
变量预注册、前向声明、translate_children)加断点,崩溃前最后打印的
步骤即为崩点。
2026-08-18 08:43:37 +08:00
TermiNexus 0cb0a12810 fix(phase1): 加 translate 后存活块检查 + printf Params 链创建即校验 + dump 函数清单诊断
builtins.vp dump 卡死已定位:printf.fmt Param 的 Next 被越界写破坏成环
(Params.Count=1 但遍历超限)。本次加运行时证据收集:
1. printf declare 创建后立即打印 fmt Param 地址/Next(区分创建即坏 vs
   后续被破坏)
2. dump_ir(OUTPUT_STUB) 打印模块函数清单+param0/next(确认创建上下文)
3. translate 返回后、dump 前 mb.check_alive_blocks(mark1)(抓 translate
   期间写穿破坏的块 header/canary,rc=6 定位越界写穿文件)
2026-08-18 08:17:54 +08:00
TermiNexus 43470b6e4a fix(vpi): 参数数上限哨兵 + declare 链遍历哨兵,定位 builtins.vp dump 卡死根因
dump 步数哨兵已定位卡死链路为 printf 的 Params 链异常。新增:
1. VpiReader _inject_function_declare/_inject_method_declare 参数数上限
   128(fail-fast):vpi tree 深层节点被覆盖损坏时 args_list.__len__()
   返回垃圾大数 → add_param 海量次 → Params 链超长,dump 误报成环
2. CallGenBase._ensure_method_declare FuncHead/Params 遍历步数上限
   (防 translate 期间死循环)
2026-08-18 08:10:18 +08:00
TermiNexus 453f428aab fix(gen): TypeGenErr 补 import w32.fileio,修复 File 类型错位
TypeGenErr._read_source_line 使用 fileio.File 但未 import fileio → TPC 全局符号回退解析 fileio.File 时类名错位成 7cadfe07e983fd90.File(_list 前缀),与 fileio 构造的 d137b1f3311f3a7f.File* 类型不匹配(if f.closed 报 Type of #1 arg mismatch)。
2026-08-17 19:44:24 +08:00
TermiNexus e1b05fe1c6 fix(gen): If 分支嵌套控制流全 return 补 unreachable,修复 atan2 误判流程掉出末尾
- 嵌套 If(全分支 return)翻译后 builder 停在嵌套 merge 块(无 terminator),外层 If 分支 terminated 判定误判为未终止 → 补 br merge → 顶层 _ctrl_merge_reachable 误置 1 → 函数末句 If 全 return 被判 merge 可达,fail-fast '流程掉出函数末尾'(vipermath.vp atan2 根因)
- 分支翻译前重置 _ctrl_merge_reachable=1 防残留值污染
- 分支末尾未 terminated 且 _ctrl_merge_reachable==0(嵌套控制流全 return)时补 build_unreachable 而非 br merge,保持结构性不可达语义
2026-08-17 18:43:39 +08:00
TermiNexus 33c8609882 fix(gen): list 内置分支置位 hit_box 并确认对象类型,修复 nums.set 找不到模块 SHA1
- list 内置分支 set/clear 等 void 方法成功处理返回 None 时未被标记命中,translate_call 误判未命中继续走跨模块路径,把对象名当模块名查 SHA1 → '跨模块调用 nums.set 找不到模块 SHA1'(ListTest 根因)
- 进入 list 内置分支即置位 hit_box(对齐 _translate_method_call 调用点模式),void 方法返回 None 视为已处理
- 增加对象类型确认(额外搜索路径):从对象结构体名匹配 list,明确非 list(dict/普通类未注册场景)跳过本分支,避免按 list 布局 GEP 误处理
2026-08-17 18:31:10 +08:00
TermiNexus 51ae18a160 fix(gen): 编译器生成方法 __before_init__ 跨模块调用放行,修复找不到模块 SHA1
- _tc_h6_method_dispatch 增加 hit_box 命中标记:_translate_method_call 返回 None(void 语义)不再被误判未命中,translate_call 不再把对象名当模块名查 SHA1
- AnnotClassName 回退分支新增编译器特殊方法放行:结构体未注册 + 模块 SHA1 不可查(Phase A 依赖未就绪)时,__before_init__/__init__ 由 _special_method_ret_ty 固定返回类型,走 _translate_method_call 处理并标记 _deps_pending 下遍重试
- ExprCallHandle._tc_h6_method_dispatch 委托透传 hit_box,对齐 c.Asm/c.LLVMIR hit_box 修复(2f3320f)
2026-08-17 18:19:15 +08:00
TermiNexus 2f3320ffde fix(gen): c.Asm/c.LLVMIR void 调用 hit_box 命中标记,修复 StringTest 编译报 Asm 外部函数未登记
拆分后 _tc_h2_c_special 以 None 表示未命中,但 translate_c_asm/
translate_c_llvmir 对 void(无输出)asm 返回 None 表示已处理无返回值,
两者混淆导致 translate_call 继续走外部函数路径 → WARN 外部函数返回
类型未登记 Asm/AsmInp + t.ASM_DESCR 被当 CDefine 常量赋值 FATAL。
新增 hit_box(t.CPtr,[0]=1)区分命中,Asm/LLVMIR 分支置位,
translate_call 命中且返回 None 时视为已处理直接返回。
2026-08-17 12:43:49 +08:00
TermiNexus 9f44abe645 重新完整提交碎片 2026-08-17 11:23:55 +08:00
TermiNexus 0a98890d5b fix(handles): HandlesExprCall 补回 set_global_gen 与 12 个顶层常量
拆分脚本 del 逻辑未过滤分组,误删了保留的 set_global_gen 与
顶层常量(_CEXPORT_MAX/ASM_*/LLVMIR_*/MAX_*/GLOBAL_*)→ 链接报
undefined symbol: {sha1}.set_global_gen。已补回,全 App 语法验证通过。
2026-08-17 08:32:54 +08:00
TermiNexus 285f4c25e2 fix(handles): ExprCallHandle 类方法裸调用补模块前缀(translate_call/printf/print)
拆分后主文件保留的 ExprCallHandle.HandleCall/HandlePrintfCall/
HandlePrintCall 仍裸调 translate_call/translate_printf_call/
translate_print_call → TPC 报 Undefined function: 'translate_call'。
改为 ExprCallCall. 前缀并补 import;ExprGenName.find_func_in_module
裸调用同步补 ExprCallBase. 前缀。全 App 裸调用扫描清零。
2026-08-17 08:27:07 +08:00
TermiNexus 3ff5769290 refactor(gen): CallGenCall 精简重复注释块(1502→1495 行,恢复 ≤1500)
HandlesExprCall 拆分追加 import 后 CallGenCall 达 1502 行,
删除 _kwarg_name_matches 前的重复注释块(方法与逻辑不变)
2026-08-17 08:16:56 +08:00
TermiNexus f5c4be3995 refactor(core): Phase1 拆 3 组(Scan/Topo/Main,1801→46 行)
直接移动+改调用方:7 个函数按功能移至 3 个子模块,主文件仅保留
常量/_mbuddy。
- 子模块函数体内裸调用映射子模块前缀,全局符号经 Phase1._xxx 访问
- 调用方 main.vp 的 Phase1.func( → 子模块前缀并补 import
- 全 App 语法/引用/import 验证通过
2026-08-17 08:14:45 +08:00
TermiNexus c62ce0797d refactor(handles): HandlesFor 拆 ForHandleBase/ForHandleIter(1600→448 行)
类方法拆 Mixin:
- ForHandleBase(HandlesBase.Mixin):__init__ + 公共工具
  (_extract_tuple_names/_seq_kind/_build_seq_loop)
- ForHandleIter(ForHandleBase):8 个 _handle_* 迭代 helper
- ForHandle(ForHandleBase, ForHandleIter):保留 Handle 主分派 + 常量/
  _g_gen/NewForHandle 委托;self 调用按 1 级父类解析(Handle→Iter、
  Iter→Base 均直接父类)
StmtGenCifMixin 仍以 HandlesFor.ForHandle 实例化/引用,类名不变
2026-08-17 08:14:04 +08:00
TermiNexus 2cb974ae5a refactor(handles): HandlesExprCall 拆 6 组(Base/Deref/Ctor/Call/Table/Handle,2041→241 行)
直接移动+改调用方:~100 个委托函数按功能移至 6 个子模块,主文件
保留 _g_gen/set_global_gen/顶层常量/4 个类(AsmOperand、FuncEntry、
FuncDefaultsEntry、ExprCallHandle——CallGenLeafKit/HandlesTranslator
仍以 HandlesExprCall.类名 引用)。
- 子模块函数体内 _g_gen/常量/类裸引用 → HandlesExprCall.xxx 跨模块访问
- 28 个调用方 HandlesExprCall.func( → 子模块前缀并补 import
- 全 App 语法/引用/import 验证通过
2026-08-17 08:10:55 +08:00
TermiNexus 278893d203 refactor(core): StubMerger 拆 5 组(Collect/Store/Topo/IR/Build,2391→72 行)
直接移动+改调用方模式:35 个函数按功能移至 5 个子模块,主文件
仅保留常量与全局变量(main.vp 仍直接赋值 StubMerger._mbuddy)。
- 子模块函数体内裸调用映射为子模块前缀,全局变量经 StubMerger._xxx 跨模块访问
- 12 个调用方文件 StubMerger.func( → 对应子模块前缀并补 import
- 全 App 语法/引用/import 验证通过
2026-08-17 08:03:40 +08:00
TermiNexus d0cf283228 fix(gen): ClassGen 拆分遗漏的 12 个顶层 CDefine 常量补回
GSListNode 泛型特化报'深度=1'递归过深根因:GENERIC_SPEC_MAX_DEPTH
在阶段 D 拆分时从 ClassGenMixin 顶层遗漏,TPC 解析为 0 → 任何特化
立即触发守卫。对比拆分前后顶层 CDefine 全量比对,补回遗漏 12 个:
- ClassGenGeneric: GENERIC_SPEC_MAX_DEPTH=64 / GENERIC_TEMPLATE_MAX=512
- ClassGenBase: META_TLS / CLASS_META_MAX / DECOR_FUNC_MAX / DECOR_NAME_LEN
  / EXCEPTION_MAX / EXCEPTION_NAME_LEN / BUILTIN_EH_* / EH_USER_CODE_START
- ClassGenVTable: META_TLS(本地副本)
全部本地副本模式,避免跨模块 CDefine 查找 bug
2026-08-17 07:49:27 +08:00
TermiNexus ebfc74063f fix(handles): HandlesExpr._lookup_cross_module_cdefine 委托补 depth/node 参数
ExprGenName 等调用传 6 参(pool, name, from_imports, imported_modules,
depth, node),委托只定义 4 参 → TPC 报 '传入了 6 个参数,但函数只
需要 4 个参数'。补齐 depth=0/node=None 默认参数并透传,与
ExprGenCdef._lookup_cross_module_cdefine 方法签名对齐。
2026-08-17 07:42:49 +08:00
TermiNexus 50db55fd08 fix(handles): HandlesClassDef 6 个 _is_* 委托补 trans 参数
ClassGenDef 调用 _is_enum_class/_is_union_class/_is_renum_class(cd, trans)
传 2 参,但委托定义只有 1 参(cd)→ TPC 报 '传入了 2 个参数,但函数
只需要 1 个参数'。统一补齐 _is_cenum_base/_is_enum_class/_is_cunion_base/
_is_union_class/_is_crenum_base/_is_renum_class 的 trans 默认参数并透传。
2026-08-17 07:38:09 +08:00
TermiNexus 54fa8b46c8 refactor(gen): ExprGenMixin 拆 8 组(Base/Const/Fstr/Ops/Cdef/Name/Attr/Cls,6203→129 行)
- ExprGenMixin 保留 translate_value,其余 74 方法按功能拆至 8 个子 Mixin
- 子 Mixin 均 1 级继承 ExprGenBase(TPV self 调用仅支持 1 级父类)
- 跨 Mixin 调用转 HandlesExpr 模块级委托(_g_gen 单例 cast)
- HandlesExpr 补 15 个委托:f-string 组 7 个、docstring 组 4 个、
  Cdef/Attr 各 1 个、Ops 组 translate_binop/_binop_to_dunder/_unaryop_to_dunder
- Generator 继承链加入 8 个 ExprGen 子 Mixin
- 全部 Gen/ 文件均 ≤1500 行,500~1500 行/文件架构重构完成
2026-08-17 07:32:56 +08:00
TermiNexus 47ac2dd57c refactor(gen): ClassGenMixin 拆 5 组(Base/Enum/Generic/VTable/Def,4768→空壳) 2026-08-17 07:23:40 +08:00