Files
ViperOS/vpsdk/stdlib.vp
T
TermiNexus a518f75b24 chore(vkernel): 重置基线 — 纳入 TPV codegen 修复配合的内核侧调整与既有工作区内容
- devfs.vp: string.split 传 PATH_BUFFER_SIZE(配合 split 新增容量参数)

- fat32_types.vp: lfn_extract 越界钳制(base+i > MAX_LFN 返回 -1)

- sheet.vp: gfx.Renderer 实参修正为 (fb, zb, w, h)(原单参导致 w/h=0 渲染空操作)

- 同批包含 VKernel 其余既有移植改动与 vpsdk/Apps/Libs 工作区内容
2026-09-11 14:27:01 +08:00

60 lines
1.8 KiB
Plaintext

import vpsdk.syscall as _sc
import string
import t, c
HEAP_BLOCK_MAGIC: t.CDefine = 0x48454150
@t.Object
class _heap_hdr:
magic: uint32
size: uint32
_heap_inited: int = 0
def _heap_init():
global _heap_inited
_heap_inited = 1
def malloc(size: t.CSizeT) -> t.CPtr | t.CExport:
global _heap_inited
if size == 0: return None
if _heap_inited == 0:
_heap_init()
hdr_size: t.CSizeT = _heap_hdr.__sizeof__()
total: t.CSizeT = hdr_size + size
ptr: uint64 = _sc._syscall1(uint64(_sc.SYSCALL_MMAP), uint64(total))
if ptr == 0: return None
hdr: _heap_hdr | t.CPtr = t.CVoid(ptr, t.CPtr)
hdr.magic = HEAP_BLOCK_MAGIC
hdr.size = uint32(size)
return t.CVoid(ptr + hdr_size, t.CPtr)
def free(ptr: t.CPtr) -> t.CExport:
if ptr is None: return
hdr_size: t.CSizeT = _heap_hdr.__sizeof__()
hdr: _heap_hdr | t.CPtr = t.CVoid(uint64(ptr) - hdr_size, t.CPtr)
if hdr.magic != HEAP_BLOCK_MAGIC: return
def calloc(nmemb: t.CSizeT, size: t.CSizeT) -> t.CPtr | t.CExport:
total: t.CSizeT = nmemb * size
p: t.CPtr = malloc(total)
if p:
string.memset(p, 0, total)
return p
def realloc(ptr: t.CPtr, size: t.CSizeT) -> t.CPtr | t.CExport:
if ptr is None: return malloc(size)
if size == 0:
free(ptr)
return None
hdr_size: t.CSizeT = _heap_hdr.__sizeof__()
hdr: _heap_hdr | t.CPtr = t.CVoid(uint64(ptr) - hdr_size, t.CPtr)
if hdr.magic != HEAP_BLOCK_MAGIC: return None
old_size: t.CSizeT = hdr.size
new_ptr: t.CPtr = malloc(size)
if new_ptr is None: return None
copy_size: t.CSizeT = old_size if old_size < size else size
string.memcpy(new_ptr, ptr, copy_size)
free(ptr)
return new_ptr