about summary refs log tree commit diff
path: root/std/mem.src
blob: 02ca7759381b6a0a6a9f88990d65afb8323a36a4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
extern malloc = (i64) => *void;
extern realloc = (*void, i64) => *void;
extern free = (*void) => void;

import "!stdlib.src";

let arena = struct {
	buf: *void,
	offset: i64,
};

let arena_init = (size: i64) => *arena {
	let a = cast(*arena, malloc(sizeof(arena)));
	(*a).buf = malloc(size);
	(*a).offset = 0;
	return a;
};

let arena_free = (a: *arena) => void {
	free((*a).buf);
	free(cast(*void, a));
	return;
};

let arena_alloc = (a: *arena, size: i64) => *void {
	if ((*a).offset + size > 10000000) {
		println("LOOOOOOOOOOOOOOOOOOOL!");
	};
	let old_offset = (*a).offset;
	(*a).offset = (*a).offset + size;
	return cast(*void, cast(*i8, (*a).buf) + cast(*i8, old_offset));
};