chore(test): 初始化回归测试仓(新增 .gitignore,TestsOverview.md 改为 README.md)
把 Test/ 纳入 https://git.gvsds.com/GVSDS/Viper_RegressionTesting 。 1) 新增 .gitignore —— 只保留测试源码,剔除全部构建产物: 目录 **/output*/(output / output_opt / output_orig / output_verify / output_dbg)、 **/temp*/(temp / temp_opt)、**/.tpv_build/ 二进制 *.exe *.obj *.o *.out *.a *.lib *.dll 中间物 *.ll *.vpi *.pyi *.deps.txt *.deps.json *.doc.json *_sha1_map.txt _pyi_cache_v1.pkl _pyi_cache_v1.sig.json _shared_sym.json _phase1_manifest.json 其它 build_all.txt(构建日志)、*.log、__pycache__/、*.bak、IDE 目录 保留 App/*.vp、project.json / project_opt.json / project.vpj、README.md、两个 .py 实测 `git add -A --dry-run`:196 个文件,无任何构建产物混入。 2) TestsOverview.md → README.md(作为仓库首页文档)。 3) SequentialRegressionTest.py:7 处 TestsOverview.md 引用同步改为 README.md (文档串、OVERVIEW 路径、read_test_order 文档与报错文案、argparse description、 启动横幅);同时修正入口路径 PROJECTRANS —— 旧值 <root>/Projectrans.py 已不存在, 改为 <root>/TransPyC/Projectrans.py(与 regression_test.py:45-48 记录一致), 否则本脚本会以 "can't open file" 全量失败。 regression_test.py 无需改动:它按目录扫描 project.json 找项目,不引用该文档。
This commit is contained in:
commit
3c6fb1d246
196 files changed
+24775
No files matched your search
@@ -0,0 +1,115 @@
|
||||
import t, c
|
||||
from stdint import *
|
||||
import stdio
|
||||
import stdlib
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 指针操作符全形态自检(TPC 侧)
|
||||
#
|
||||
# 解析实况(vast_c.c ParseSimpleStmt → ParseExprList + SetStoreContext):
|
||||
# `*p` 由 ParseFactor 产出 UnaryOp(op=Deref),SetStoreContext **不改 UnaryOp**
|
||||
# ⇒ `*p = v` 的赋值目标就是 UnaryOp(Deref)(ctx 仍是 Load),与读侧同形。
|
||||
# 若编译器目标分派没有 UnaryOp 分支,整条语句会被静默丢弃(不落盘、不报错),
|
||||
# 本程序即用于钉死这一点:每个形态都必须真的写进内存。
|
||||
# ============================================================
|
||||
|
||||
def MakePair() -> tuple[int, int]:
|
||||
return 1, 2
|
||||
|
||||
|
||||
def main() -> int:
|
||||
fails: int = 0
|
||||
buf: uint64* = (uint64*)stdlib.malloc(64)
|
||||
if buf == None:
|
||||
stdio.printf("FAIL: malloc\n")
|
||||
return 9
|
||||
|
||||
# 形态 A:*p = v
|
||||
*buf = 7
|
||||
if buf[0] != 7:
|
||||
stdio.printf("FAIL A *p = v : buf[0]=%llu(期望 7)\n", buf[0])
|
||||
fails += 1
|
||||
|
||||
# 形态 B:*p = *q
|
||||
q: uint64* = buf + 1
|
||||
*q = 99
|
||||
*buf = *q
|
||||
if buf[0] != 99:
|
||||
stdio.printf("FAIL B *p = *q : buf[0]=%llu(期望 99)\n", buf[0])
|
||||
fails += 1
|
||||
|
||||
# 形态 C:&x 取址,*px = v
|
||||
x: uint64 = 0
|
||||
y: uint64 = 5
|
||||
px: uint64* = &x
|
||||
*px = 11
|
||||
if x != 11:
|
||||
stdio.printf("FAIL C *px = v : x=%llu(期望 11)\n", x)
|
||||
fails += 1
|
||||
|
||||
# 形态 D:*&x = *&y
|
||||
*&x = *&y
|
||||
if x != 5:
|
||||
stdio.printf("FAIL D *&x = *&y : x=%llu(期望 5)\n", x)
|
||||
fails += 1
|
||||
|
||||
# 形态 E(对照):下标写 p[i] = v
|
||||
buf[0] = 123
|
||||
if buf[0] != 123:
|
||||
stdio.printf("FAIL E p[0] = v : buf[0]=%llu(期望 123)\n", buf[0])
|
||||
fails += 1
|
||||
|
||||
# 形态 F:AugAssign 目标 *p += v
|
||||
*buf += 5
|
||||
if buf[0] != 128:
|
||||
stdio.printf("FAIL F *p += v : buf[0]=%llu(期望 128)\n", buf[0])
|
||||
fails += 1
|
||||
|
||||
# 形态 G1(对照):Tuple 目标 a, b = f()
|
||||
a: int = 0
|
||||
b: int = 0
|
||||
a, b = MakePair()
|
||||
if a != 1 or b != 2:
|
||||
stdio.printf("FAIL G1 a, b = f() : a=%d b=%d(期望 1/2)\n", a, b)
|
||||
fails += 1
|
||||
|
||||
# 形态 G2:List 目标 [c, d] = f()
|
||||
cc: int = 0
|
||||
dd: int = 0
|
||||
[cc, dd] = MakePair()
|
||||
if cc != 1 or dd != 2:
|
||||
stdio.printf("FAIL G2 [c, d] = f() : c=%d d=%d(期望 1/2)\n", cc, dd)
|
||||
fails += 1
|
||||
|
||||
# 形态 H:值位置的 *p(调用实参 f(*p))——Starred(Load)
|
||||
got: int = stdio.printf("INFO H f(*p) : %llu(期望 128)\n", *buf)
|
||||
if got < 0:
|
||||
stdio.printf("FAIL H f(*p) : printf 返回 %d\n", got)
|
||||
fails += 1
|
||||
|
||||
# 形态 I:memhub 实际用的「两步式读块头」(关键回归点)
|
||||
# hd1 = *((uint64*)(blk)) —— 直接读
|
||||
# hd2 = uint64(t.CPtr(*((uint64*)(blk)))) —— 两步式;注意 `*((...))` 位于
|
||||
# t.CPtr( ) 的**实参位置** ⇒ 解析为 Starred(Load),旧 TPC 在这一形态落到
|
||||
# 末尾兜底 `return i32 0` ⇒ t.CPtr(0)=NULL ⇒ hd2==0(内存里明明是 0x1234)
|
||||
# 这正是 OOM 报告里 `hdr=0x9 / hdr2=0x0` 的成因。
|
||||
w: uint64 = 0
|
||||
pw: uint64* = &w
|
||||
*pw = 0x1234
|
||||
blk: t.CPtr = t.CPtr(uint64(pw))
|
||||
hd1: uint64 = *((uint64*)(blk))
|
||||
hd2: uint64 = uint64(t.CPtr(*((uint64*)(blk))))
|
||||
if hd1 != 0x1234:
|
||||
stdio.printf("FAIL I1 直接读块头 : hd1=0x%llX(期望 0x1234)\n", hd1)
|
||||
fails += 1
|
||||
if hd2 != 0x1234:
|
||||
stdio.printf("FAIL I2 两步式读块头 : hd2=0x%llX(期望 0x1234)\n", hd2)
|
||||
fails += 1
|
||||
|
||||
if fails == 0:
|
||||
stdio.printf("ALL OK: 指针操作符全形态均真正落盘\n")
|
||||
else:
|
||||
stdio.printf("FAILS=%d\n", fails)
|
||||
stdio.fflush(None)
|
||||
return fails
|
||||
Reference in new issue
Block a user