commit 76dfeefab0f439941778a04ab7ce4fb4df0a2995
parent 4d920f19645ab1f14501ec54273add8bdba4bab4
Author: m21c <ho*******@gmail.com>
Date: Mon, 15 Jun 2026 22:15:46 +0200
working on compiler mem management
Diffstat:
| M | compiler.c | | | 65 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- |
1 file changed, 64 insertions(+), 1 deletion(-)
diff --git a/compiler.c b/compiler.c
@@ -465,6 +465,15 @@ enum ConductKind {
// @section type definitions {{{
+#define ARENAPAGESIZE 512
+
+typedef
+struct MemArena {
+ uint8_t **pages;
+ size_t capacity, top;
+ size_t elemsize;
+} MemArena;
+
typedef
struct SrcLoc {
uint line, column;
@@ -945,6 +954,60 @@ mystrcasecmp(const char *str1, const char *str2)
// }}}
+// @section memory arena {{{
+
+#define arenaalloc(arena, Type) \
+ ((Type *) arenaallocinternal(arena, sizeof(Type)))
+
+static void *
+arenaallocinternal(MemArena *arena, size_t elemsize)
+{
+ union {uint8_t *in; void *out;} bitcast;
+
+ size_t pageindex = arena->top / ARENAPAGESIZE;
+ size_t pageoffset = arena->top % ARENAPAGESIZE;
+
+ assert(!arena->elemsize || arena->elemsize == elemsize);
+ arena->elemsize = elemsize;
+
+ if (pageindex >= arena->capacity) {
+ arena->capacity *= 2;
+ if (!arena->capacity)
+ arena->capacity = 1;
+ arena->pages = realloc(arena->pages, arena->capacity * sizeof(void*));
+ assert(arena->pages);
+ }
+
+ if (!arena->pages[pageindex]) {
+ arena->pages[pageindex] = calloc(ARENAPAGESIZE, arena->elemsize);
+ assert(arena->pages[pageindex]);
+ }
+
+ bitcast.in = arena->pages[pageindex] + pageoffset * arena->elemsize;
+
+ arena->top++;
+
+ return bitcast.out;
+}
+
+static void
+disposearena(MemArena *arena)
+{
+ int i;
+ for (i = 0; i < arena->capacity; ++i) {
+ if (arena->pages[i])
+ free(arena->pages[i]);
+ arena->pages[i] = NULL;
+ }
+ free(arena->pages);
+ arena->pages = NULL;
+}
+
+
+
+
+// }}}
+
// @section pre-lexer {{{
static void
@@ -5280,7 +5343,7 @@ int gisttop;
static Block *
makeblock(BlockKind kind, Env *env)
{
- Block *block = unpool(blockbuf, blocktop);
+ Block *block = simpleunpool(blockbuf, blocktop);
block->kind = kind;
block->env = env;