diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bootstrap/gc.c | 42 | ||||
-rw-r--r-- | 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) { | |||
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 * |
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. | ||
8 | typedef struct ActiveEnvs { | ||
9 | Environment **buf; | ||
10 | size_t size; | ||
11 | size_t cap; | ||
12 | } ActiveEnvs; | ||
13 | |||
14 | typedef struct Environments { | ||
15 | Environment *buf; | ||
16 | size_t size; | ||
17 | size_t cap; | ||
18 | } Environments; | ||
19 | |||
20 | typedef struct FreeList { | 7 | typedef 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 | ||
27 | typedef struct GC { | 14 | typedef 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 | ||
37 | void init_gc(void); | 24 | void init_gc(void); |