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 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-) (limited to 'src/bootstrap/gc.c') 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 * -- cgit v1.2.1