TermiNexus
|
e80284a6d5
|
refactor: 全量迁移 includes 到新规范语法
按根目录 新规范 迁移 R1/R2/R3/R4/R6/R7/R8/R9:指针 T* 后缀、内建类型短别名、c.Addr/c.Deref 单目化、c.Asm 改 __asm__、t.CDefine 改 define 软关键字、t.CEnum 改 enum。R4 对内建 cast 多参实参保留 c.Deref 原写法(单目化会致 TPC 类型退化)。验证:includes 52/52 编译通过,TransPyV 自举产物顺序回归 77/77 全通过。
|
2026-10-05 09:04:46 +08:00 |
|
TermiNexus
|
aecdf27132
|
feat(mlirlite): 新增调用点记录 API 供 --traceback 旁文件(关闭时零开销)
新增 DebugSetEnabled / DebugNoteFunc / DebugClearFunc / DebugNoteLine /
DebugResetFunc / DebugTakeText 与内部 _DebugNoteCall;build_call 在启用时把
(调用方, 被调方, 当前源行) 追加到可增长文本缓冲,供每模块 DebugTakeText 取出
写 .vpcall。默认(未开 --traceback)不启用,输出不变。
|
2026-10-04 22:38:07 +08:00 |
|
TermiNexus
|
5dad869a40
|
fix(mlir): 全局初值 region 草稿缓冲改为单次 PrintModule 复用,修子池耗尽
每个全局初值 region 逐全局 alloc leaf/ins 各 32 KiB、每个初值节点 alloc
4 KiB 类型/符号草稿且从不释放:结构体/vtable 全局多的模块(MLIRLiteTest
#12)在约 2 MiB 模块子池上耗尽,报"零初值类型缓冲分配失败"。
改为按 PrintModule 惰性分配一组复用草稿(leaf/ins/类型/符号/路径栈),
跨全局、跨节点共享;PrintModule 入口 MlirGvResetScratch 使上次草稿失效,
下次按当前池重建(绝不复用已释放/被复用地址的池,避免悬空写穿 canary)。
下标路径改按递归深度分槽的复用栈,不再逐节点分配。
|
2026-10-04 21:09:36 +08:00 |
|
TermiNexus
|
68fe839da9
|
fix(mlir): 类型文本缓冲成对扩容(scratch 尺寸 + 各处 cap)
重编 TransPyV 自身时触发类型文本截断护栏:
[MLIR-FAIL] MLIR 渲染: 类型文本超出输出缓冲被截断(该处缓冲过小,需按类型长度增大)
(PhaseA ./TransPyV/App/lib/core/CompilerFactory.vp)
根因:内联具名结构体在使用处展开完整字段体,类型文本可达数百字节,而
_append_cstr / MlirTypeText / TypePrint / _MlirTypePrintDepth 的定长
cap(256/512/1024/2048)与对应 scratch 缓冲偏小。
修复(cap 与底层缓冲**成对**放大,保证 cap ≤ 缓冲,绝不越界):
- _MlirTablesInit:_SC_Ty/_SC_Ty2/_SC_Mt/_SC_Buf/_SC_B1/_SC_B2 512→4096、
_SC_Tmp2/_SC_IdxT 1024→4096、_SC_ArgTs 2048→8192、_SC_Tmp 4096→8192;
- 以"别名 → 缓冲尺寸"追踪脚本放大各调用点 cap(77 处,含被当作 cap 缓冲使用的
pool.alloc 同步 512/1024→4096),如 _MlirGep 的 idxt/bmt、_MlirCall 的
argts/rmt/vftys、_MlirNamedStructAppend/TypePrint 的 tmp/rfb/tmp3 等;
- __builder.vp 的 _TY_TEXT_CAP 512→2048(类型文本内嵌缓冲 + cap;arg_cap 由它
推导,不宜过高以免多参调用单次分配逼近模块池单块上限)。
|
2026-10-04 19:56:42 +08:00 |
|
TermiNexus
|
bca0107240
|
fix(mlir): 模块缩进辅助缓冲改为池可服务的最大单块 1048560(1 MiB − 16)
256 KiB 对个别大函数偏小,触发自己加的截断护栏:
[MLIR-FAIL] MLIR 渲染: 输出文本超出缓冲被截断(需增大 dump_ir/FunctionPrint 的缓冲)
模块池(~2 MiB 子池)max_order=15 ⇒ 单个 buddy 块最大 1 MiB,减去 16 字节块头
⇒ 单次 alloc 请求上限 = 1048560。取该值:既不再因 order 16 结构性失败
(1048576 会失败),又给足单函数文本(内联具名结构体使文本显著变长)。
若仍超出,截断由 FunctionPrint/LLVMModulePrint 的截断检查响亮报错。
|
2026-10-04 18:25:57 +08:00 |
|
TermiNexus
|
1cf7186824
|
fix(mlir): 模块缩进辅助缓冲 1 MiB → 256 KiB(1 MiB 超出模块池 buddy 上限)
Test 6(ModulePrint)运行期分配失败:
[MEM] alloc 失败 size=1048576 needed=1048592 order=16 max_order=15
池容量=2096864
模块池是 ~2 MiB 子池(SUB_POOL_SIZE 2097136),max_order=15 ⇒ 单个 buddy 块
≤ 1 MiB;再加上 16 字节块头,单次 alloc 请求必须 ≤ 1 MiB − 16。请求 1048576
被判需 order 16 ⇒ **结构性失败**(与池内剩余空间多少无关)。
改为 256 KiB:实测最大单成员文本仅 ~54 KB(670 KB 模块 / 12296 行 / 最大函数
991 行,平均 ~54 B/行),余量 ~4.7×;且只需 order 14(512 KiB 块)。
截断仍由 FunctionPrint/LLVMModulePrint 的截断检查响亮报错。
|
2026-10-03 22:28:34 +08:00 |
|
TermiNexus
|
1860259659
|
fix(mlir): 具名结构体统一按模块登记定义渲染(同名同体)
mlir-opt 报:
error: identified type already used with a different body
%110 = llvm.getelementptr %109[0, 1] : (!llvm.ptr) -> !llvm.ptr,
!llvm.struct<"0ba5c56e78e3ff23.ParamNode", ()>
同一具名结构体在模块内出现两种体:多数处是 `(!llvm.ptr, !llvm.ptr)`(2 字段),
两处是 `()`(0 字段)。MLIR 的 identified type 要求**同名同体**。
根因:跨模块 stub 构造的**0 字段占位类型对象**被 TypePrint 内联成 `()` 体;
而 `_MlirTypeAppend` 对 `!` 前缀文本(`!llvm.struct<"name", …>`)原样直通,
也不回查登记表。
修复:新增 `_MlirNamedBodyFromTable`(按名字回查登记表,用**模块登记定义**渲染),
两条路径都先回查:
- `_MlirTypeAppend`:`!llvm.struct<"name", …>` 文本命中登记表则改用登记定义重渲;
- `TypePrint` 的 Struct 分支:命中登记表则用登记字段(含 packed 标记)替代自身字段。
未登记(独立 TypePrint / 外在类型)保持原行为(按自身字段内联)。
README §2.10 补"同名同体"硬性约束说明。
|
2026-10-03 22:18:29 +08:00 |
|
TermiNexus
|
f95eb8016b
|
fix(mlir): i1 常量物化用裸布尔关键字(true/false 不带 : i1)
mlir-opt 报:
error: expected ')'
%c7 = llvm.mlir.constant(false : i1) : i1
`true`/`false` 是 MLIR 的裸布尔关键字,不能再带类型后缀(其余标量必须写
`值 : 类型`)。
修复两处常量物化:
- `_MlirEmitOneConst`(函数内常量);
- `_MlirGvEmitConst`(全局初值 region 叶子 op)。
README §2.3 常量表补 i1 行。
|
2026-10-03 22:11:45 +08:00 |
|
TermiNexus
|
a7aaed01f4
|
fix(mlir): LLVM intrinsic 调用改走 llvm.call_intrinsic,声明不输出
mlir-translate 是**程序化构造** LLVM IR,不像 LLVM 的 IR 解析器那样把旧式
intrinsic 名 upgrade 成带类型后缀的形式。原先 `@llvm.va_start` 走普通
llvm.call,且 declare 被原样输出为 `llvm.func @llvm.va_start`,降级得到未
mangle 的 `@llvm.va_start`,LLVM 校验报:
Intrinsic name not mangled correctly for type arguments!
Should be: llvm.va_start.p0
ptr @llvm.va_start
修复:
- `_MlirCall`:裸符号名以 `llvm.` 开头(且非 `llvm.mlir.*`)的调用改渲染为
`llvm.call_intrinsic "llvm.xxx"(...) : (...) -> ...`,由 mlir-translate
按操作数类型自动 mangle 名字(llvm.va_start -> llvm.va_start.p0);
- `FunctionPrint`:intrinsic 的 declare **不输出**(否则残留的
`llvm.func @llvm.va_start` 仍会触发同一校验错误)。
README §2.1 映射表补 intrinsic 行,§2.9 新增 ③′ 说明。
|
2026-10-03 22:05:30 +08:00 |
|
TermiNexus
|
31fe1bae58
|
fix(mlir): 补 _MlirModOutTrunc 声明(截断标志此前未落盘)
LLVMModulePrint 已在 bff0f20 使用 global _MlirModOutTrunc,但模块级声明
未随之提交,补上 `_MlirModOutTrunc: int`(否则模块输出截断检查无法编译)。
本文件同时包含一次行尾规范化(mixed -> CRLF),使 diff 显示为全文改动;
忽略空白后实际仅此 1 行内容变化。
|
2026-10-03 21:33:56 +08:00 |
|
TermiNexus
|
aa94d67183
|
fix(mlir): GEP 常量索引写字面量并修正类型列表
mlir-opt 的 llvm.getelementptr 要求“索引到结构体”的索引必须是常量字面量,
而 _MlirGep 原先把常量索引经 _MlirOperand 物化成 SSA 操作数(%cN),
触发 verifier:
error: 'llvm.getelementptr' op expected index 1 indexing a struct to be constant
按 MLIR LLVMDialect 的定义修正为官方形态:
- 常量索引 -> 整数字面量([0, 1]),不物化、不占类型位;
- 仅 SSA 索引物化为操作数,其类型进入 (...) 类型列表。
同步修正 README §2.1 映射表(原 [%c0, %c1] : (!llvm.ptr, i32, i32) 形态错误),
并在 §2.3 补充“常量必须物化”的 GEP 索引例外说明。
|
2026-10-03 21:33:25 +08:00 |
|
TermiNexus
|
bff0f20f51
|
fix(mlir): 模块/函数输出缓冲截断响亮报错 + 缩进辅助缓冲 64 KiB → 1 MiB
dump_ir 的输出缓冲(8/16 MB)此前用 _append_cstr **静默**丢内容 —— MLIR 文本因
内联具名结构体完整字段体而明显长于 LLVM IR,一旦超出就得到被截断的半截模块,
mlir-opt 只会报难以定位的语法错。
- __module.vp:_append_cstr 写入被截断时置 _MlirModOutTrunc;LLVMModulePrint
结束前检查并 MlirFail;模块缩进辅助缓冲 64 KiB → 1 MiB(tmp_cap),并把该
缓冲分配失败也改为响亮报错(否则会静默漏印全部模块成员)
- __function.vp:_append_cstr 写入被截断时置 _MlirOutTrunc;FunctionPrint
三个出口(declare / 无基本块 / 正常结束)均检查并 MlirFail
|
2026-10-03 21:15:34 +08:00 |
|
TermiNexus
|
a502c7242f
|
fix(mlir): 类型文本缓冲按长度给足 + 截断响亮报错(系统性)
根因:MLIR 把具名结构体内联为完整字段体(`!llvm.struct<"名", (i32, !llvm.ptr, …)>`),
单个类型文本可达数百字节,远长于 LLVM 形态的 `%"名"` 引用(十几字节);而 builders
仍按旧的短类型尺寸分配(128/256),指令行里的类型被截断 → 畸形 MLIR。
实测:alloca 行类型被 128 字节缓冲截断,mlir-opt 报
"unbalanced '(' character in pretty dialect name"。
- __types.vp:新增截断溢出标志 _MlirTypeTrunc(_strappend/_MlirAppendN 写入
被截断时置位),TypePrint / MlirTypeText 渲染后检查并 MlirFail —— 任何截断
都不再静默产出畸形 MLIR
- __builder.vp:新增 _TY_TEXT_CAP(512)/_LINE_CAP(2560),全部指令行缓冲(alloca
/ret/load/store/各类 cast/gep/icmp/fcmp/select/atomicrmw/cmpxchg/va_arg/switch
/case/inline_asm…)改为 _LINE_CAP;build_call / build_call_indirect 的实参表
与行缓冲按实参个数与实际长度动态分配(原固定 1024/2048 会在两个以上结构体
实参时静默截断)
- __values.vp:ValuePrint 的类型缓冲 256 → 512
|
2026-10-03 21:07:55 +08:00 |
|
TermiNexus
|
33d5737f0c
|
feat(mlir): 补齐 f16/f128 浮点位模式物化
ConstFloat 现按类型宽度产出位模式:f16 → 0x%04x(t.CFloat16T 按 half 舍入后取
2 字节)、f32 → 0x%08x、f64 → 0x%016llx、f128 → 高低两个 64 位字拼成 32 位
十六进制(t.CFloat128T 为 double 的无损扩展;c.Load 的宽度取源指针 pointee,
故源显式转成 u64*,避免按 16 字节写入 8 字节目标而越界)。name_buf 由 32 增至
64(f128 文本需 35 字节)。
- _MlirFloatLiteral 接受 f16/f128 原样直通,并新增“位模式位数与类型是否相符”
强校验(f16/f32/f64/f128 ↔ 4/8/16/32 位十六进制;MLIR 按类型宽度解释该十六进制值)
- README §2.3 常量表 / §5 打印阶段转换说明同步
|
2026-10-03 20:52:02 +08:00 |
|
TermiNexus
|
597e0e5c4a
|
fix(mlir): ConstFloat 的 f32 位模式改取 float 编码(原取 double 低 32 位)
ConstFloat 以 CDouble 形参接收值,原先 f_bits==32 时直接取 double 位模式的低
32 位当作 f32 位模式 —— 这是错的:3.14 的 double 是 0x40091EB851EB851F,
低 32 位为 0x51EB851F,而 f32 编码应为 0x4048F5C3。
影响以 Float(32) 为类型调用 ConstFloat 的路径(如模块级 t.CFloat 全局初始化
器,TranslatorGenMixin.vp:1014 传 var_ty);指令里的浮点字面量恒以 Double(pool)
创建,不受影响。
- f_bits==32:先 t.CFloat(val) 按 f32 舍入,再 Load 其 4 字节编码
- 更新函数注释:Name 为位模式文本,MLIR FloatAttr 按底层二进制位解释
已知残留(未改,下游会响亮报错):f16/f128 仍按 64 位格式化,宽度与类型不符。
|
2026-10-03 20:38:27 +08:00 |
|
TermiNexus
|
f813c0543b
|
fix(mlir): 浮点常量位模式原样直通,消除 %e 截断精度
MLIR FloatAttr 语法支持十六进制位模式(Builtin Dialect:
`hexadecimal-literal ':' float-type`,按底层二进制位解释),故 ConstFloat 产出的
`0x…` 无需转十进制。此前 _MlirFloatLiteral 把它转成 `%e`(默认 7 位有效数字):
3.141592653589793 → 3.141593e+00,静默截断,与 __values.vp 选位模式的初衷相悖。
- _MlirFloatLiteral:hex 且 mt 为 f32/f64 → 原样返回(无损);
f16/f128 仍响亮报错(ConstFloat 只产出 64 位位模式,宽度与该两类型不符)
- 删除因此失效的 _MlirParseHexU64
- README §2.3 常量表 / §5 打印阶段转换说明同步
|
2026-10-03 20:35:37 +08:00 |
|
TermiNexus
|
751e7e7ef7
|
fix(mlir): 全局嵌套数组/聚合类型前缀走 region;补 MLIR 形态内层前缀剥离
生产者 TranslatorGenMixin._build_array_initializer_text 的嵌套数组初始化器写作
`[!llvm.array<16 x i8>[i8 0, …], …]`(内层类型前缀来自 mlirlite.TypePrint)。
两处缺口叠加导致渲染失败:
1) _MlirGlobalInitNeedsRegion 只按 '@'/'{' 判定是否走 region,嵌套数组被送进
属性路径 _MlirArrayDenseAt —— 该路径只能表达"值 : 标量类型"的稠密数组,
内层类型前缀与子 zeroinitializer 都无法表达;
2) _MlirGvWalk 只剥离 LLVM 形态前缀([N x T] / {…}),不认 MLIR 形态
`!llvm.…` 前缀,元素被当叶子 → 报"全局初值叶子形态 v1 不支持"。
- _MlirGvHasSymOrStruct → _MlirGvArrayNeedsRegion:增认 '!' 前缀,路由到 region
- _MlirGvWalk:新增 MLIR 形态聚合类型前缀剥离(类型记号后紧跟 '[' / '{')
- README §2.5 同步初值两条路径与新增表项
|
2026-10-03 20:32:56 +08:00 |
|
TermiNexus
|
b519269398
|
fix(mlir): 全局初值支持结构体类型前缀 {…} {…}
_MlirGvWalk 已处理数组类型前缀 `[N x TY][…]`,但 llvm.global_ctors 这类元素写成
`{ i32, void ()*, i8* } { i32 65535, void ()* @ctor, i8* null }` 时,首个花括号组
(类型)被误当字面量解析,报
[MLIR-FAIL] 全局初值叶子形态 v1 不支持:', void ()*, i8* } { i32 65535, … }]'。
- 新增 _MlirGvIsStructType:按深度配平读完首个花括号组(跳过引号内文本),
其后非空白记号仍是 '{' ⇒ 前一花括号组是类型前缀(同一元素的花括号组之后
只会是 ',' / ']' / '}' / 结束,故判据无歧义)
- _MlirGvWalk 增加对应的前缀剥离(与数组类型前缀同款处理)
|
2026-10-03 20:21:19 +08:00 |
|
TermiNexus
|
d37d8520c2
|
fix(mlir): 类型文本转换直通 MLIR 浮点标量 f16/f32/f64/f128
builders 经 TypePrint 输出的内嵌类型已是 MLIR 形态(见本文件 TypePrint 段说明),
但 _MlirTypeAppend 只对 '!' 前缀原样直通,浮点标量落到兜底 fail:实测
`%0 = alloca f64` 报 [MLIR-FAIL] 无法转换为 MLIR 类型文本(v1 未覆盖该形态):'f64'。
- 补 'f' + 全数字直通(与 LLVM 形态 half/float/double/fp128 分支不冲突)
- 订正函数头注释与 MlirTypeText docstring:中间文本两种形态都接受
(MLIR 常态直通 / LLVM 形态转写)
|
2026-10-03 20:12:48 +08:00 |
|
TermiNexus
|
07033094b7
|
refactor(backend): 删除 includes/llvmlite(单端 MLIR,发射器只留 mlirlite)
- TransPyV 全树已改为 import mlirlite;includes 内无任何模块 import llvmlite,删除后无悬空引用
- mlirlite 的注释保留对 llvmlite 的历史引用(同形孪生来源)
|
2026-10-03 19:27:11 +08:00 |
|
TermiNexus
|
a99e44863d
|
fix(gep): GEP 下标 zext 下沉到 build_gep/build_gep_array(唯一真源),修复窄整数下标被符号扩展导致越界
|
2026-10-03 13:35:31 +08:00 |
|
TermiNexus
|
99c1ad44c4
|
fix(mlirlite): 结构体字段链改用 ParamNode 访问器,消除 ParamNode*→Param* CastError
__module.vp 的 _MlirGvWalkStruct 遍历 LLVMType.Struct 字段链(cur 是 ParamNode*),却调用了 __function 的 param_get_ty/param_get_next(形参是 Param*)→ 触发编译器的「非基本类型指针间禁隐式转换」CastError(MLIRLiteTest 根因)。ParamNode(类型树字段节点)与 Param(函数参数,带名/属性)是两个刻意区分的类,不可合并。改为导入并使用 __types 的 paramnode_get_ty/paramnode_get_next;移除 __module.vp 中已无引用的 Param/param_get_ty/param_get_next 导入。未做指针强转(避免掩盖真实类型错误)。
|
2026-10-03 12:21:33 +08:00 |
|
TermiNexus
|
7bd4cda5be
|
fix(llvmlite): 打印端跳过被同模块定义取代的 external global(消除 redefinition of global)
模块内不变量:同一符号名不得同时打印 external 声明与定义,否则 llc 报 redefinition of global(SysLibTest os/__init__ 的 _mbuddy:循环 import 使 LoadDepVpiIntoModule 把本模块自身 vpi 注入自身 → 先发 external,handle_module_level_var 再发定义)。新增 _module_has_initializer_global:OUTPUT_FULL/STUB/TEXT 三模式对无初值 GV,若模块内存在同名带初值定义则跳过。只处理本模块内同名声明+定义,依赖模块的合法 external(本模块无同名定义)一律保留,不做跨模块去重(与 TransPyC Phase2Translator 合并期 external 去重同构)。
|
2026-10-03 12:17:39 +08:00 |
|
TermiNexus
|
7f3b3dea1a
|
feat(parser): switch 的 case/default 支持 if 守卫
_parse_switch_case / _parse_switch_default 解析可选 `if <cond>` 并传入 MatchCase.guard(原为直接报错 / 写死 None),与 _parse_match_case 同款写法。
|
2026-10-03 10:58:53 +08:00 |
|
TermiNexus
|
7b006c96a0
|
feat(mlirlite): 补齐 Debug Info 同形 API,导出名集与 llvmlite 一致(215=215)
- __module.vp: 新增 DINode/DINamedMeta 类、LLVMModule 追加 6 个 DI 字段(96->144B)、module_add_di_node/module_add_named_metadata 及实例方法、DI_NODE_SIZE/DI_NAMED_SIZE
- __function.vp: Function 追加 DbgRef(80->88B) + function_set_dbg
- __builder.vp: IRBuilder 追加 DbgLoc(32->40B) + set/clear_debug_location 方法 + 顶层 builder_set/clear_debug_location
- __init__.vp: 导出上述 7 个 DI 名字,恢复与 llvmlite 的逐名同形(215=215)
- MLIR 打印阶段忽略 DI:LLVMModulePrint 不输出 !N 元数据、_emit 不读 DbgLoc,保持 MLIR 语法合法(DI 只记录不输出)
- README: 记录 DI 为「同形保留/只记录不输出」,名字数更新为 215
|
2026-10-03 07:43:03 +08:00 |
|
TermiNexus
|
1e6082afe9
|
fix(switch): case 标签支持裸名(按值引用)并给出常量标签 fail-fast
- 裸名在 match 里是捕获模式(MatchAs),switch 里对齐 C 的 `case NAME:` 语义,
三端解析均归一为 MatchValue(Name);`_` 仍作通配(等价 default)
- includes/ast/parser.vp、lib/vast/Parser.py、lib/vast_c/vast_c.c 同步实现
- HandlesMatch:case 标签求值非编译期常量时 fail-fast(原先会因取 .constant 崩成
AttributeError),报文明确“case 标签必须是编译期常量”
|
2026-10-03 00:14:51 +08:00 |
|
TermiNexus
|
2c5b39456b
|
feat(ast): 新增 switch 关键字与 switch 语句,match 完全禁止 fallthrough
- tokens.vp:Keyword 表尾追加 Switch / FallThrough,并 intern "switch"/"fallthrough"(既有编号不变)
- stmts.vp:Match 增加 is_switch 字段(switch 语法糖 desugar 的标记);FallThrough 注释改为仅 switch 合法
- parser.vp:match / fallthrough 改为硬关键字分派(去掉软关键字 lookahead);新增 _parse_switch(case 常量/枚举变体/多值 + default:)
- lexer.vp:局部变量 match 改名 Matched(match 已为硬关键字)
|
2026-10-02 23:15:13 +08:00 |
|
TermiNexus
|
b85f49ab35
|
feat(ast): 新增 fallthrough 软关键字语句节点 FallThrough
- base.vp:ASTKind 末尾追加 FallThrough(append 保持既有枚举值不变)
- stmts.vp:FallThrough 语句节点(kind / type_name / dump)
- parser.vp:语句位置识别裸 `fallthrough`(仅整条语句命中;fallthrough = 1 /
fallthrough(x) / d.fallthrough 等作标识符的写法不受影响)
- __init__.vp:导出 FallThrough
|
2026-10-02 22:33:15 +08:00 |
|
TermiNexus
|
1566df068f
|
feat(stub): 以 viperbuild.vpnci 替换 project_build.vpnci
viperbuild 是编译器内建宏库(与 t / c / ctraits 同级),存根仅供 Vipeye 解析;
文件名与 import 名保持一致,注释改为英文,并移除旧的 project_build.vpnci。
|
2026-10-02 22:07:01 +08:00 |
|
TermiNexus
|
7384d9a57c
|
fix(parser): 类型注解位的 __attribute__(...) 只解析调用本身,不再吞掉后续 []T
原实现用 _parse_test 解析 __attribute__(...) —— 那是通用表达式解析器,解析完调用后
会继续吃 postfix trailer,把紧随的 C 风格前置数组 `[]T` 的 `[]` 当作**合法空下标**
吞掉(_parse_slice 显式支持空下标 T[],见其注释)。后果:ac_node 不再是 Call ⇒
描述符循环 break(markers 一个都没收集),且 _match_op(Lsqb) 此时看到的是元素类型
⇒ 数组分支被跳过 ⇒ 整个注解退化成裸元素类型,且**全程零报错**。
现场:TransPyV/App/main.vp:44
V_TPV_VERSION: __attribute__(section(".PRVERSN")) []char = "0.0.5-dev.479"
被解析成 `char`:stub 记 `V_TPV_VERSION: char`、IR 出
`@g = global i8 getelementptr ...`(opt: got 'ptr' but expected 'i8')、段名 ".PRVERSN" 丢失。
改为:_advance 过 `__attribute__` 后用 _parse_call 解析 `( 实参表 )`,postfix 不再被
误吃,`[]char` 交回数组分支脱糖为 t.CArray[char, None] → i8*。
last-good-0.0.5-dev.479
|
2026-10-02 17:29:58 +08:00 |
|
TermiNexus
|
c27ebc1b69
|
feat(struct): 新增 struct 关键字(class 同形,纯数据类型)
语义(用户 2026-10-01 定):与 class 同形,但只能表示数据类型:
① 禁止 virtual / novirtual 修饰(struct 天然无虚表);
② 禁止在 struct 内定义 def;
③ 允许在 REnum 内作为变体(与 class 一样);
④ 允许 struct 内再写 struct(与 class 内写 class 同口径,语法层不额外禁止)。
实现(双端同一套表示,零新增下游判据):
· tokens.vp:Keyword 枚举**表尾**追加 Struct(既有 kw_subtype 编号逐字不变)
+ _kw_intern("struct");struct 在 .vp 源码中不作标识符。
· parser.vp:新增 _parse_structdef + _RecordStructErr,复用 class 的
基类/类型参数/类体解析路径,解析期合成 `@t.NoVTable` 伪装饰器并**追加**
`t.CStruct` 标记基类(真实父类仍在 bases[0])——与手写
`@t.NoVTable class X(t.CStruct):` 逐字段同形;类体解析后检查直接子节点,
遇 FunctionDef 即 fail-fast。
· parser.vp:_ParseVirtualModified 显式拦截 `virtual struct` / `novirtual struct`。
验证:struct 内 def / virtual struct 均报错;`struct = 5` 仍按普通赋值解析。
|
2026-10-01 23:07:11 +08:00 |
|
TermiNexus
|
85f67b5558
|
fix(w32/condition/rwlock): SRWLOCK / CONDITION_VARIABLE 建模为不透明结构体
二者在 Windows 头文件里都是"单个 PVOID 的结构"(sizeof 8),API 收的是**存储地址**。
原先声明成 VOIDPTR(i8*)⇒ `c.Addr(self.cond_var)` 得到 i8**(多一层),与形参 i8* 层数
不符(指针隐式转换收紧后报 CastError,现场 includes/condition.vp:27)。
- win32sync.vp:新增 class SRWLOCK / class CONDITION_VARIABLE(Ptr: VOIDPTR,8 字节);
5 个 SRWLock extern 与 5 个条件变量 extern 的形参由 VOIDPTR 改为对应结构体指针
- condition.vp:cond_var 由 VOIDPTR 改为 CONDITION_VARIABLE
- rwlock.vp:lock 由 VOIDPTR 改为 SRWLOCK
布局与运行期语义均不变(都是 8 字节、对齐 8,传的仍是那块存储的地址)。
|
2026-10-01 19:24:07 +08:00 |
|
TermiNexus
|
6ff26a16b9
|
refactor(_list): 清理未使用导入,append 的 new_data 改用 rawptr
- 去掉未使用的 `import t, c` / `import stdio` / `from stdint import *`
- new_data 由 t.CPtr 改为 rawptr(与 __data__ 字段同为裸指针),顺带对齐
|
2026-10-01 18:30:44 +08:00 |
|
TermiNexus
|
2af230bdd1
|
fix(argparse): argv 取值改用直接下标 argv[idx],避开 TPC 赋值路径对 i8** 右值的自动解引用
原写法 `entry = str*(uint64(argv) + idx * 8)` 的右值是 i8**,TPC 的 HandlesAssign 赋值路径
会对"指针的指针"右值再 load 一次 → entry 变成 argv[idx] 本身,entry[0] 又去读字符串头 8 字节
→ 野指针(ASan: access-violation 0xffffffffffffffff @ ArgumentParser.parse_args)。
改为 argv[idx] 后右值是 i8*(1 级),不触发该路径;顺带去掉了 uint64 往返。
|
2026-10-01 18:29:53 +08:00 |
|
TermiNexus
|
7f513b86aa
|
style(_list): 元素访问统一改为 *elem_ptr 前缀解引用写法
append/get/__getitem__/set/__setitem__/pop/__next__ 共 7 处 `elem_ptr[0]` 改为 `*elem_ptr`,
与其他裸指针解引用写法(如 _dict.vp 的 `*int_ptr` / `return *val_ptr`)保持一致,语义不变。
|
2026-10-01 18:09:39 +08:00 |
|
TermiNexus
|
14221b9414
|
refactor(includes): 适配新指针口径与语法,rawptr[T] → T* / t.CPtr → rawptr
- json/__init__.vp、math.vp:rawptr[T] 改为 T*
- ast/base.vp、ast/stmts.vp:@t.CVTable 改为 virtual class
- argparse.vp:t.CPtr(...) 改为 str*(...)
- stdarg.vp:arg(type: t.CType) 改为 t.CPtr
- stdint.vp:FSIZE_t/LBA_t 换成 LPCSTR
- memhub.vp:import 整理、去掉 t.CDefine 前缀、t.CPtr 改 rawptr、格式对齐
- ast/parser.vp、math.vp、linkedlist.vp:对齐与格式清理
|
2026-10-01 18:05:05 +08:00 |
|
TermiNexus
|
d8c02cff73
|
refactor(_dict): 元素地址运算去掉 uint64 往返,改用裸指针字节偏移
裸指针 rawptr 即 i8*,其上的 + 按 1 字节缩放,与 uint64(base) + n 再强转回指针逐字等价。
_find/__getitem__/_set_variant_raw/get/get_vtype/__next__/to_json 共 13 处偏移统一为此口径,
与 _list.vp bb05e11 保持一致。承接 f69e71b 中遗留的裸指针 uint64 手动计算待重新处理。
|
2026-10-01 18:04:45 +08:00 |
|
TermiNexus
|
bb05e112ec
|
refactor(_list): 元素地址运算去掉 uint64 往返,改用 i8* 指针加法
rawptr 即 i8*,指针加法按 pointee(1 字节) 缩放,与 uint64(ptr)+n 再强转回指针逐字等价。
元素步长仍显式由 __elem_size__ 给出,故不能改成下标访问(list[int](pool,8) / list[str](tp,64) 依赖显式步长)。
承接 0f92426 中遗留的裸指针 uint64 手动计算待重新处理。
|
2026-10-01 18:00:57 +08:00 |
|
TermiNexus
|
3c29b9bd13
|
将 lock.vp 的 c.Addr(self.cs) 替换为 &self.cs
|
2026-09-30 13:52:40 +08:00 |
|
TermiNexus
|
0f924264ea
|
将 _list 的部分写法升级到最新范式,裸指针 uint64 手动计算便宜还需要重新处理,暂时如此,后续还需要再更新
|
2026-09-30 00:36:50 +08:00 |
|
TermiNexus
|
f69e71b198
|
将 _dict 的部分写法升级到最新范式,裸指针 uint64 手动计算便宜还需要重新处理,链表暂未做 linkedlist 范式化
|
2026-09-30 00:34:40 +08:00 |
|
TermiNexus
|
ef61975165
|
修正 _fakeduck.vp 表达含义
|
2026-09-30 00:25:55 +08:00 |
|
TermiNexus
|
3135f62141
|
略微清理了 stdarg.vp,但受限于 Vipeye、编译器缺陷未能完整整理
|
2026-09-29 17:01:08 +08:00 |
|
TermiNexus
|
8d345ece04
|
略微清理了 sys.vp
|
2026-09-29 17:00:36 +08:00 |
|
TermiNexus
|
76c021ae26
|
给 this.vp 增加了一个空格
|
2026-09-29 17:00:20 +08:00 |
|
TermiNexus
|
9914e150ef
|
将 vector 整理
|
2026-09-29 16:59:46 +08:00 |
|
TermiNexus
|
bc6c32b1da
|
清理了 viperio
|
2026-09-29 16:59:21 +08:00 |
|
TermiNexus
|
53ae1b7864
|
略微清理了 viperlib,受限于 Vipeye 缺陷暂缓
|
2026-09-29 16:59:09 +08:00 |
|
TermiNexus
|
4c6877a87f
|
将 vipersimd.vp 的注解描述得更准确(t.CPtr -> double*)
|
2026-09-29 16:58:40 +08:00 |
|
TermiNexus
|
4fed54aa8b
|
去除了 vthreading 的 c.Addr
|
2026-09-29 16:47:50 +08:00 |
|