From 1cc52ef87809811a9792e4dd14f4cb71c3f34201 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 19 Oct 2021 17:36:26 +0200 Subject: Change gc.envs and gc.active_envs to use darray.h --- src/bootstrap/gc.c | 42 ++++++++++++++++-------------------------- src/bootstrap/gc.h | 17 ++--------------- 2 files changed, 18 insertions(+), 41 deletions(-) diff --git a/src/bootstrap/gc.c b/src/bootstrap/gc.c index 296ae30..e091207 100644 --- a/src/bootstrap/gc.c +++ b/src/bootstrap/gc.c @@ -13,7 +13,7 @@ alloc_env(void) { } size_t slot = gc.free_envs.buf[gc.free_envs.position++]; gc.free_envs.size--; - return &gc.envs.buf[slot]; + return &gc.envs[slot]; } void @@ -28,17 +28,12 @@ pop_root(void) { void push_active_env(Environment *env) { - if (gc.active_envs.size == gc.active_envs.cap) { - gc.active_envs.cap *= 2; - gc.active_envs.buf = realloc(gc.active_envs.buf, - gc.active_envs.cap * sizeof(Environment *)); - } - gc.active_envs.buf[gc.active_envs.size++] = env; + array_push(gc.active_envs, env); } Environment * pop_active_env(void) { - return gc.active_envs.buf[gc.active_envs.size--]; + return array_pop(gc.active_envs); } void @@ -46,11 +41,6 @@ init_gc(void) { gc = (GC){ .objects = malloc(GC_OBJS_CAP * sizeof(Object)), .obj_cap = GC_OBJS_CAP, - .envs = (Environments){ - .buf = malloc(GC_ENVS_CAP * sizeof(Environment)), - .size = 0, - .cap = GC_ENVS_CAP, - }, .free_objects = (FreeList){ .buf = malloc(GC_OBJS_CAP * sizeof(size_t)), .size = GC_OBJS_CAP, @@ -61,13 +51,13 @@ init_gc(void) { .size = GC_ENVS_CAP, .cap = GC_ENVS_CAP, }, - .active_envs = (ActiveEnvs){ - .buf = malloc(GC_ACTIVE_ENVS_CAP * sizeof(Environment*)), - .size = 0, - .cap = GC_ACTIVE_ENVS_CAP, - }, + .envs = NULL, + .roots = NULL, + .active_envs = NULL, }; array_init(gc.roots, GC_ROOTS_CAP); + array_init(gc.active_envs, GC_ACTIVE_ENVS_CAP); + array_init(gc.envs, GC_ENVS_CAP); // The free list stores the offset from the initial position for all // available slots. @@ -112,8 +102,8 @@ mark_obj(Object *obj) { void mark_and_sweep(void) { // Mark. - for (size_t i = 0; i < gc.active_envs.size; i++) { - mark_environment(gc.active_envs.buf[i]); + for (size_t i = 0; i < array_size(gc.active_envs); i++) { + mark_environment(gc.active_envs[i]); } for (size_t i = 0; i < array_size(gc.roots); i++) { mark_obj(gc.roots[i]); @@ -147,8 +137,8 @@ mark_and_sweep(void) { } obj->marked = false; } - for (size_t i = 0; i < gc.envs.cap; i++) { - Environment *env = &gc.envs.buf[i]; + for (size_t i = 0; i < array_cap(gc.envs); i++) { + Environment *env = &gc.envs[i]; if (!env->marked) { if (env->buf != NULL) { free(env->buf); @@ -189,8 +179,8 @@ dump_gc(void) { printf("-------------- MISC --------------- \n"); printf("gc.roots.size: %ld\n", array_size(gc.roots)); printf("gc.roots.cap: %ld\n", array_size(gc.roots)); - printf("gc.active_envs.size: %ld\n", gc.active_envs.size); - printf("gc.active_envs.cap: %ld\n", gc.active_envs.cap); + 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", gc.obj_cap); printf("gc.free_objects.size: %ld\n", gc.free_objects.size); printf("gc.free_objects.cap: %ld\n", gc.free_objects.cap); @@ -198,8 +188,8 @@ dump_gc(void) { printf("gc.free_envs.size: %ld\n", gc.free_envs.size); printf("gc.free_envs.cap: %ld\n", gc.free_envs.cap); printf("gc.free_envs.position: %ld\n", gc.free_envs.position); - printf("gc.envs.size: %ld\n", gc.envs.size); - printf("gc.envs.cap: %ld\n", gc.envs.cap); + printf("gc.envs.size: %ld\n", array_size(gc.envs)); + printf("gc.envs.cap: %ld\n", array_cap(gc.envs)); } Object * diff --git a/src/bootstrap/gc.h b/src/bootstrap/gc.h index da53a21..96bdef6 100644 --- a/src/bootstrap/gc.h +++ b/src/bootstrap/gc.h @@ -4,19 +4,6 @@ #include "objects.h" #include "environment.h" -// 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; @@ -26,12 +13,12 @@ typedef struct FreeList { typedef struct GC { Object **roots; - Environments envs; + Environment *envs; Object *objects; size_t obj_cap; FreeList free_objects; FreeList free_envs; - ActiveEnvs active_envs; + Environment **active_envs; } GC; void init_gc(void); -- cgit v1.2.1