Commit Graph
62 Commits
Author SHA1 Message Date
TermiNexus 735f5d49af chore: 改名同步 TransPyV -> ViperC(源码/配置内的纯替换) 2026-10-12 15:06:45 +08:00
TermiNexus 0cac59b795 docs(test): README 补三个 runner 的 --exe 用法;建议实现顺序步数 68 -> 77
- 「单独运行」节:regression_test.py 增加 --exe / --only 示例(该脚本本轮已支持 --exe),
  并注明三个 runner 均支持 --exe、--exe 会被绝对化、--rebuild-includes 的作用
- 「建议实现顺序」节标题「共 68 步」-> 「共 77 步」,与列表 1..77 及开头
  「全部 77 个测试项目(原 68 + 2026-10 补录 9)」保持一致
2026-10-12 15:05:11 +08:00
TermiNexus 6d7bed5e0b feat(test): regression_test.py 增加 --exe/--compiler/--rebuild-includes(与另两个脚本对齐)
- 编译命令模板化(build_compile_cmd):--exe 直推自举产物(如 viperc.exe),
  缺省仍走 TPC 种子(TransPyC/Projectrans.py);--exe 绝对化避免 cwd 层级错位
- --exe 存在性校验、banner/头部说明改为 ViperC 口径;--help 生效
  (已用 py_compile + --help 验证)
2026-10-12 15:03:43 +08:00
TermiNexus c276e0c1c9 chore: 改名同步 TransPyV -> ViperC(.gitignore/文档/脚本) 2026-10-12 15:02:19 +08:00
TermiNexus f52fc90221 test(lifetime): 字段逃逸负例从 main 移入普通函数
入口 main 已整体豁免栈逃逸检查(其帧生命期=进程生命期),逃逸写在 main 里会被放行、负向用例失效。改为 CaseField()/CaseAnnField() 承载逃逸、main 调用,保持 P3 规则仍被覆盖。
2026-10-10 14:47:04 +08:00
TermiNexus b737bedceb test(lifetime): A2 补“形参位↔实参位映射”双向钉桩(受控用例)
背景:NewLifetimeRetXmodTest 曾漏检 —— ret(borrows=x) 的 pi→实参映射把模块限定函数
`m.f(...)` 误当方法(给 pi=0 加 self 偏移),取到模块名而非实参。
为防同类回归,在正向工程 NewLifetimeRetOkTest 里加两个“错就编译失败”的钉桩:

- (4a) 模块限定函数:retdep.Identity2(fr, hp)(borrows=1)。
  实参 0 故意是**本帧**指针、实参 1 是**堆**指针 ⇒ 正确映射取实参 1=堆(可存进堆字段);
  若误加 self 偏移 → 取成实参 0(本帧)→ 结果 FRAME → 该行报错。
- (4b) 方法:box.SelfRef(fr)(borrows=self)。
  接收者是**堆**对象、用户实参是**本帧**指针 ⇒ 正确映射取接收者=堆(可存进堆字段);
  若忘了 self 偏移 → 取成实参 0(本帧)→ 结果 FRAME → 该行报错。

即两个方向任一偏移错都会让本正向工程编译失败(正向工程的“错就报错”比再堆一个负向
工程更能锁死偏移量)。README 的 NewLifetimeRetOkTest 行同步说明。
2026-10-10 13:24:27 +08:00
TermiNexus e8a61473b2 test(lifetime): 同步 A2 定义端'声明感知'的措辞
定义端不再'整体移除' return 本帧存储的检查,而是按被调者 @life(ret(...)) 声明
放行/报错(§14.3.2 方案 A)。更新 NewLifetimeRetEscapeTest / NewLifetimeRetOkTest
的注释与 README 描述,去掉'已移除 fail-fast'的旧说法。
2026-10-10 09:17:14 +08:00
TermiNexus 66ebd75dec test(lifetime): 补齐 A2 @life(ret(...)) 的正/负向回归工程
新增 3 个工程(均登记进 regression_test.py / SequentialRegressionTest.py /
run_lifetime_negative_tests.py 的 escape/负向清单):
- NewLifetimeRetOkTest(正向):ret(heap)/ret(static)/ret(borrows=none) 的结果
  可存进堆对象字段;ret(frame)/ret(borrows=x) 的结果只在本帧内使用;
  同模块契约表与跨模块 .vpi(escr=) 两条取用路径都覆盖 → 编译通过 + 退出码 0。
- NewLifetimeRetEscapeTest(负向):同模块 @life(ret(frame)) 的返回值写进堆对象
  字段 → LifetimeError(隔离性:FrameRet 摘要为 0,唯一报错源是 ret 契约)。
- NewLifetimeRetXmodTest(负向):跨模块 @life(noescape(x), ret(borrows=x)) 的结果
  写进堆对象字段 → LifetimeError(契约经对方 .vpi 的 escr= 传来;noescape 清掉了
  实参逃逸路径,判据收敛到 ret 契约)。
README.md 的 escape 测试表与负向清单同步。
2026-10-10 09:03:05 +08:00
TermiNexus 9307b34af6 test(new): NewTest 补 (6) 括号可省 + 标量/数组零初始化用例 2026-10-09 18:44:44 +08:00
TermiNexus 5fa5a9f37c test(lifetime): 补 P3 注解形态 + P2 方法级/取地址的自动工程
- 新增 NewLifetimeAnnFieldEscapeTest:h.p: int* = &local → LifetimeError(P3 注解形态)

- 新增 NewLifetimeWillFreeMethodTest:r.Release(p) 后再用 p → LifetimeError(方法级标注,形参位含 self 偏移)

- 新增 NewLifetimeWillFreeAddrTest:stdlib.free(p) 后 &p → LifetimeError(取地址路径)

- NewLifetimeTest.CaseAnnFieldStore:p.x: int = 42 必须真的写进字段(正向)

- 注册进 SequentialRegressionTest / regression_test / run_lifetime_negative_tests + README
2026-10-09 14:55:52 +08:00
TermiNexus 64b0cc84f6 test(lifetime): 加 P4 自别名用例
CaseSelfAliasTransfer:q = p; q = p 不得析构(运行时判等跳过覆盖释放),出口仍恰好释放一次。
2026-10-09 08:45:24 +08:00
TermiNexus e8f47e3197 test(lifetime): NewLifetimeTest 增 P4 所有权转移用例
CaseOwnershipTransfer:q = p 后对 p 赋值不得析构(函数内断言 dtor_hits 未变),出口释放 q 恰好一次(调用方断言);同时把 CaseAlias 的注释更新为所有权转移语义。
2026-10-09 08:43:58 +08:00
TermiNexus cd102989a8 test(lifetime): 新增 P3 负向工程(堆对象字段收下本帧栈地址)
NewLifetimeFieldEscapeTest:h.p = &local(h 由 new heap hlife 得到,字段活得比本帧长)必须报 LifetimeError;同步注册到 SequentialRegressionTest / regression_test / run_lifetime_negative_tests 与 README。
2026-10-08 22:47:40 +08:00
TermiNexus 399f396694 test(lifetime): 修正 CaseRaiseCaught 的 dtor 计数时机
对象属于本函数,释放发生在函数返回那一刻;原用例在自己体内 return 之前就检查 dtor_hits,计数必然还没变,恒判 rc=1。拆出 CaseRaiseCaughtInner,把计数检查移到调用方(与 CaseRaiseExit 同口径)。
2026-10-08 22:27:47 +08:00
TermiNexus c4a13644b1 test(lifetime): NewLifetimeTest 失败时打印具体 case 名与返回码
原来只打印失败总数(FAILED, N case(s) wrong),无法定位是哪条挂了;改为逐 case Check() 并在 dtor_hits 不符时打印实际值。
2026-10-08 22:26:26 +08:00
TermiNexus e74397e932 test(lifetime): 新增关键字实参路径的 willFree 负向工程
NewLifetimeWillFreeKwargTest:stdlib.free(p = p) 之后再用 p 必须报 LifetimeError,覆盖 P2 的关键字实参标记路径;同步注册到 SequentialRegressionTest / regression_test / run_lifetime_negative_tests 与 README。
2026-10-08 21:40:22 +08:00
TermiNexus aed57de44c test(lifetime): 新增 willFree 正/负向工程并注册到回归脚本
NewLifetimeWillFreeTest(二次 free)、NewLifetimeUseAfterFreeTest(释放后使用)为负向;NewLifetimeWillFreeOkTest 验证合法用法与重赋值清除失效态。同步更新 SequentialRegressionTest / regression_test / run_lifetime_negative_tests 与 README。
2026-10-08 21:28:55 +08:00
TermiNexus 9a2b09e606 test(new): NewTest 增泛型类 + new 描述符取存储的冒烟用例
新增 class Box[T] 与 new memgr(m2) hlife Box[int](7),覆盖「泛型下标 callee 先特化」与「描述符存储被构造复用」两个前提件,预期多打印一行 generic-in-pool: 7。
2026-10-08 21:04:57 +08:00
TermiNexus c00b172da2 test(lifetime): NewLifetimeTest 增 P1 异常出口用例
- CaseRaiseExit:raise 传播出被调函数 → 离开前 __del__ + free 恰好 1 次(多一次=double free,少一次=异常路径泄漏)。

- CaseRaiseCaught:异常被本函数捕获时不得提前释放 —— except 体内读对象验证仍有效,出口再释放 1 次。
2026-10-08 21:04:57 +08:00
TermiNexus 1724874967 test(lifetime): 新增 NewLifetimeAsyncTest 负向工程;测试项目 main 统一为 export def main() -> int
- NewLifetimeAsyncTest:协程体里的 new heap slife 必须报 LifetimeError(fail-fast 的回归覆盖),已挂进 ESCAPE_PROJECTS / NEGATIVE_PROJECTS / NEGATIVE_PROJECT_NAMES 与 README。

- NewLifetimeTest / NewLifetimeFreeTest 的 main 改为 export def main() -> int,并删掉多余的 t/c 导入(与 FuncTest / FormatStringTest / NewTest 一致)。
2026-10-08 20:42:14 +08:00
TermiNexus 07fbb4d0a2 test(new): NewTest 的 main 迁移为 export def main() -> int,去掉多余的 t/c 导入 2026-10-08 20:35:23 +08:00
TermiNexus d0165951b7 test(lifetime): NewLifetimeTest 增析构调度用例,README 补 escape 项目说明
- 新增 §3.6 用例:DtorPoint.__del__ 计数验证 —— 出口释放恰好 1 次、循环 3 轮(2 次覆盖释放 + 1 次出口)共 3 次;析构与释放点一一对应。

- README:NewLifetimeTest 补析构调度覆盖;NewLifetimeFreeTest 说明手动 del 同样被拒。
2026-10-08 20:34:23 +08:00
TermiNexus 7451adf523 test(lifetime): 新增 NewLifetimeTest/NewLifetimeFreeTest 与 IR 断言,escape 跑法纳入新项目
- NewLifetimeTest(正向,9 用例自检 + 退出码判定):出口释放 / 循环内覆盖释放 / 别名只释放一次 / 嵌套函数登记区间隔离 / early return / void 裸 return / 仅分支里 new 时 free(NULL) / stack slife 不释放。

- NewLifetimeFreeTest(负向):对 slife 对象手动 stdlib.free → LifetimeError。

- SequentialRegressionTest 增 IR_EXPECT:编译成功后断言生成的 IR 出现 llvm.call @free(漏释放=纯泄漏,退出码看不出来);--escape/--only 纳入两个新项目,run_lifetime_negative_tests.py 同步。
2026-10-08 20:04:12 +08:00
TermiNexus 9eb037ee8f test(new): NewTest 增加“stack 生命期缺省=slife”对照用例;README 同步
新增 (3) `new stack Point(7,8)`(不写 slife)与 (1) 显式 slife 等价,专门验证缺省规则;文件头补上完整缺省表:省略来源→heap,省略生命期→stack 为 slife、heap/memgr 为 hlife。
2026-10-08 18:21:13 +08:00
TermiNexus 12c96d3039 fix(test): --exe 绝对化并校验存在性,修 Test/NewTest 报 cannot find the path specified
编译以 cwd=项目目录 执行,--exe 若是相对路径会按各项目层级解析:根级 escape 项目只深一层能命中,Test/NewTest 深两层就启动失败(耗时 0.0s 且无任何产物)。

SequentialRegressionTest.build_compile_cmd 与 run_lifetime_negative_tests.py 都改为 os.path.abspath(--exe),并在文件不存在时立即报错退出(避免静默跑到最后一个项目才暴露)。
2026-10-08 18:03:12 +08:00
TermiNexus 73846979f1 test(lifetime): SequentialRegressionTest 支持负向项目(反向判定)
NEGATIVE_PROJECTS: EscapeTest/EscapeMethodTest/EscapeXmodTest 期望编译失败且输出含 LifetimeError;命中即通过并跳过运行阶段,编译成功=漏检直接终止,报错方向不符亦终止。

regression_test.py 的 --escape 剔除负向项目(该脚本要求编译成功+能跑,纳入会误报),并提示改用 SequentialRegressionTest 或 run_lifetime_negative_tests.py。README 同步。
2026-10-08 17:56:58 +08:00
TermiNexus ed204852c4 test(lifetime): 新增生命期负向运行器;NewTest 补 memgr 用例
run_lifetime_negative_tests.py:只用 TransPyV 编译并断言编译失败且输出含 LifetimeError(TPC 解析不了 new、也产不出 LifetimeError,故与 NegativeTest 的 TPC 运行器分开);默认跑 EscapeTest / EscapeMethodTest / EscapeXmodTest,支持 --only/--rebuild-includes。

NewTest:按 MemhubTest 的写法补上 new memgr(m) hlife Point(5,6) 段(memhub.MemBuddy(arena, 65536))。README 同步负向运行器用法。
2026-10-08 17:50:53 +08:00
TermiNexus 42ca901b28 test(new): 新增 NewTest 工程;两个回归脚本支持 --escape/--only 单独跑
NewTest:M2.4 new 描述符冒烟(stack→alloca、heap→malloc;memgr 段待确认管理器 API,非法组合以注释列出)。

regression_test.py / SequentialRegressionTest.py 新增 --escape(只跑生命期/逃逸 + new 相关项目)与 --only(逗号分隔指定项目);两者都会在 Test/<名> 与仓库根 <名> 查找 project.json / project.vpj,故根级 Escape* 项目也能直接跑;--escape 忽略 README 难度顺序。

README.md:新增「一·附 生命期/逃逸相关测试」一节,列出 5 个项目的期望结果与单独运行命令。
2026-10-08 17:47:24 +08:00
TermiNexus f5544eed80 chore(syntax): DefineTest/FormatStringTest 迁移到 cif/defined() 条件编译
DefineTest 的条件编译用例(基础/elif-else/cifdef-cifndef/平台宏/嵌套/表达式/跨模块/守卫)全部改写为 cif-celif-celse + defined();FormatStringTest 的 isptr 判断由 c.CIf 改为 cif;README 同步新语法口径。
2026-10-07 19:02:56 +08:00
TermiNexus 30b14bc477 chore(test): 回归脚本去除 *_mlir 目录候选
构建产物目录不再带 _mlir 后缀,两个回归脚本的目录探测候选同步收敛为 temp/output。
2026-10-07 19:02:52 +08:00
TermiNexus ee6461be46 chore(comments): Test 仓注释英文化(R11)
把 81 个 .vp 文件的中文 # 注释与三引号文档串改写为简洁英文,每个连续注释块 <=2 行;运行时中文字符串字面量(testcheck.begin/print 等用户可见消息)保持原样。骨架比对 HEAD 与工作区 112 文件漂移 0,全量 77/77 顺序回归通过。
2026-10-05 22:43:38 +08:00
TermiNexus aa5a7e7250 chore(syntax): Test 仓 R1 + R12 迁移
R1:T | t.CPtr -> T*(40 文件 / 1121 处;含多级 **、强转位 (T*)(x)、下标内 list[AST*]);引号前向引用 'Rect' | t.CPtr 26 处按例外保留,T | t.CPtr | t.State 25 处因 T* 后不能接 | 保持原联合写法。

R12:i = 0 + while i < N: + 尾 i += 1 -> or i in range(N):(10 文件 / 42 处;含 <= -> range(EXPR + 1)、带注解初始化 i: int = 0、尾 i = i + 1)。余 20 处经守卫判定不可安全改写(复合条件 1、尾部非自增 8、体内重绑定/continue 5、while-else 2、循环后仍被读取 2、找不到初始化 2)。
2026-10-05 21:18:37 +08:00
TermiNexus f5da836fbb chore(test): 迁移测试夹具到新语法
机械规则 R2/R3/R4/R6/R7/R8/R13 + R16 保守子集,共 86 文件 2127 行。R1(T | t.CPtr)与 R12(while 下标循环)未做,仍列为待办。全量 77/77 顺序回归通过。
2026-10-05 19:59:02 +08:00
TermiNexus c9d741c202 test(WebTest): 测试地址由 example.com 换为 cn.bing.com
example.com 在当前网络下不可达(HttpClient 12s 超时),WebTest 的 HTTP GET 无超时保护会无限阻塞,导致顺序回归在此超时中断。改用实测可达的 http://cn.bing.com/ ;DNS 用例(connect 80 端口)同步换主机。
2026-10-05 16:36:42 +08:00
TermiNexus defac67a95 fix(StringIterTest): 消除重复 main,恢复 inline list[struct, N] 覆盖
inline_test.vp 与 main.vp 各定义一个 main,过去靠 -Wl,--allow-multiple-definition 静默丢弃其一;去掉兜底 flag 后 ld.lld 报 duplicate symbol: main。现将 inline_test 的入口改名为 inline_array_test(),由 main.vp 显式 import 并调用。
2026-10-05 14:15:18 +08:00
TermiNexus 44ce29200e refactor(test): 收尾 6 个测试用例的新规范语法迁移
CoroTest/DefaultArgTest/FormatStringTest/FuncTest/MLIRLiteTest/ThreadingTest 的 App/main.vp 从旧写法(t.CInt/t.CPtr 注解、多行单语句体)迁到新规范(int 短别名、T* 后缀、单语句体并一行),为既有迁移的遗留未提交部分。验证:TPV 自举产物顺序回归 77/77 全通过。
2026-10-05 09:24:42 +08:00
TermiNexus 3f532e665d chore(test): 移除工程配置里的 -Wl,--allow-multiple-definition 兜底
该 flag 会静默吞掉真实重复符号(PYI_BUF_SIZE 一类),违背 fail-fast。逐个工程移除后由 TPV 自举产物重建并运行验证,顺序回归 77/77 全通过。顺带提交 ProbeGen 配置 project.vpj -> project.json 的重命名(回归脚本只认 project.json)。
2026-10-05 09:22:53 +08:00
TermiNexus 55a517fbd2 test(llvmlitest): 断言迁移到 MLIR 口径 + 内存池放大到 80MB
mlirlite 发射器改输出 MLIR 文本后,本测试 58 条断言仍在断言旧 LLVM IR 文本
(i32*、add i32、icmp sgt、asm sideeffect、label %then、@.str = 等)→ 全部
迁移到实际 MLIR 形态(!llvm.ptr、llvm.add、llvm.icmp "sgt"、
llvm.inline_asm has_side_effects、^then:、llvm.mlir.global 等)。属性用例按
README §3.3「记录但不渲染」改为签名正向 + 属性文本负向断言。

同时 POOL_SIZE 512KB → 80MB:本测试 27 用例共享同一池(不像 MLIRLiteTest
每用例切子池),mlirlite 单次 PrintModule 需约 1MiB 缩进缓冲,512KB 会池耗尽。

本文件另含既有未提交的注解现代化改动(X | t.CPtr → X*、t.CChar | t.CPtr →
str 等),一并纳入本次提交。结果:PASS 80 / FAIL 0。
2026-10-04 21:51:34 +08:00
TermiNexus fb8b56f2f1 fix(test): 回归脚本输出目录候选补 *_mlir 变体,修单端 MLIR 下 exe 定位失败
单端 MLIR 后 OutputDir = {BuildDir}/output_mlir(Config.mlir_dir_suffix()),
但 SequentialRegressionTest.find_output_dirs 与 regression_test 只探
output/ 与 .tpv_build/output,导致编译成功却报"未找到可执行文件"
(MLIRLiteTest 实测)。两处补 *_mlir 变体并优先探测(旧 output/ 可能
残留同名旧 exe)。
2026-10-04 20:54:56 +08:00
TermiNexus 209e8ed72e refactor(test): 发射器改名 mlirlite(LLvmLiteTest/MLIRLiteTest/NoVTableTest)
- 与 TransPyV 单端 MLIR 同步:llvmlite -> mlirlite(import/限定名/注释)
2026-10-03 19:26:54 +08:00
TermiNexus 579eb52561 fix(mlirlitetest): 子池 arena 精确取 2MB 块 + 主池 80MB + arena 失败 fail-fast
现象一(池再次耗尽):alloc size=2097152 needed=2097168 order=17 失败,used=62914560/池容量=67108576。根因:按 2MB 申请,memhub 的 needed=size+HEADER(8)+CANARY(8) 使 2MB+16 放不进 order16(2MB) 块 ⇒ 向上取 order17(4MB),每块浪费一倍;16 个子池 = 64MB 把 64MB 主池吃干。

现象二(随之崩溃):alloc 失败返回 None 后 MemBuddy(None, size) 在 memhub.vp:653 `self.free_lists[i] = 0` 写空指针 → 0xC0000005 av_addr=0x0。

修复:SUB_POOL_SIZE 取 2097136(=2MB-16) 使 needed 恰为 2MB、正好取到 order16 块(不再浪费一倍);POOL_SIZE 64MB→80MB 留余量;新增 _sub_arena 只返回裸指针(可安全跨函数返回,MemBuddy 实例是栈值不可返回其指针)并对 arena 分配失败 fail-fast。
2026-10-03 16:33:24 +08:00
TermiNexus 4203b4754f fix(mlirlitetest): 子池改在 main 帧内构造,修复返回本帧栈对象指针导致的悬空写穿
现象:Test 1 第一次 alloc 就报 memhub "_split_to_order max_order 非法(字段被写穿): max_order=450754216 usable_size=2096864"(子池对象只有 max_order 是垃圾、相邻字段正常)。

静态查 IR 定根因(temp/a2/a2d629ccc917eaa6.ll):_sub_pool 内 %13 = alloca %MemBuddy,__before_init__/__init__ 都作用在这个栈对象上,最后 ret %MemBuddy* —— Viper 中无 __new__ 的类实例是值语义(降级为栈 alloca),返回"指向本帧局部对象"的指针即悬空;调用方第一次 alloc 读 max_order 落到复用后的栈垃圾。

修复:删掉返回 MemBuddy* 的 _sub_pool 助手,改为在 main 帧内逐测试构造子池(与原代码在 main 建池同款;main 内同样的 alloca %MemBuddy 一直有效,故原版能跑到 Test 14)。
2026-10-03 16:31:46 +08:00
TermiNexus ceccd4aa1e fix(mlirlitetest): 每测试独立子池 + 主池调大,修复渲染器按函数分配累积耗尽池
现象:跑到 Test 14 时 memhub 4MB 池耗尽 → "[MLIR-FAIL] MLIR 渲染: 常量/别名表分配失败"。

根因(按存活块账目反推):mlirlite 的 _MlirTablesInit 在**调用方池**里每次 FunctionPrint 重分配约 35–45KB 的常量表/别名表/scratch 且不释放;15 个测试共用一个 4MB 池 ⇒ 按函数泄漏跨测试累积,加上每节 64KB 输出缓冲与 32KB GV 缓冲,到第 14 个吃干。

改为"主池 + 子池":主池仅用于给每个测试切一块 SUB_POOL_SIZE(2MB) 子池(_sub_pool),测试内 IR 对象与渲染器 scratch 全部落在自己的子池,互不叠加;POOL_SIZE 4MB → 64MB(15 个子池,伙伴分配器按 2 的幂取块)。
2026-10-03 16:27:50 +08:00
TermiNexus 63cab96f53 fix(generictest2): 去掉 generic_swap 的幽灵类型形参 [T]
T 未被签名/函数体任何位置引用,签名形参注解为 IntPair | t.CPtr,泛型函数类型实参推断无法为它找到形参槽(_annotation_refers_type_param 返回 0),触发 fail-fast(禁止静默默认 int)。该函数本就不需要泛型,去掉 [T] 即语义正确。
2026-10-03 15:20:33 +08:00
TermiNexus 7148f8b58d test(zlib-dbg): 加 UINT8PTR/BYTEPTR 元素符号性对拍,验证字节>=128 被符号扩展的假设 2026-10-03 13:18:43 +08:00
TermiNexus 48fabc461a test(zlib-dbg): 加真实频率统计探针(zdeflate_count_freqs 对拍朴素直方图) 2026-10-03 13:16:58 +08:00
TermiNexus 6083d17826 test(zlib-dbg): 加字面量码表探针(直方图/no_code/sum15 完整码校验),定位 comp 远小于熵下限的根因层 2026-10-03 13:15:06 +08:00
TermiNexus 3466b61c58 test(zlib): 启用 test_huffman_tree(前置到干净堆)并补 257 符号全量往返,复现码表构建缺陷 2026-10-03 12:49:34 +08:00
TermiNexus 6e60a89b5c test(zlib-dbg): 去掉 import stdio,验证 f-string 隐式提供 snprintf 声明 2026-10-03 12:46:36 +08:00
TermiNexus 338e28383c fix(zlib-dbg): 补 import stdio,f-string 需要 stdio 声明的 snprintf 2026-10-03 12:40:41 +08:00