From 56ddeab2c7d32b2cd8e1e0435d3f006d7985cbe3 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 19 Oct 2021 17:29:30 +0200 Subject: Change gc.roots to use darray.h --- src/bootstrap/gc.c | 26 +++++++++----------------- src/bootstrap/gc.h | 9 +-------- src/bootstrap/main.c | 4 ++-- 3 files changed, 12 insertions(+), 27 deletions(-) (limited to 'src/bootstrap') diff --git a/src/bootstrap/gc.c b/src/bootstrap/gc.c index 473930a..296ae30 100644 --- a/src/bootstrap/gc.c +++ b/src/bootstrap/gc.c @@ -18,16 +18,12 @@ alloc_env(void) { void push_root(Object *obj) { - if (gc.roots.size == gc.roots.cap) { - gc.roots.cap *= 2; - gc.roots.buf = realloc(gc.roots.buf, gc.roots.cap * sizeof(Object *)); - } - gc.roots.buf[gc.roots.size++] = obj; + array_push(gc.roots, obj); } Object * pop_root(void) { - return gc.roots.buf[gc.roots.size--]; + return array_pop(gc.roots); } void @@ -55,11 +51,6 @@ init_gc(void) { .size = 0, .cap = GC_ENVS_CAP, }, - .roots = (RootNodes){ - .buf = malloc(GC_ROOTS_CAP * sizeof(Object*)), - .size = 0, - .cap = GC_ROOTS_CAP, - }, .free_objects = (FreeList){ .buf = malloc(GC_OBJS_CAP * sizeof(size_t)), .size = GC_OBJS_CAP, @@ -76,6 +67,7 @@ init_gc(void) { .cap = GC_ACTIVE_ENVS_CAP, }, }; + array_init(gc.roots, GC_ROOTS_CAP); // The free list stores the offset from the initial position for all // available slots. @@ -123,8 +115,8 @@ mark_and_sweep(void) { for (size_t i = 0; i < gc.active_envs.size; i++) { mark_environment(gc.active_envs.buf[i]); } - for (size_t i = 0; i < gc.roots.size; i++) { - mark_obj(gc.roots.buf[i]); + for (size_t i = 0; i < array_size(gc.roots); i++) { + mark_obj(gc.roots[i]); } // Reset the free list. @@ -173,8 +165,8 @@ mark_and_sweep(void) { void dump_gc(void) { printf("-------------- ROOTS -------------- \n"); - for (size_t i = 0; i < gc.roots.size; i++) { - display(gc.roots.buf[i]); + for (size_t i = 0; i < array_size(gc.roots); i++) { + display(gc.roots[i]); printf("\n"); } printf("--------- OBJECTS (TOP 20) -------- \n"); @@ -195,8 +187,8 @@ dump_gc(void) { printf("\n"); } printf("-------------- MISC --------------- \n"); - printf("gc.roots.size: %ld\n", gc.roots.size); - printf("gc.roots.cap: %ld\n", gc.roots.cap); + 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.obj_cap: %ld\n", gc.obj_cap); diff --git a/src/bootstrap/gc.h b/src/bootstrap/gc.h index 038c820..da53a21 100644 --- a/src/bootstrap/gc.h +++ b/src/bootstrap/gc.h @@ -4,13 +4,6 @@ #include "objects.h" #include "environment.h" -// 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; @@ -32,7 +25,7 @@ typedef struct FreeList { } FreeList; typedef struct GC { - RootNodes roots; + Object **roots; Environments envs; Object *objects; size_t obj_cap; diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c index 22332af..c2c88d6 100755 --- a/src/bootstrap/main.c +++ b/src/bootstrap/main.c @@ -108,9 +108,9 @@ process_source(const StringView *source) { }; while (has_next_token(&visitor) && peek_token(&visitor).type != TOKEN_EOF) { // Check the root node stack size before parsing - size_t root_stack_size = gc.roots.size; + size_t root_stack_size = array_size(gc.roots); Object *root = parse_tree(&visitor); - gc.roots.size = root_stack_size; + array_head(gc.roots)->size = root_stack_size; if (root == obj_err || errors_n != 0) { break; } -- cgit v1.2.1