diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-19 17:36:26 +0200 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-19 17:36:26 +0200 |
commit | 1cc52ef87809811a9792e4dd14f4cb71c3f34201 (patch) | |
tree | 7be08bbd5e0d6bf58eeee20bf14fe86d2418cf10 /src/bootstrap/gc.c | |
parent | 56ddeab2c7d32b2cd8e1e0435d3f006d7985cbe3 (diff) | |
download | bdl-1cc52ef87809811a9792e4dd14f4cb71c3f34201.tar.gz bdl-1cc52ef87809811a9792e4dd14f4cb71c3f34201.zip |
Change gc.envs and gc.active_envs to use darray.h
Diffstat (limited to 'src/bootstrap/gc.c')
-rw-r--r-- | src/bootstrap/gc.c | 42 |
1 files changed, 16 insertions, 26 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 | ||
19 | void | 19 | void |
@@ -28,17 +28,12 @@ pop_root(void) { | |||
28 | 28 | ||
29 | void | 29 | void |
30 | push_active_env(Environment *env) { | 30 | push_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 | ||
39 | Environment * | 34 | Environment * |
40 | pop_active_env(void) { | 35 | pop_active_env(void) { |
41 | return gc.active_envs.buf[gc.active_envs.size--]; | 36 | return array_pop(gc.active_envs); |
42 | } | 37 | } |
43 | 38 | ||
44 | void | 39 | void |
@@ -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) { | |||
112 | void | 102 | void |
113 | mark_and_sweep(void) { | 103 | mark_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 | ||
205 | Object * | 195 | Object * |