From 043a96a6b7cf55f7ef58fb5ebf8ad87b7d50b571 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 18 Oct 2021 12:31:20 +0200 Subject: Add header files for all modules --- src/bootstrap/gc.c | 67 ++++++++---------------------------------------------- 1 file changed, 10 insertions(+), 57 deletions(-) (limited to 'src/bootstrap/gc.c') diff --git a/src/bootstrap/gc.c b/src/bootstrap/gc.c index 11a1f5a..473930a 100644 --- a/src/bootstrap/gc.c +++ b/src/bootstrap/gc.c @@ -1,48 +1,4 @@ -// Stack of root nodes. -typedef struct RootNodes { - Object **buf; - size_t size; - size_t cap; -} RootNodes; - -// Stack of active environments. -typedef struct ActiveEnvs { - Environment **buf; - size_t size; - size_t cap; -} ActiveEnvs; - -typedef struct Environments { - Environment *buf; - size_t size; - size_t cap; -} Environments; - -typedef struct FreeList { - size_t *buf; - size_t size; - size_t cap; - size_t position; -} FreeList; - -typedef struct GC { - RootNodes roots; - Environments envs; - Object *objects; - size_t obj_cap; - FreeList free_objects; - FreeList free_envs; - ActiveEnvs active_envs; -} GC; - -#define GC_OBJS_CAP 1024 * 1024 -#define GC_ROOTS_CAP 1024 -#define GC_ENVS_CAP 1024 * 4 - -static GC gc; - -void mark_and_sweep(void); -void dump_gc(void); +#include "gc.h" Environment * alloc_env(void) { @@ -115,9 +71,9 @@ init_gc(void) { .cap = GC_ENVS_CAP, }, .active_envs = (ActiveEnvs){ - .buf = malloc(GC_ROOTS_CAP * sizeof(Environment*)), + .buf = malloc(GC_ACTIVE_ENVS_CAP * sizeof(Environment*)), .size = 0, - .cap = GC_ROOTS_CAP, + .cap = GC_ACTIVE_ENVS_CAP, }, }; @@ -131,13 +87,6 @@ init_gc(void) { } } -Object * -get_obj(size_t offset) { - return &gc.objects[offset]; -} - -void mark_obj(Object *obj); - void mark_environment(Environment *env) { if (env == NULL || env->marked) { @@ -190,11 +139,15 @@ mark_and_sweep(void) { if (!obj->marked) { // Free heap allocated memory for this object if needed. if (obj->type == OBJ_TYPE_SYMBOL) { - free(obj->symbol); + if (obj->symbol != NULL) { + free(obj->symbol); + } obj->symbol = NULL; obj->symbol_n = 0; } else if (obj->type == OBJ_TYPE_STRING) { - free(obj->string); + if (obj->symbol != NULL) { + free(obj->string); + } obj->string = NULL; obj->string_n = 0; } @@ -280,7 +233,7 @@ alloc_object(ObjectType type) { } size_t slot = gc.free_objects.buf[gc.free_objects.position++]; gc.free_objects.size--; - Object *obj = get_obj(slot); + Object *obj = &gc.objects[slot]; obj->type = type; obj->marked = false; return obj; -- cgit v1.2.1