Commit Graph
193 Commits
Author SHA1 Message Date
TermiNexus 4aa8d399ff fix(zlib): zbit_writer 位写入 |= 右值显式窄化为 BYTE(修 augmented assignment 右值过宽报错) 2026-10-12 21:05:48 +08:00
TermiNexus 7f82bec5d1 chore: 全仓同步 TPV→VPC 注释改名与 range(int(...)) 显式收窄适配 2026-10-12 20:59:35 +08:00
TermiNexus 44c1bc4168 fix(mlir): 窥孔取 store 值改按括号配平,修聚合类型被截在第一个逗号 2026-10-12 18:24:55 +08:00
TermiNexus 94ae0d32b7 feat(ast): 整型字面量支持显式宽度后缀 _int<N>/_uint<N>/_i<N>/_u<N> 2026-10-12 18:24:54 +08:00
TermiNexus fb365a1707 chore: 改名同步 TransPyV -> ViperC(源码/配置内的纯替换) 2026-10-12 15:06:47 +08:00
TermiNexus ccd7434c5a chore: 改名同步 TransPyV -> ViperC(.gitignore/文档/脚本) 2026-10-12 15:02:19 +08:00
TermiNexus 38047cbed1 chore: 引用路径改名 TransPyV -> ViperC 2026-10-12 14:28:40 +08:00
TermiNexus bca23ffa06 fix(mlirlite): MLIR 间接调用点也过 alias 解析,callee 不再悬空
no-op bitcast(含函数指针 bitcast)被 alias 机制省略后,参数用法会改写成别名目标,
但 llvm.call 的 callee 位置原样写出 → 悬空 %N,mlir-opt 报 use of undeclared SSA value /
definition of SSA value has type 'i8' but previously used here with type '!llvm.ptr'。

- _MlirCall:callee 走 _MlirResolve,并用解析后的名字判断直接/间接调用
  (别名解析可能把 callee 指到 @符号,那就成了直接调用,不能再写 !llvm.ptr)
2026-10-12 13:18:51 +08:00
TermiNexus 4914311014 fix(mlirlite): 常量表与自动常量名空间(%c<seq>)按需扩容
原实现三处都钉死在 MLIR_CONST_CAP(512):常量表满 → MlirFail("constant table overflow")、%c0..%c511 用尽 → MlirFail、_MlirMarkUsedCName 里"更大的后缀不可能冲突"的假设。这些只是资源限制,不该中断编译。

- 新增 _MLIR_ConstCap 活容量与 _MlirConstGrow(池内翻倍扩容常量表 + 已用名表并拷贝旧内容)
- 常量表满、名字空间用尽改为扩容后重试;_MlirMarkUsedCName 记录任意 c<digits> 并先扩容再置位
- _MlirTablesInit 按活容量分配/清零,复用分支保留已扩容容量
2026-10-12 12:40:20 +08:00
TermiNexus cc7cfdb4af fix(mlirlite): alias 表按需扩容;工厂改 new memgr;define 位宽/截断配套
- mlirlite/__function.vp:_MlirAliasAdd 的 512 条硬上限改为 _MlirAliasGrow 池内翻倍扩容,不再把资源限制当编译错误
- mlirlite 类型工厂改 new memgr(pool) 返回值(消除栈逃逸);__module.vp 补 triple/datalayout
- viperlib.get_digit_count 用 uint(base) 显式声明无符号除法语义(新 AugAssign 符号规则)
- string.vp:strcpy/strcat/strncpy/strncat/memset/memset32/memcpy/memmove 加 @life(noescape(...))
2026-10-12 12:38:15 +08:00
TermiNexus 244179eac7 fix(mlirlite): MLIR 模块头补齐 llvm.target_triple/llvm.data_layout 属性
MLIR 路径原先只在模块头写注释、不落 target triple/datalayout;而 mlir-translate
只从 MLIR 模块属性取值,project.vpj 的 llc 也没有 -mtriple 兜底,因此降级出的
LLVM IR 完全没有 target triple。后果是 opt -passes=asan 按非 Windows 目标选择
固定 shadow 偏移 1<<44,与链接的动态 ASan 运行库实际映射的 shadow 基址不一致,
第一个被插桩的访问即踩到未映射的 shadow 页而崩(现场:启动期
__traceback_install_ctor -> Install -> strcpy 读字面量)。

改为输出 module attributes {llvm.target_triple, llvm.data_layout},使 IR 头随
mlir-translate 降级带出(同时让 llc 拿到正确 target,不再依赖宿主默认)。
2026-10-11 21:21:02 +08:00
TermiNexus 6bd5a6e7a4 refactor(mlirlite): 语法迁移(rawptr/novirtual/解引用写入) 并修正 DerefAs 迁移为整对象拷贝
REnum 变体构造(*LLVMType.X(...))返回的是栈 alloca 地址,不能跨帧存活;原 c.DerefAs(ptr, LLVMType.X(...)) 是'同帧 load+store 拷贝'。机械迁移成 *ptr = LLVMType.X(...) 会把栈地址写进 pool 缓冲并返回(栈逃逸),导致 SpecTypeBits 读到非变体返回 0(现场: enum 宽度推断失败)。改为 *ptr = *LLVMType.X(...) 恢复同帧整对象拷贝;*result_ty_ptr = *result_ty 同理
2026-10-11 12:47:06 +08:00
TermiNexus 00ddb296ac fix(narrow): 字节缓冲写 int/算术结果改用 char(...)(sys/_fakeduck)
sys.vp cmd 解析 ch:int 写 buf;_fakeduck ch±32 算术提升为 int。目标均为 bytes(i8),RHS 为 32 位,触发 32->8 隐式窄化。其余 for ch in <str> 形态 ch 是 char,同宽不报错
2026-10-11 11:58:57 +08:00
TermiNexus 0f37f2fde9 revert(narrow): 撤销 define 位掩码的显式强转(编译器已按值推断位宽)
TPC 已修复 CDefine 常量位宽推断(无符号 32 位高半区不再误判 i64),X | DEFINE 现为 i32;fileio access |= GENERIC_*、tarfile px.mask |= PAX_*、ast/parser node.flags |= FLAG_IS_* 无需再显式强转,恢复原写法
2026-10-11 11:46:38 +08:00
TermiNexus 7e6ed0db2e fix(narrow): 32 位字段/变量 |= 64 位 CDefine 改用显式窄化转换
CDefine 常量按 64 位处理,X | DEFINE 的结果即 64 位;赋回 32 位字段触发隐式窄化(单个常量赋值有豁免,但 OR 表达式没有)。fileio access |= GENERIC_* 用 ULONG(...);tarfile px.mask |= PAX_*、ast/parser node.flags |= FLAG_IS_* 用 int(...)
2026-10-11 11:42:25 +08:00
TermiNexus e308e6e734 fix(narrow): viperlib vsnprintf 指数符号写字节改用 char(...) 包裹三元
ptr[0] = <int字面量> 属常量豁免;A if c else B 是 int 三元表达式,写入 bytes 元素触发窄化。显式 char(...) 包裹 e/E 与 +/-(各 2 处,共 4 处)
2026-10-11 11:38:14 +08:00
TermiNexus 9d5028bc61 fix(narrow): byte 缓冲写 32 位掩码结果改用 uint8(...)
base64 解码输出、zipfile zf_w16le/zf_win32le、zlib adler/gzip 尾写:目标为 bytes/uint8*/BYTE*(8 位),RHS 为 32 位表达式,触发隐式窄化;统一加 uint8(...)
2026-10-11 11:06:02 +08:00
TermiNexus 3dd5bca28e fix(narrow): hashlib 摘要写字节改用 uint8(...)
sha256/sha1/md5 的 digest 阶段把 32/64 位掩码结果写入 bytes 元素(i8),触发隐式窄化;统一加 uint8(...)(与 __sha512 一致)
2026-10-11 11:05:05 +08:00
TermiNexus 19e4ef26a2 refactor(fileio): File/FileW.write 长度形参 ULONG 改为 sizet
与 read_all 保持一致:长度来源多为 sizet/strlen,形参用 sizet 可避免 64->32 隐式窄化;内部对 count>0xFFFFFFFF 返回 ERR,仅在 WriteFile 处显式 ULONG(count)
2026-10-10 22:15:47 +08:00
TermiNexus 705de51459 fix(includes): 消除隐式窄化(string.strlen → int)
规则收紧后,6 处 string.strlen()(sizet/64 位)隐式落进 int 会报隐式窄化:argparse.vp:204/332、ast/parser.vp:3202/3203/3255/3256 改为显式 int(...);另 gzip.vp:62 的 read_all 容量去掉多余 ULONG(...)(形参已是 sizet)。
2026-10-10 22:09:59 +08:00
TermiNexus aa88e46b5d 将 w32 库改为 win32 2026-10-10 21:58:27 +08:00
TermiNexus 1c9447dc82 refactor(fileio): read_all 容量形参 ULONG → sizet(File/FileW)
与 f.size()(LONGLONG)同宽,消除'64 位尺寸进 32 位形参'的隐式窄化诱因;内部 min(file_size, cap-1) 全程用 sizet,只在交给 ReadFile(ULONG) 处显式窄化,且 cap-1 > 4GiB-1 直接返回失败(单次读上限 DWORD),不再静默回绕。
2026-10-10 21:57:39 +08:00
TermiNexus 466c777f34 feat(mlirlite): 常量渲染失败时报出 (类型, 值),便于定位 unsupported constant operand form
MlirFail 无栈回溯,原报文只有 'unsupported constant operand form',无法判断是哪种非常量形态(指针/聚合类型字面量或常量表达式)。新增 _MlirConstFail:把 MLIR 类型文本与常量文本一并打印。
2026-10-10 20:07:03 +08:00
TermiNexus 0d677bc6f8 将 w32 库进行完整的清理 2026-10-10 18:03:44 +08:00
TermiNexus 7f32042c21 feat(parser): new 的类型改按注解规则解析,认 [N]T 前导数组声明符与 T* 后缀 2026-10-09 18:44:42 +08:00
TermiNexus 17b1d6bb60 feat(tarfile): 纳入 tar 归档读写模块
- 读:ustar 头(含 prefix 字段)、GNU L/K 长名与长链接头、PAX x/g 扩展头(path/linkpath/size/mtime/uid/gid/uname/gname)、GNU base-256 数值字段;归档整体读入内存,.tar.gz 先解压

- 写:ustar 头;路径或链接目标超长时补一条 PAX x 记录

- 用法:tarfile.TarFile(path, mode);tarfile.error() 携带失败原因
2026-10-09 15:01:02 +08:00
TermiNexus be62587521 feat(parser): new 接受无实参括号的类型原子;回收 '*' 伪错时同步回退错误位置
- _parse_new_expr:类型原子(Name/Attribute/Subscript)与 T(args) 都接受,New.args 可为 None;非类型原子仍在原地 fail-fast(不让错误漂到 class 未注册那种远处)

- _parse_type_ann 的 ptr_level 回收只还了 error_count,没还 _g_parse_err_line/_col/_msg;而 _record_parse_err 只记第一条,于是 : char*(行尾 '*' 被当乘法、右操作数缺失)留下的过期位置会顶掉后面真正的语法错误(现场:EscapeTest 第 13 行 new stack char 被报成第 6 行)

- 回退判据用记录是否在本次解析中改变:快照已非 0(更早的真错误)时回退是空操作
2026-10-09 14:55:43 +08:00
TermiNexus bfc773787d feat(lifetime): stdlib.free 标注 @life(willFree(p)),声明实参在调用后失效
P2 标注驱动:编译器据此把调用点对应实参变量标为已失效,其后读/传/再 free 报 LifetimeError。
2026-10-08 21:28:55 +08:00
TermiNexus 770e389360 fix(argparse): 字符串参数的 NULL 默认值不再写入
NULL 默认值写进结果会让键存在但值为 NULL:has() 误报参数已给出,函数末尾的 required 检查对字符串参数永远不触发。改为 default_str 为 None 时跳过写入。
2026-10-08 20:35:17 +08:00
TermiNexus 788c52b749 fix(tomllib): 单引号处误用双引号字符串,改为字符字面量
char 形参与 char 比较位置写成「双引号包单引号」(实为 i8* 字符串):形参处报 CastError(implicit pointer-to-integer),比较处被 C 哨兵规则静默 ptrtoint 成恒假(TOML 单引号字面量字符串根本解析不出来)。7 处统一改成字符字面量,与 lexer.vp 同款写法一致。
2026-10-08 20:03:34 +08:00
TermiNexus 76deaa27bf feat(mlirlite): 新增 IRBuilder.build_store_at_entry,支持在入口块写入以建立支配关系
M3 owned slife 的所有权影子标志必须在函数入口块置 0:赋值语句可能落在 if/while 里而运行期不执行,那种路径上出口 free 的是未初始化栈垃圾。实现照搬 build_alloca_at_entry:文本插到入口终止符之前,保证支配所有路径。
2026-10-08 20:03:33 +08:00
TermiNexus 77c8d4f9e4 chore: 纳入 ctraits.vpnci 与 tomllib/(与已删除的 ctraits.vpi 配套) 2026-10-08 17:50:26 +08:00
TermiNexus e25e8958f0 WIP 快照:includes 现有改动(含 M2.4 new 描述符的语法支持)
语法侧(M2.4):ast/base.vp 枚举尾部追加 ASTKind.New;ast/exprs.vp 新增 NEW_SRC_*/NEW_LIFE_* 与 class New;ast/parser.vp 新增 _is_new_expr/_parse_new_expr(new 为软关键字,不进 Keyword 表,new=1/new.x/new(1) 仍是标识符);ast/__init__.vp 再导出 New 与常量。

其余为既有 WIP 改动一并快照,保持基线一致(39 文件,+312/-237)。

未纳入:ctraits.vpi(已删除)、ctraits.vpnci、tomllib/(均未跟踪)。
2026-10-08 17:45:31 +08:00
TermiNexus e3cdb190dc fix(os): _posix._stat 改为 _mbuddy 堆分配,消除返回栈地址的悬垂
_stat 原在栈上构造 posix.Stat 并返回其地址,函数返回后指针悬垂(与其 docstring 声明的 '_mbuddy 分配、调用方 free' 不一致)。改为按契约堆分配,失败时 free。
2026-10-08 12:10:30 +08:00
TermiNexus 05b2b7162d feat(stdarg): arg 声明补返回类型;viperlib 改用 arg(T) 读转发 va_list
stdarg.vp 的 arg 原本缺返回类型(与 va_arg 不对称,存根拿不到可用返回类型),补 -> t.CPtr 并注明它是编译器拦截的糖;viperlib 的 vsnprintf 第 4 个形参 ap 改名 args(vprintf 式转发的 va_list 是「按名 args 解析」的约定),内部 24 处 va_arg(ap, ...) / va_arg(ap) 全部改为 arg(...) / arg(),import 收敛为 from stdarg import arg。
2026-10-07 20:15:25 +08:00
TermiNexus 344ea5c3cd docs(ctraits): 注解与示例改用 cif 语句,去掉已删除的 c.CIf
ctraits.vpi 的模块/函数 docstring 与示例仍写 c.CIf(...);条件编译已改为原生 cif/celif/celse,示例同步为 cif ctraits.isptr(x):。
2026-10-07 19:09:54 +08:00
TermiNexus 18136d898f feat(lang): ast 解析器支持 cif 三件套与值引用注解,通用槽改 &temp void
ast/parser.vp:新增 cif/celif/celse 语句解析(必要时软关键字判据)与 &T / &temp T 参数注解(内部标记 t.CRef / t.CTempRef);_variant.vp / hashtable.vp / _dict.vp 的通用存储槽形参由裸指针改为 &temp void(即 i8**),避免 rawptr 的 ABI 歧义;testcheck.vp 的 check 调整为 check(cond, ok_msg, fail_msg),条件成立时静默。
2026-10-07 19:02:48 +08:00
TermiNexus 92c2c324cb fix(mlir): 数组包裹的具名结构体回查登记表以补回 packed
build 期的 TypePrint 在具名结构体登记表发布前渲染类型文本,内嵌的具名结构体体
没有 packed;打印期 MlirTypeText 只对扁平 !llvm.struct<" 前缀回查登记表,
!llvm.array< 整段直通,于是同一个 identified type 在模块内出现 packed 与非 packed
两种体,mlir-opt 报 identified type already used with a different body
(现场 Elf64_Phdr:数组元素体无 packed、llvm.load 结果体有 packed,两处字段表
逐字符比对完全相同,只差 packed 关键字)。

新增 _MlirArrayMlirText,只重新转换数组元素类型,使其与其余位置一样回查登记表;
抽出共用的 _MlirArrayXPos / _MlirArrayBody,_MlirArrayText 改为委托(行为不变)。
2026-10-07 15:41:52 +08:00
TermiNexus a8403ee550 chore(detsite): MLIR 类型文本与区域渲染路径补插桩
--detection 的 [FREEFRAME] 取证原先报 site=?:已注册的 17 个 DETSITE 标签全在
结构体/表类分配上,类型文本路径一个都没插。本次新增 34 个标签(18..51):
- mlirlite:_type_str 类型文本、build_call 参数/函数类型文本、常量值类型文本、
  区域渲染 scratch(tb/la/pr/r1/r2/nm/vl/tyb/nb/ps)
- 与之配套的 pool.alloc 全部改用 alloc_tagged,detection==0 时无额外开销。

据此定位到 [FREEFRAME] 写者:TranslatorGenMixin._stg_field_zero_text 的 160B 缓冲。
2026-10-07 15:16:40 +08:00
TermiNexus 825cd2b027 fix(mlir): 全局初始化器区域缓冲溢出不再误报为模块缓冲溢出
- GV_REGION_BUF_SIZE 由 32KB 提升到 4MB,并改用 malloc 分配(原走模块子池,容量受限)
- 新增 _MlirGvOutTrunc 与 _append_gv:区域缓冲溢出独立上报,不再置位模块截断标志
- MlirGvResetScratch 负责释放这两块 malloc 缓冲

复现:font 这类嵌套聚合全局初始化器超过 23 行(368 元素)即误报
module text exceeds output buffer,实际模块缓冲 8MB 远未写满。
2026-10-07 14:24:06 +08:00
TermiNexus 825919b202 fix(compiler): 修复 ViperApps 暴露的 3 处缺陷(vqt6 返回注解 / MLIR 常量命名 / scratch 复用)
1) vqt6/__init__.vp:6 处类实例返回注解由引号前向引用(QAction/QMenu/QTreeWidgetItem)改为 T*——引号前向引用解析为结构体值类型,而实例是指针,致 QAction Foo*→Foo CastError(4 个 Qt 系工程失败)。

2) mlirlite/__function.vp:常量自动 SSA 名 %cN 避让用户同名标识符(形参 c1/c2 与常量 %c1 冲突 => mlir-opt redefinition of SSA value,致 ViperMNIST 失败)。

3) mlirlite/__function.vp + __module.vp:新增 MlirTablesReset,使打印窗口内的表/scratch 跨函数复用(原每函数分配约 153KiB 且窗口内不回收 => 1GiB 主池被榨干,致 ViperFLProject parse scratch allocation failed)。
2026-10-07 08:48:03 +08:00
TermiNexus 587d989dec chore(messages): includes 运行时中文字符串英文化
把 includes 下 11 个文件(memhub 94、mlirlite/__function 71、ast/parser 54、mlirlite/__module 41、mlirlite/__types 28、ast/lexer 8、ast/tokens 4、sys 2、traceback 1、mlirlite/__builder 1、requests/https 1)的运行时诊断/报错字符串(OOM/MEM/FREEFRAME/MLIR 报错/AST 报错/栈转储横幅等)由中文改为英文。

口径:只改字符串字面量内部文字,行数零变化(+307/-307);printf 格式符与转义序列的多重集合逐一校验不变(_strcheck 异常 0)。验证:三重重编 SUCCESS(184.28s)+ 全量 77/77 顺序回归通过 + VET 编译 SUCCESS / --search-paths 7 条 exit 0。
2026-10-06 12:23:45 +08:00
TermiNexus c0d56b127d chore(comments): includes 头注释英文化(R11 收尾)
把 includes 下 64 个 .vp 的文件头注释(含 traceback.vp 第 13-427 行的整块文件级说明)以及 2 处漏网的正文中文注释(ast/lexer.vp、json/__writer.vp)与 1 处中文 docstring(memhub.vp)逐行译为英文;同步把 fltk/gen_ffi.py 的生成模板与其自身注释英文化,使重新生成仍为英文。

只改注释/文档串文字:行数与代码逐字节不变(骨架比对 140 文件漂移 0),运行时中文字符串字面量 305 处保持原样。验证:三重重编 SUCCESS(170.21s)+ 全量 77/77 顺序回归通过 + VET 编译 SUCCESS / --search-paths 7 条 exit 0。
2026-10-06 09:42:25 +08:00
TermiNexus 14ba84db8e chore(syntax): R1 typedef 右值改用 T*(21 处)
编译器已支持 typedef 右值类型位(305242aa),故解除 R1 的 typedef 右值例外:stdint.vp 19 处(INTPTR/BYTEPTR/CHARPTR/WCHARPTR/*PTR 等)、stdarg.vp 1 处(va_list)改为 T*,AST 与 T | t.CPtr 逐字段同形。
2026-10-05 20:58:38 +08:00
TermiNexus af59a752cd chore(syntax): R16 完整 C 式 const/volatile 迁移
把剩余 t.CConst | X 全部改写为前缀描述符 const X(AST 逐字段同形):

- t.CConst | VOIDPTR -> const VOIDPTR(win32console/win32file/win32memory 共 7 处);

- char | t.CConst* -> const str(winsock2 x2);t.CConst | BYTEPTR -> const BYTEPTR(zinflate);

- typedef 右值:LPCSTR = const str、LPCWSTR = const uint16*(stdint/win32base);

- parser.vp:typedef 右值按类型位解析(_IsCTypedefAnnotation),typedef X = T 语法糖同一条。
2026-10-05 20:36:35 +08:00
TermiNexus 03450a71ff fix(mlirlite): 局部窥孔优化每个函数体只执行一次
PrintModule 会按 STUB/TEXT/FULL 三次 dump 同一模块,而 FunctionPrint 每次都跑 _peephole_opt;T2(entry-slot store→load 转发)不是幂等变换,第二遍会误删仍有 load 指向的 entry alloca,留下悬空 SSA 名(mlir-opt: op using value defined outside the region)。给 Function 加 PeepDone 守卫,优化只作用于 builder 产出的原始文本。
2026-10-05 19:58:39 +08:00
TermiNexus c4170871c2 refactor: 去 t.CPtr(&a) 冗余包装(R15)
规范第 15 行:&a 已返回 T*,无需再 t.CPtr 强转。仅改单参且操作数为普通变量名的形态(t.CPtr(v) / t.CPtr(0) 等非取地址形态保留)。includes 5 文件 / 23 行:w32/fileio.vp、os/_posix.vp、os/_win32.vp、shutil.vp、subprocess.vp。验证:TPC 自举三重重编 SUCCESS;全量 77 项顺序回归通过。
2026-10-05 17:55:43 +08:00
TermiNexus 0055ab7ea7 refactor: rawptr[T] -> T* 与 t.CConst 前缀迁移(R14/R16)
R14:rawptr[X] -> X*(41 文件 / 2037 行改动),X 含模块限定名与嵌套下标(rawptr[GSList[NameEntry]] -> GSList[NameEntry]*)。保留 6 处 rawptr[t.CPtr](规范例外:存纯裸指针);# 注释与字符串里的 rawptr[...] 属元语法描述,未动。 R16(保守子集):t.CConst | str/bytes -> const str/bytes,t.CConst | char | t.CPtr -> const str;typedef 右值位置豁免(const str 在该处无法注册,与 R1 同源)。 验证:TPC 自举三重重编 SUCCESS;TransPyV.exe 全量 77/77 顺序回归通过。
2026-10-05 17:38:21 +08:00
TermiNexus 0ef4ba9634 refactor(includes): R12 收尾——再改 48 处可确定安全的计数 while 循环
在 R12 保守判定基础上放宽两处(仍保证语义等价):1) 允许 <= 条件,改写为 range(expr + 1)(while 结束后计数器为 n+1、for range 后为 n,已被「循环后不引用计数器」守卫覆盖);2) 初始化行只要求是「同块内最近一次对计数器的写入」,不再要求紧贴 while(中间不得读写该计数器)。

其余守卫不变:界表达式必须裸(无 and/or/比较)、体内无 continue、体内仅末尾一次 += 1、无嵌套重绑定、无 while-else、循环后同一函数内不再引用计数器。TransPyV 侧同步 12 处。

验证:bootstrap 三重重编 SUCCESS(无 vast_c 解析回退);全量 77/77 顺序回归通过。
2026-10-05 16:36:36 +08:00
TermiNexus e71daeea0e docs(includes): R11 注释英文化——75 个文件的中文注释改写为英文短注释
按规范「注释只讲解作用,不掺杂历史原因,尽量英文」:把 includes 下 75 个 .vp 的中文 # 注释与三引号 docstring 改写为英文,每个注释块压到 2 行以内。

保留要点:作用、约束、危险警告(不得/必须/注意)、ABI 与类型约定(如 BYTEPTR | t.CPtr = i8** 的跨模块坍缩坑)、位宽/长度约定、fail-fast 要求、内存与句柄所有权。

未动:文件头注释(规范豁免,仍是中文)、运行时中文字符串常量(printf / fatal_error / MlirFail 等用户可见消息,属代码字面量)。

验证:独立脚本比对 HEAD 与工作区的代码骨架(剥离 # 注释与三引号 docstring 后的非空行)——75 个文件逐字节一致;行尾 CRLF/LF 未被改动;全文剩余中文仅 547 行头注释、0 条行尾注释。bootstrap 三重重编 SUCCESS;全量 77/77 顺序回归通过。
2026-10-05 16:18:44 +08:00