Files
TransPyC/TransPyV/Test/App/memhub_test.py.bak
T
2026-07-18 19:25:40 +08:00

139 lines
4.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import stdio
import t, c
import memhub
import stdlib
import string
# ============================================================
# memhub_test - 内存管理库测试
#
# 测试 MemPool/MemBuddy 的 alloc/free/reset/realloc,
# 以及 MemManager 多态虚分派(通过 __vtable__ 调用子类方法)。
# ============================================================
def memhub_test() -> int:
stdio.printf("memhub: === Test Start ===\n")
# === Test 1: MemPool (bump allocator) ===
# MemPool 是 arena bump 分配器,不支持单个 free,reset 一次性回收
stdio.printf("memhub: === Test 1: MemPool ===\n")
arena1: bytes = stdlib.malloc(4096)
if arena1 is None:
stdio.printf("[FAIL] malloc arena1\n")
return 1
pool: memhub.MemPool | t.CPtr = memhub.MemPool(arena1, 4096)
p1: bytes = pool.alloc(64)
if p1 is None:
stdio.printf("[FAIL] MemPool.alloc(64)\n")
return 1
p2: bytes = pool.alloc(128)
if p2 is None:
stdio.printf("[FAIL] MemPool.alloc(128)\n")
return 1
stdio.printf("memhub: MemPool alloc ok\n")
# 写入验证
string.memset(p1, 66, 64)
if p1[0] != 66:
stdio.printf("[FAIL] MemPool write/read p1[0]=%d\n", p1[0])
return 1
# reset 后可以重新分配
pool.reset()
p3: bytes = pool.alloc(64)
if p3 is None:
stdio.printf("[FAIL] MemPool.alloc after reset\n")
return 1
stdio.printf("memhub: MemPool reset ok\n")
# === Test 2: MemBuddy (buddy system) ===
# MemBuddy 是伙伴系统,支持 alloc/free/realloc 合并
stdio.printf("memhub: === Test 2: MemBuddy ===\n")
arena2: bytes = stdlib.malloc(65536)
if arena2 is None:
stdio.printf("[FAIL] malloc arena2\n")
return 1
buddy: memhub.MemBuddy | t.CPtr = memhub.MemBuddy(arena2, 65536)
b1: bytes = buddy.alloc(64)
if b1 is None:
stdio.printf("[FAIL] MemBuddy.alloc(64)\n")
return 1
b2: bytes = buddy.alloc(256)
if b2 is None:
stdio.printf("[FAIL] MemBuddy.alloc(256)\n")
return 1
stdio.printf("memhub: MemBuddy alloc ok\n")
# 写入验证
string.memset(b1, 85, 64)
if b1[0] != 85:
stdio.printf("[FAIL] MemBuddy write/read b1[0]=%d\n", b1[0])
return 1
# free b1 后重新 alloc,应能回收内存
buddy.free(b1)
b3: bytes = buddy.alloc(64)
if b3 is None:
stdio.printf("[FAIL] MemBuddy.alloc after free\n")
return 1
stdio.printf("memhub: MemBuddy free/alloc ok\n")
# === Test 3: MemBuddy realloc ===
# realloc 扩展内存,验证数据保持
stdio.printf("memhub: === Test 3: MemBuddy realloc ===\n")
b4: bytes = buddy.alloc(32)
if b4 is None:
stdio.printf("[FAIL] MemBuddy.alloc(32) for realloc\n")
return 1
string.memset(b4, 171, 32)
# realloc 到更大(32 -> 128)
b4_new: bytes = buddy.realloc(b4, 32, 128)
if b4_new is None:
stdio.printf("[FAIL] MemBuddy.realloc\n")
return 1
# 验证数据保持(前32字节应保持 171=0xAB)
# 注意:b4_new[0] 是 i8(有符号),0xAB=-85,需 & 255 转无符号再比较
if (b4_new[0] & 255) != 171:
stdio.printf("[FAIL] MemBuddy.realloc data lost b4_new[0]=%d\n", b4_new[0])
return 1
stdio.printf("memhub: MemBuddy realloc ok\n")
# === Test 4: Polymorphism (MemManager virtual dispatch) ===
# 用 MemManager 指针调用 MemBuddy 的 alloc,验证虚分派
stdio.printf("memhub: === Test 4: Polymorphism ===\n")
mgr: memhub.MemManager | t.CPtr = (memhub.MemManager | t.CPtr)(buddy)
if mgr is None:
stdio.printf("[FAIL] MemManager cast\n")
return 1
# 通过 MemManager 指针调用 alloc(虚分派到 MemBuddy.alloc)
b5: bytes = mgr.alloc(64)
if b5 is None:
stdio.printf("[FAIL] MemManager.alloc (virtual dispatch)\n")
return 1
# 验证写入正常
string.memset(b5, 99, 64)
if b5[0] != 99:
stdio.printf("[FAIL] MemManager.alloc write/read\n")
return 1
stdio.printf("memhub: Polymorphism ok\n")
stdio.printf("memhub: === All Tests Passed ===\n")
return 0