1#![no_std]
2#![no_main]
3#![feature(alloc_error_handler, core_intrinsics)]
4
5mod utils;
6
7use core::alloc::{GlobalAlloc, Layout};
9
10const HEAP_SIZE: usize = include!(concat!(env!("OUT_DIR"), "/WASM_ALLOCATOR_HEAP_SIZE"));
11
12static mut HEAP: [u8; HEAP_SIZE] = [0; HEAP_SIZE];
13
14static mut HEAP_TOP: usize = 0;
15
16pub struct Heap;
17
18#[allow(dead_code)]
19unsafe impl GlobalAlloc for Heap {
20 unsafe fn alloc(&self, layout: Layout) -> *mut u8 {
21 let size = layout.size();
22 let align = layout.align();
23
24 if HEAP_TOP < HEAP_SIZE {
25 let ptr = HEAP.as_mut_ptr().add(HEAP_TOP);
26 let aligned_size = ptr.align_offset(align) + size; if HEAP_TOP + aligned_size <= HEAP_SIZE {
28 HEAP_TOP += aligned_size;
29 return ptr;
30 }
31 }
32
33 core::ptr::null_mut()
34 }
35
36 unsafe fn dealloc(&self, ptr: *mut u8, _layout: Layout) {
38 if ptr.is_null() {}
39 }
40}
41
42impl Heap {
43 pub fn get_heap_top() -> usize {
47 unsafe { HEAP_TOP }
48 }
49}