aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-19 17:36:26 +0200
committerBad Diode <bd@badd10de.dev>2021-10-19 17:36:26 +0200
commit1cc52ef87809811a9792e4dd14f4cb71c3f34201 (patch)
tree7be08bbd5e0d6bf58eeee20bf14fe86d2418cf10
parent56ddeab2c7d32b2cd8e1e0435d3f006d7985cbe3 (diff)
downloadbdl-1cc52ef87809811a9792e4dd14f4cb71c3f34201.tar.gz
bdl-1cc52ef87809811a9792e4dd14f4cb71c3f34201.zip
Change gc.envs and gc.active_envs to use darray.h
-rw-r--r--src/bootstrap/gc.c42
-rw-r--r--src/bootstrap/gc.h17
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) {
13 } 13 }
14 size_t slot = gc.free_envs.buf[gc.free_envs.position++]; 14 size_t slot = gc.free_envs.buf[gc.free_envs.position++];
15 gc.free_envs.size--; 15 gc.free_envs.size--;
16 return &gc.envs.buf[slot]; 16 return &gc.envs[slot];
17} 17}
18 18
19void 19void
@@ -28,17 +28,12 @@ pop_root(void) {
28 28
29void 29void
30push_active_env(Environment *env) { 30push_active_env(Environment *env) {
31 if (gc.active_envs.size == gc.active_envs.cap) { 31 array_push(gc.active_envs, env);
32 gc.active_envs.cap *= 2;
33 gc.active_envs.buf = realloc(gc.active_envs.buf,
34 gc.active_envs.cap * sizeof(Environment *));
35 }
36 gc.active_envs.buf[gc.active_envs.size++] = env;
37} 32}
38 33
39Environment * 34Environment *
40pop_active_env(void) { 35pop_active_env(void) {
41 return gc.active_envs.buf[gc.active_envs.size--]; 36 return array_pop(gc.active_envs);
42} 37}
43 38
44void 39void
@@ -46,11 +41,6 @@ init_gc(void) {
46 gc = (GC){ 41 gc = (GC){
47 .objects = malloc(GC_OBJS_CAP * sizeof(Object)), 42 .objects = malloc(GC_OBJS_CAP * sizeof(Object)),
48 .obj_cap = GC_OBJS_CAP, 43 .obj_cap = GC_OBJS_CAP,
49 .envs = (Environments){
50 .buf = malloc(GC_ENVS_CAP * sizeof(Environment)),
51 .size = 0,
52 .cap = GC_ENVS_CAP,
53 },
54 .free_objects = (FreeList){ 44 .free_objects = (FreeList){
55 .buf = malloc(GC_OBJS_CAP * sizeof(size_t)), 45 .buf = malloc(GC_OBJS_CAP * sizeof(size_t)),
56 .size = GC_OBJS_CAP, 46 .size = GC_OBJS_CAP,
@@ -61,13 +51,13 @@ init_gc(void) {
61 .size = GC_ENVS_CAP, 51 .size = GC_ENVS_CAP,
62 .cap = GC_ENVS_CAP, 52 .cap = GC_ENVS_CAP,
63 }, 53 },
64 .active_envs = (ActiveEnvs){ 54 .envs = NULL,
65 .buf = malloc(GC_ACTIVE_ENVS_CAP * sizeof(Environment*)), 55 .roots = NULL,
66 .size = 0, 56 .active_envs = NULL,
67 .cap = GC_ACTIVE_ENVS_CAP,
68 },
69 }; 57 };
70 array_init(gc.roots, GC_ROOTS_CAP); 58 array_init(gc.roots, GC_ROOTS_CAP);
59 array_init(gc.active_envs, GC_ACTIVE_ENVS_CAP);
60 array_init(gc.envs, GC_ENVS_CAP);
71 61
72 // The free list stores the offset from the initial position for all 62 // The free list stores the offset from the initial position for all
73 // available slots. 63 // available slots.
@@ -112,8 +102,8 @@ mark_obj(Object *obj) {
112void 102void
113mark_and_sweep(void) { 103mark_and_sweep(void) {
114 // Mark. 104 // Mark.
115 for (size_t i = 0; i < gc.active_envs.size; i++) { 105 for (size_t i = 0; i < array_size(gc.active_envs); i++) {
116 mark_environment(gc.active_envs.buf[i]); 106 mark_environment(gc.active_envs[i]);
117 } 107 }
118 for (size_t i = 0; i < array_size(gc.roots); i++) { 108 for (size_t i = 0; i < array_size(gc.roots); i++) {
119 mark_obj(gc.roots[i]); 109 mark_obj(gc.roots[i]);
@@ -147,8 +137,8 @@ mark_and_sweep(void) {
147 } 137 }
148 obj->marked = false; 138 obj->marked = false;
149 } 139 }
150 for (size_t i = 0; i < gc.envs.cap; i++) { 140 for (size_t i = 0; i < array_cap(gc.envs); i++) {
151 Environment *env = &gc.envs.buf[i]; 141 Environment *env = &gc.envs[i];
152 if (!env->marked) { 142 if (!env->marked) {
153 if (env->buf != NULL) { 143 if (env->buf != NULL) {
154 free(env->buf); 144 free(env->buf);
@@ -189,8 +179,8 @@ dump_gc(void) {
189 printf("-------------- MISC --------------- \n"); 179 printf("-------------- MISC --------------- \n");
190 printf("gc.roots.size: %ld\n", array_size(gc.roots)); 180 printf("gc.roots.size: %ld\n", array_size(gc.roots));
191 printf("gc.roots.cap: %ld\n", array_size(gc.roots)); 181 printf("gc.roots.cap: %ld\n", array_size(gc.roots));
192 printf("gc.active_envs.size: %ld\n", gc.active_envs.size); 182 printf("gc.active_envs.size: %ld\n", array_size(gc.active_envs));
193 printf("gc.active_envs.cap: %ld\n", gc.active_envs.cap); 183 printf("gc.active_envs.cap: %ld\n", array_cap(gc.active_envs));
194 printf("gc.obj_cap: %ld\n", gc.obj_cap); 184 printf("gc.obj_cap: %ld\n", gc.obj_cap);
195 printf("gc.free_objects.size: %ld\n", gc.free_objects.size); 185 printf("gc.free_objects.size: %ld\n", gc.free_objects.size);
196 printf("gc.free_objects.cap: %ld\n", gc.free_objects.cap); 186 printf("gc.free_objects.cap: %ld\n", gc.free_objects.cap);
@@ -198,8 +188,8 @@ dump_gc(void) {
198 printf("gc.free_envs.size: %ld\n", gc.free_envs.size); 188 printf("gc.free_envs.size: %ld\n", gc.free_envs.size);
199 printf("gc.free_envs.cap: %ld\n", gc.free_envs.cap); 189 printf("gc.free_envs.cap: %ld\n", gc.free_envs.cap);
200 printf("gc.free_envs.position: %ld\n", gc.free_envs.position); 190 printf("gc.free_envs.position: %ld\n", gc.free_envs.position);
201 printf("gc.envs.size: %ld\n", gc.envs.size); 191 printf("gc.envs.size: %ld\n", array_size(gc.envs));
202 printf("gc.envs.cap: %ld\n", gc.envs.cap); 192 printf("gc.envs.cap: %ld\n", array_cap(gc.envs));
203} 193}
204 194
205Object * 195Object *
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 @@
4#include "objects.h" 4#include "objects.h"
5#include "environment.h" 5#include "environment.h"
6 6
7// Stack of active environments.
8typedef struct ActiveEnvs {
9 Environment **buf;
10 size_t size;
11 size_t cap;
12} ActiveEnvs;
13
14typedef struct Environments {
15 Environment *buf;
16 size_t size;
17 size_t cap;
18} Environments;
19
20typedef struct FreeList { 7typedef struct FreeList {
21 size_t *buf; 8 size_t *buf;
22 size_t size; 9 size_t size;
@@ -26,12 +13,12 @@ typedef struct FreeList {
26 13
27typedef struct GC { 14typedef struct GC {
28 Object **roots; 15 Object **roots;
29 Environments envs; 16 Environment *envs;
30 Object *objects; 17 Object *objects;
31 size_t obj_cap; 18 size_t obj_cap;
32 FreeList free_objects; 19 FreeList free_objects;
33 FreeList free_envs; 20 FreeList free_envs;
34 ActiveEnvs active_envs; 21 Environment **active_envs;
35} GC; 22} GC;
36 23
37void init_gc(void); 24void init_gc(void);