Aria

A low-level systems programming language
git clone git://git.m21c.me/Aria.git
Log | Files | Refs | README | LICENSE

commit 76dfeefab0f439941778a04ab7ce4fb4df0a2995
parent 4d920f19645ab1f14501ec54273add8bdba4bab4
Author: m21c <ho*******@gmail.com>
Date:   Mon, 15 Jun 2026 22:15:46 +0200

working on compiler mem management

Diffstat:
Mcompiler.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;