// An simple arena allocator that provides a `clear_memory` function to reset // everything to the initial state. A user must have to make sure that there // a no more references to cleared memory. const ALIGN_LOG2: usize = 3; const ALIGN_SIZE: usize = 1 << ALIGN_LOG2; const ALIGN_MASK: usize = ALIGN_SIZE - 1; var HEAP_OFFSET: usize = HEAP_BASE; // generated by the compiler export function allocate_memory(size: usize): usize { if (!size) return 0; var len: i32 = current_memory(); if (HEAP_OFFSET + size > len << 16) if(grow_memory(max(ceil(size / 65536), len * 2 - len)) < 0) unreachable(); var ptr: usize = HEAP_OFFSET; if ((HEAP_OFFSET += size) & ALIGN_MASK) // align next offset HEAP_OFFSET = (HEAP_OFFSET | ALIGN_MASK) + 1; set_memory(ptr, 0, size); return ptr; } export function free_memory(ptr: usize): void { // nop } export function clear_memory(): void { HEAP_OFFSET = HEAP_BASE; }