about summary refs log tree commit diff
path: root/std/mem.pry
diff options
context:
space:
mode:
Diffstat (limited to 'std/mem.pry')
-rw-r--r--std/mem.pry29
1 files changed, 29 insertions, 0 deletions
diff --git a/std/mem.pry b/std/mem.pry
new file mode 100644
index 0000000..75f3d1d
--- /dev/null
+++ b/std/mem.pry
@@ -0,0 +1,29 @@
+extern calloc = (i64, i64) => *void;
+extern realloc = (*void, i64) => *void;
+extern free = (*void) => void;
+
+import "!stdlib.pry";
+
+let arena = struct {
+	buf: *void,
+	offset: i64,
+};
+
+let arena_init = (size: i64) => *arena {
+	let a = cast(*arena, calloc(1, sizeof(arena)));
+	(*a).buf = calloc(1, 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 {
+	let old_offset = (*a).offset;
+	(*a).offset = (*a).offset + size;
+	return cast(*void, cast(*i8, (*a).buf) + cast(*i8, old_offset));
+};