Files
ViperC/Test/FieldReadTest/App/main.vp
T
TermiNexus f0309e4904 fix(gen,renum): 指针操作符目标写入落盘 + REnum tag 三侧口径统一,修 kind() CastError
- AssignGenMixin: 补 UnaryOp(Deref) 赋值目标分支(*p = v / *&x = *&y),非 Deref 的 &x/-x/~x fail-fast;*p += v 真正实现;Tuple/List 目标合并

- CallGenDispatch: kind() 改四级 REnum 判据(变体表 / struct __tag / pointee 带 __tag / X.field 声明类型反推);修正 build_load 第一参数误传指针类型 rk_tag_p(生成 load i32*, i32* 使返回值 Ty 为 i32*,导致 CallGenLib.vp:355 vk_a: int = val.Ty.kind() 报指针隐式转整数的 CastError),rk_load 分支同步改 rk_ty.Pointee

- CallGenCtor / MatchGenMixin: __tag 读/写/比统一取字段声明类型 FieldEntry.Ty

- Test/FieldReadTest: 字段读取探针
2026-09-27 00:19:44 +08:00

48 lines
1.8 KiB
Plaintext

import t, c
from stdint import *
import memhub
import stdio
import stdlib
# ============================================================
# 最小复现:memhub.alloc 返回的指针与块头的位置关系是否正确。
#
# 期望:alloc 返回 block + 8(块头在 p-8),块头 = (order<<1)|1(奇数);
# free(p) 后该块回到空闲链(free_count 增 1)。
# 若 p-8 处是 0、而 p 处是奇数 → alloc 返回了 block 本身(+8 没生效),
# 调用方的 memset 会正好把块头清 0(并越过 8 字节踩邻居块头)。
# ============================================================
def main() -> int:
sz: sizet = 1048576
arena: t.CPtr = stdlib.malloc(sz)
if arena == None:
stdio.printf("FAIL: arena malloc 失败\n")
return 1
mb: memhub.MemBuddy* = memhub.MemBuddy(arena, sz)
if mb == None:
stdio.printf("FAIL: MemBuddy 构造失败\n")
return 1
p: t.CPtr = mb.alloc(64)
if p == None:
stdio.printf("FAIL: alloc 失败\n")
return 1
w_m8: uint64* = (uint64*)(t.CPtr(uint64(p) - 8))
w_0: uint64* = (uint64*)(p)
hdr_m8: uint64 = w_m8[0]
hdr_0: uint64 = w_0[0]
c0: sizet = mb.free_count()
rc: int = mb.free(p)
c1: sizet = mb.free_count()
stdio.printf("p-8=0x%llX p=0x%llX free_before=%zu free_after=%zu free_rc=%d\n",
hdr_m8, hdr_0, c0, c1, rc)
if (hdr_m8 & 1) == 0:
stdio.printf("FAIL: p-8 不是奇数块头(0x%llX)——alloc 返回的不是 block+8\n", hdr_m8)
return 1
if c1 != c0 + 1:
stdio.printf("FAIL: free 未把块放回空闲链(%zu -> %zu)——块头被破坏/被拒\n", c0, c1)
return 1
stdio.printf("OK: p-8 是奇数块头,free 正常回收\n")
return 0