From c177bfeb1dbb5ec96af3a882d708a7fca3a5e1fe Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 19 Oct 2021 18:42:47 +0200 Subject: Change FreeList to use darray.h --- src/bootstrap/gc.c | 58 ++++++++++++++++++++++-------------------------------- src/bootstrap/gc.h | 4 +--- 2 files changed, 24 insertions(+), 38 deletions(-) (limited to 'src/bootstrap') diff --git a/src/bootstrap/gc.c b/src/bootstrap/gc.c index d281536..259cccd 100644 --- a/src/bootstrap/gc.c +++ b/src/bootstrap/gc.c @@ -2,17 +2,17 @@ Environment * alloc_env(void) { - if (gc.free_envs.size == 0) { + if (array_size(gc.free_envs.offsets) == 0) { mark_and_sweep(); - if (gc.free_envs.size == 0) { + if (array_size(gc.free_envs.offsets) == 0) { fprintf(stderr, "NO MORE ENV MEMORY AVAILABLE WHERE IS YOUR GOD NOW MWAHAHA\n"); dump_gc(); exit(EXIT_FAILURE); // TODO: grow heap tables. } } - size_t slot = gc.free_envs.buf[gc.free_envs.position++]; - gc.free_envs.size--; + size_t slot = gc.free_envs.offsets[gc.free_envs.position++]; + array_head(gc.free_envs.offsets)->size--; return &gc.envs[slot]; } @@ -38,34 +38,22 @@ pop_active_env(void) { void init_gc(void) { - gc = (GC){ - .free_objects = (FreeList){ - .buf = malloc(GC_OBJS_CAP * sizeof(size_t)), - .size = GC_OBJS_CAP, - .cap = GC_OBJS_CAP, - }, - .free_envs = (FreeList){ - .buf = malloc(GC_ENVS_CAP * sizeof(size_t)), - .size = GC_ENVS_CAP, - .cap = GC_ENVS_CAP, - }, - .objects = NULL, - .envs = NULL, - .roots = NULL, - .active_envs = NULL, - }; + gc = (GC){0}; + array_init(gc.objects, GC_OBJS_CAP); array_init(gc.roots, GC_ROOTS_CAP); array_init(gc.active_envs, GC_ACTIVE_ENVS_CAP); array_init(gc.envs, GC_ENVS_CAP); + array_init(gc.free_objects.offsets, GC_OBJS_CAP); + array_init(gc.free_envs.offsets, GC_ENVS_CAP); // The free list stores the offset from the initial position for all // available slots. for (size_t i = 0; i < GC_OBJS_CAP; i++) { - gc.free_objects.buf[i] = i; + array_push(gc.free_objects.offsets, i); } for (size_t i = 0; i < GC_ENVS_CAP; i++) { - gc.free_envs.buf[i] = i; + array_push(gc.free_envs.offsets, i); } } @@ -111,9 +99,9 @@ mark_and_sweep(void) { // Reset the free list. gc.free_objects.position = 0; - gc.free_objects.size = 0; + array_head(gc.free_objects.offsets)->size = 0; gc.free_envs.position = 0; - gc.free_envs.size = 0; + array_head(gc.free_envs.offsets)->size = 0; // Sweep. for (size_t i = 0; i < array_cap(gc.objects); i++) { @@ -125,7 +113,7 @@ mark_and_sweep(void) { } else if (obj->type == OBJ_TYPE_STRING) { array_free(obj->string); } - gc.free_objects.buf[gc.free_objects.size++] = i; + gc.free_objects.offsets[array_head(gc.free_objects.offsets)->size++] = i; } obj->marked = false; } @@ -133,7 +121,7 @@ mark_and_sweep(void) { Environment *env = &gc.envs[i]; if (!env->marked) { array_free(env->entries); - gc.free_envs.buf[gc.free_envs.size++] = i; + gc.free_envs.offsets[array_head(gc.free_envs.offsets)->size++] = i; } env->marked = false; } @@ -153,7 +141,7 @@ dump_gc(void) { display(obj); bool is_free = false; for (size_t j = 0; j < array_cap(gc.objects); j++) { - if (gc.free_objects.buf[j] == i) { + if (gc.free_objects.offsets[j] == i) { is_free = true; break; } @@ -169,11 +157,11 @@ dump_gc(void) { printf("gc.active_envs.size: %ld\n", array_size(gc.active_envs)); printf("gc.active_envs.cap: %ld\n", array_cap(gc.active_envs)); printf("gc.obj_cap: %ld\n", array_cap(gc.objects)); - printf("gc.free_objects.size: %ld\n", gc.free_objects.size); - printf("gc.free_objects.cap: %ld\n", gc.free_objects.cap); + printf("gc.free_objects.size: %ld\n", array_size(gc.free_objects.offsets)); + printf("gc.free_objects.cap: %ld\n", array_cap(gc.free_objects.offsets)); printf("gc.free_objects.position: %ld\n", gc.free_objects.position); - printf("gc.free_envs.size: %ld\n", gc.free_envs.size); - printf("gc.free_envs.cap: %ld\n", gc.free_envs.cap); + printf("array_size(gc.free_envs.offsets): %ld\n", array_size(gc.free_envs.offsets)); + printf("gc.free_envs.cap: %ld\n", array_cap(gc.free_envs.offsets)); printf("gc.free_envs.position: %ld\n", gc.free_envs.position); printf("gc.envs.size: %ld\n", array_size(gc.envs)); printf("gc.envs.cap: %ld\n", array_cap(gc.envs)); @@ -181,9 +169,9 @@ dump_gc(void) { Object * alloc_object(ObjectType type) { - if (gc.free_objects.size == 0) { + if (array_head(gc.free_objects.offsets)->size == 0) { mark_and_sweep(); - if (gc.free_objects.size == 0) { + if (array_head(gc.free_objects.offsets)->size == 0) { fprintf(stderr, "NO MORE OBJ MEMORY AVAILABLE WHERE IS YOUR GOD NOW MWAHAHA\n"); dump_gc(); exit(EXIT_FAILURE); @@ -200,8 +188,8 @@ alloc_object(ObjectType type) { // later. } } - size_t slot = gc.free_objects.buf[gc.free_objects.position++]; - gc.free_objects.size--; + size_t slot = gc.free_objects.offsets[gc.free_objects.position++]; + array_head(gc.free_objects.offsets)->size--; Object *obj = &gc.objects[slot]; obj->type = type; obj->marked = false; diff --git a/src/bootstrap/gc.h b/src/bootstrap/gc.h index 90a1196..0a0bbd0 100644 --- a/src/bootstrap/gc.h +++ b/src/bootstrap/gc.h @@ -5,9 +5,7 @@ #include "environment.h" typedef struct FreeList { - size_t *buf; - size_t size; - size_t cap; + size_t *offsets; size_t position; } FreeList; -- cgit v1.2.1