Skip to main content

kg_js/
alloc.rs

1use std::alloc::Layout;
2use std::mem::size_of;
3
4pub unsafe fn alloc(size: usize) -> *mut u8 {
5    let size = size + size_of::<usize>();
6    let layout = Layout::from_size_align_unchecked(size, size_of::<usize>());
7    let ptr = std::alloc::alloc(layout);
8    if ptr.is_null() {
9        std::alloc::handle_alloc_error(layout);
10    }
11    *(ptr as *mut usize) = size;
12    ptr.offset(size_of::<usize>() as isize)
13}
14
15pub unsafe fn realloc(ptr: *mut u8, size: usize) -> *mut u8 {
16    if ptr.is_null() {
17        alloc(size)
18    } else {
19        let size = size + size_of::<usize>();
20        let ptr = ptr.offset(-(size_of::<usize>() as isize));
21        let old_size = *(ptr as *mut usize);
22        let layout = Layout::from_size_align_unchecked(old_size, size_of::<usize>());
23        let ptr = std::alloc::realloc(ptr, layout, size);
24        if ptr.is_null() {
25            std::alloc::handle_alloc_error(layout);
26        }
27        *(ptr as *mut usize) = size;
28        ptr.offset(size_of::<usize>() as isize)
29    }
30}
31
32pub unsafe fn free(ptr: *mut u8) {
33    if ptr.is_null() {
34        return;
35    }
36    let ptr = ptr.offset(-(size_of::<usize>() as isize));
37    let size = *(ptr as *mut usize);
38    let layout = Layout::from_size_align_unchecked(size, size_of::<usize>());
39    std::alloc::dealloc(ptr, layout);
40}