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