aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/main.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-16 21:22:08 +0200
committerBad Diode <bd@badd10de.dev>2021-10-16 21:22:08 +0200
commitbb58afb57221eb0316d6ee14e19c5f4c4a822ba1 (patch)
treef7e35285282ad2341740a83834bdb521cd61a857 /src/bootstrap/main.c
parent9a5fceac983db127de876c875a59307f8f2893ba (diff)
downloadbdl-bb58afb57221eb0316d6ee14e19c5f4c4a822ba1.tar.gz
bdl-bb58afb57221eb0316d6ee14e19c5f4c4a822ba1.zip
Add a working GC with mark-and-sweep
Diffstat (limited to 'src/bootstrap/main.c')
-rwxr-xr-xsrc/bootstrap/main.c117
1 files changed, 50 insertions, 67 deletions
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c
index ce1fdfe..66b1300 100755
--- a/src/bootstrap/main.c
+++ b/src/bootstrap/main.c
@@ -43,54 +43,56 @@ init(void) {
43 push_root(obj_err); 43 push_root(obj_err);
44 push_root(obj_quote); 44 push_root(obj_quote);
45 45
46// // Global environment. 46 // Global environment.
47// global_env = env_create(NULL); 47 global_env = env_create(NULL);
48 48 // TODO: make sure we create symbols and strings only once (interning
49// // Primitive symbols. 49 // strings?)
50// MAKE_ENV_VAR(global_env, "else", obj_true); 50
51// MAKE_ENV_VAR(global_env, "nil", obj_nil); 51 // Primitive symbols.
52 52 MAKE_ENV_VAR(global_env, "else", obj_true);
53// // Primitive procedures. 53 MAKE_ENV_VAR(global_env, "nil", obj_nil);
54// MAKE_ENV_PROC(global_env, "eval", proc_eval); 54
55// MAKE_ENV_PROC(global_env, "quote", proc_quote); 55 // Primitive procedures.
56// MAKE_ENV_PROC(global_env, "car", proc_car); 56 MAKE_ENV_PROC(global_env, "eval", proc_eval);
57// MAKE_ENV_PROC(global_env, "cdr", proc_cdr); 57 MAKE_ENV_PROC(global_env, "quote", proc_quote);
58// MAKE_ENV_PROC(global_env, "cons", proc_cons); 58 MAKE_ENV_PROC(global_env, "car", proc_car);
59// MAKE_ENV_PROC(global_env, "list", proc_list); 59 MAKE_ENV_PROC(global_env, "cdr", proc_cdr);
60// MAKE_ENV_PROC(global_env, "+", proc_sum); 60 MAKE_ENV_PROC(global_env, "cons", proc_cons);
61// MAKE_ENV_PROC(global_env, "-", proc_sub); 61 MAKE_ENV_PROC(global_env, "list", proc_list);
62// MAKE_ENV_PROC(global_env, "*", proc_mul); 62 MAKE_ENV_PROC(global_env, "+", proc_sum);
63// MAKE_ENV_PROC(global_env, "/", proc_div); 63 MAKE_ENV_PROC(global_env, "-", proc_sub);
64// MAKE_ENV_PROC(global_env, "%", proc_mod); 64 MAKE_ENV_PROC(global_env, "*", proc_mul);
65// MAKE_ENV_PROC(global_env, "print", proc_print); 65 MAKE_ENV_PROC(global_env, "/", proc_div);
66// MAKE_ENV_PROC(global_env, "display", proc_display); 66 MAKE_ENV_PROC(global_env, "%", proc_mod);
67// MAKE_ENV_PROC(global_env, "newline", proc_newline); 67 MAKE_ENV_PROC(global_env, "print", proc_print);
68// MAKE_ENV_PROC(global_env, "boolean?", proc_is_boolean); 68 MAKE_ENV_PROC(global_env, "display", proc_display);
69// MAKE_ENV_PROC(global_env, "nil?", proc_is_nil); 69 MAKE_ENV_PROC(global_env, "newline", proc_newline);
70// MAKE_ENV_PROC(global_env, "symbol?", proc_is_symbol); 70 MAKE_ENV_PROC(global_env, "boolean?", proc_is_boolean);
71// MAKE_ENV_PROC(global_env, "string?", proc_is_string); 71 MAKE_ENV_PROC(global_env, "nil?", proc_is_nil);
72// MAKE_ENV_PROC(global_env, "fixnum?", proc_is_fixnum); 72 MAKE_ENV_PROC(global_env, "symbol?", proc_is_symbol);
73// MAKE_ENV_PROC(global_env, "pair?", proc_is_pair); 73 MAKE_ENV_PROC(global_env, "string?", proc_is_string);
74// MAKE_ENV_PROC(global_env, "procedure?", proc_is_procedure); 74 MAKE_ENV_PROC(global_env, "fixnum?", proc_is_fixnum);
75// MAKE_ENV_PROC(global_env, "error?", proc_is_error); 75 MAKE_ENV_PROC(global_env, "pair?", proc_is_pair);
76// MAKE_ENV_PROC(global_env, "not", proc_not); 76 MAKE_ENV_PROC(global_env, "procedure?", proc_is_procedure);
77// MAKE_ENV_PROC(global_env, "and", proc_and); 77 MAKE_ENV_PROC(global_env, "error?", proc_is_error);
78// MAKE_ENV_PROC(global_env, "or", proc_or); 78 MAKE_ENV_PROC(global_env, "not", proc_not);
79// MAKE_ENV_PROC(global_env, "if", proc_if); 79 MAKE_ENV_PROC(global_env, "and", proc_and);
80// MAKE_ENV_PROC(global_env, "cond", proc_cond); 80 MAKE_ENV_PROC(global_env, "or", proc_or);
81// MAKE_ENV_PROC(global_env, "<", proc_num_less_than); 81 MAKE_ENV_PROC(global_env, "if", proc_if);
82// MAKE_ENV_PROC(global_env, "<=", proc_num_lesseq_than); 82 MAKE_ENV_PROC(global_env, "cond", proc_cond);
83// MAKE_ENV_PROC(global_env, ">", proc_num_greater_than); 83 MAKE_ENV_PROC(global_env, "<", proc_num_less_than);
84// MAKE_ENV_PROC(global_env, ">=", proc_num_greatereq_than); 84 MAKE_ENV_PROC(global_env, "<=", proc_num_lesseq_than);
85// MAKE_ENV_PROC(global_env, "=", proc_num_equal); 85 MAKE_ENV_PROC(global_env, ">", proc_num_greater_than);
86// MAKE_ENV_PROC(global_env, "eq?", proc_equal); 86 MAKE_ENV_PROC(global_env, ">=", proc_num_greatereq_than);
87// MAKE_ENV_PROC(global_env, "def", proc_define); 87 MAKE_ENV_PROC(global_env, "=", proc_num_equal);
88// MAKE_ENV_PROC(global_env, "set!", proc_set); 88 MAKE_ENV_PROC(global_env, "eq?", proc_equal);
89// MAKE_ENV_PROC(global_env, "lambda", proc_lambda); 89 MAKE_ENV_PROC(global_env, "def", proc_define);
90// MAKE_ENV_PROC(global_env, "fun", proc_fun); 90 MAKE_ENV_PROC(global_env, "set!", proc_set);
91 91 MAKE_ENV_PROC(global_env, "lambda", proc_lambda);
92// // Runtime procedures. 92 MAKE_ENV_PROC(global_env, "fun", proc_fun);
93// MAKE_ENV_PROC(global_env, "supress-errors", proc_supress_errors); 93
94 // Runtime procedures.
95 MAKE_ENV_PROC(global_env, "supress-errors", proc_supress_errors);
94} 96}
95 97
96void 98void
@@ -113,24 +115,6 @@ process_source(const StringView *source) {
113 Object *root = parse_tree(&visitor); 115 Object *root = parse_tree(&visitor);
114 gc.roots.size = root_stack_size; 116 gc.roots.size = root_stack_size;
115 push_root(root); 117 push_root(root);
116 // printf("AFTER: %ld\n", gc.roots.size);
117 // return the stack before parsing to previous state except we now have
118 // the root object as well.
119 // printf("-----------\n");
120 // printf("ROOTS: \n");
121 // for (size_t i = 0; i < gc.roots.size; i++) {
122 // display(gc.roots.buf[i]);
123 // printf("\n");
124 // }
125 // printf("...........\n");
126 for (size_t i = 0; i < gc.obj_cap; i++) {
127 Object *obj = &gc.obj_list[i];
128 printf("marked? : %d ", obj->marked);
129 printf("type: %d ", obj->type);
130 display(obj);
131 printf("\n");
132 }
133 // printf("===========\n");
134 if (root == obj_err || errors_n != 0) { 118 if (root == obj_err || errors_n != 0) {
135 break; 119 break;
136 } 120 }
@@ -141,7 +125,6 @@ process_source(const StringView *source) {
141 printf("\n"); 125 printf("\n");
142 } 126 }
143 pop_root(); 127 pop_root();
144 // mark_and_sweep();
145 } 128 }
146 129
147 if (tokens.buf != NULL) { 130 if (tokens.buf != NULL) {