- 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: 字段读取探针
48 lines
1.8 KiB
Plaintext
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
|