aboutsummaryrefslogtreecommitdiffstats
path: root/src/bootstrap/main.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-16 11:30:07 +0200
committerBad Diode <bd@badd10de.dev>2021-10-16 11:30:07 +0200
commit9a5fceac983db127de876c875a59307f8f2893ba (patch)
treeb39fa873c4f7b6a9604fca062e071506b8a10943 /src/bootstrap/main.c
parent4948ce511d0e96d34f165ed8d0a00e1d5f1caba9 (diff)
downloadbdl-9a5fceac983db127de876c875a59307f8f2893ba.tar.gz
bdl-9a5fceac983db127de876c875a59307f8f2893ba.zip
Tag all objects as roots during parsing
Diffstat (limited to 'src/bootstrap/main.c')
-rwxr-xr-xsrc/bootstrap/main.c129
1 files changed, 79 insertions, 50 deletions
diff --git a/src/bootstrap/main.c b/src/bootstrap/main.c
index 575a924..ce1fdfe 100755
--- a/src/bootstrap/main.c
+++ b/src/bootstrap/main.c
@@ -36,55 +36,61 @@ init(void) {
36 obj_true = alloc_object(OBJ_TYPE_BOOL); 36 obj_true = alloc_object(OBJ_TYPE_BOOL);
37 obj_false = alloc_object(OBJ_TYPE_BOOL); 37 obj_false = alloc_object(OBJ_TYPE_BOOL);
38 obj_err = alloc_object(OBJ_TYPE_ERR); 38 obj_err = alloc_object(OBJ_TYPE_ERR);
39 39 obj_quote = make_symbol((StringView){"quote", 5});
40 // Global environment. 40 push_root(obj_nil);
41 global_env = env_create(NULL); 41 push_root(obj_true);
42 42 push_root(obj_false);
43 // Primitive symbols. 43 push_root(obj_err);
44 MAKE_ENV_VAR(global_env, "else", obj_true); 44 push_root(obj_quote);
45 MAKE_ENV_VAR(global_env, "nil", obj_nil); 45
46 46// // Global environment.
47 // Primitive procedures. 47// global_env = env_create(NULL);
48 MAKE_ENV_PROC(global_env, "eval", proc_eval); 48
49 MAKE_ENV_PROC(global_env, "quote", proc_quote); 49// // Primitive symbols.
50 MAKE_ENV_PROC(global_env, "car", proc_car); 50// MAKE_ENV_VAR(global_env, "else", obj_true);
51 MAKE_ENV_PROC(global_env, "cdr", proc_cdr); 51// MAKE_ENV_VAR(global_env, "nil", obj_nil);
52 MAKE_ENV_PROC(global_env, "cons", proc_cons); 52
53 MAKE_ENV_PROC(global_env, "list", proc_list); 53// // Primitive procedures.
54 MAKE_ENV_PROC(global_env, "+", proc_sum); 54// MAKE_ENV_PROC(global_env, "eval", proc_eval);
55 MAKE_ENV_PROC(global_env, "-", proc_sub); 55// MAKE_ENV_PROC(global_env, "quote", proc_quote);
56 MAKE_ENV_PROC(global_env, "*", proc_mul); 56// MAKE_ENV_PROC(global_env, "car", proc_car);
57 MAKE_ENV_PROC(global_env, "/", proc_div); 57// MAKE_ENV_PROC(global_env, "cdr", proc_cdr);
58 MAKE_ENV_PROC(global_env, "%", proc_mod); 58// MAKE_ENV_PROC(global_env, "cons", proc_cons);
59 MAKE_ENV_PROC(global_env, "print", proc_print); 59// MAKE_ENV_PROC(global_env, "list", proc_list);
60 MAKE_ENV_PROC(global_env, "display", proc_display); 60// MAKE_ENV_PROC(global_env, "+", proc_sum);
61 MAKE_ENV_PROC(global_env, "newline", proc_newline); 61// MAKE_ENV_PROC(global_env, "-", proc_sub);
62 MAKE_ENV_PROC(global_env, "boolean?", proc_is_boolean); 62// MAKE_ENV_PROC(global_env, "*", proc_mul);
63 MAKE_ENV_PROC(global_env, "nil?", proc_is_nil); 63// MAKE_ENV_PROC(global_env, "/", proc_div);
64 MAKE_ENV_PROC(global_env, "symbol?", proc_is_symbol); 64// MAKE_ENV_PROC(global_env, "%", proc_mod);
65 MAKE_ENV_PROC(global_env, "string?", proc_is_string); 65// MAKE_ENV_PROC(global_env, "print", proc_print);
66 MAKE_ENV_PROC(global_env, "fixnum?", proc_is_fixnum); 66// MAKE_ENV_PROC(global_env, "display", proc_display);
67 MAKE_ENV_PROC(global_env, "pair?", proc_is_pair); 67// MAKE_ENV_PROC(global_env, "newline", proc_newline);
68 MAKE_ENV_PROC(global_env, "procedure?", proc_is_procedure); 68// MAKE_ENV_PROC(global_env, "boolean?", proc_is_boolean);
69 MAKE_ENV_PROC(global_env, "error?", proc_is_error); 69// MAKE_ENV_PROC(global_env, "nil?", proc_is_nil);
70 MAKE_ENV_PROC(global_env, "not", proc_not); 70// MAKE_ENV_PROC(global_env, "symbol?", proc_is_symbol);
71 MAKE_ENV_PROC(global_env, "and", proc_and); 71// MAKE_ENV_PROC(global_env, "string?", proc_is_string);
72 MAKE_ENV_PROC(global_env, "or", proc_or); 72// MAKE_ENV_PROC(global_env, "fixnum?", proc_is_fixnum);
73 MAKE_ENV_PROC(global_env, "if", proc_if); 73// MAKE_ENV_PROC(global_env, "pair?", proc_is_pair);
74 MAKE_ENV_PROC(global_env, "cond", proc_cond); 74// MAKE_ENV_PROC(global_env, "procedure?", proc_is_procedure);
75 MAKE_ENV_PROC(global_env, "<", proc_num_less_than); 75// MAKE_ENV_PROC(global_env, "error?", proc_is_error);
76 MAKE_ENV_PROC(global_env, "<=", proc_num_lesseq_than); 76// MAKE_ENV_PROC(global_env, "not", proc_not);
77 MAKE_ENV_PROC(global_env, ">", proc_num_greater_than); 77// MAKE_ENV_PROC(global_env, "and", proc_and);
78 MAKE_ENV_PROC(global_env, ">=", proc_num_greatereq_than); 78// MAKE_ENV_PROC(global_env, "or", proc_or);
79 MAKE_ENV_PROC(global_env, "=", proc_num_equal); 79// MAKE_ENV_PROC(global_env, "if", proc_if);
80 MAKE_ENV_PROC(global_env, "eq?", proc_equal); 80// MAKE_ENV_PROC(global_env, "cond", proc_cond);
81 MAKE_ENV_PROC(global_env, "def", proc_define); 81// MAKE_ENV_PROC(global_env, "<", proc_num_less_than);
82 MAKE_ENV_PROC(global_env, "set!", proc_set); 82// MAKE_ENV_PROC(global_env, "<=", proc_num_lesseq_than);
83 MAKE_ENV_PROC(global_env, "lambda", proc_lambda); 83// MAKE_ENV_PROC(global_env, ">", proc_num_greater_than);
84 MAKE_ENV_PROC(global_env, "fun", proc_fun); 84// MAKE_ENV_PROC(global_env, ">=", proc_num_greatereq_than);
85 85// MAKE_ENV_PROC(global_env, "=", proc_num_equal);
86 // Runtime procedures. 86// MAKE_ENV_PROC(global_env, "eq?", proc_equal);
87 MAKE_ENV_PROC(global_env, "supress-errors", proc_supress_errors); 87// MAKE_ENV_PROC(global_env, "def", proc_define);
88// MAKE_ENV_PROC(global_env, "set!", proc_set);
89// MAKE_ENV_PROC(global_env, "lambda", proc_lambda);
90// MAKE_ENV_PROC(global_env, "fun", proc_fun);
91
92// // Runtime procedures.
93// MAKE_ENV_PROC(global_env, "supress-errors", proc_supress_errors);
88} 94}
89 95
90void 96void
@@ -102,17 +108,40 @@ process_source(const StringView *source) {
102 .current = 0, 108 .current = 0,
103 }; 109 };
104 while (has_next_token(&visitor) && peek_token(&visitor).type != TOKEN_EOF) { 110 while (has_next_token(&visitor) && peek_token(&visitor).type != TOKEN_EOF) {
111 // check the stack before parsing
112 size_t root_stack_size = gc.roots.size;
105 Object *root = parse_tree(&visitor); 113 Object *root = parse_tree(&visitor);
114 gc.roots.size = root_stack_size;
115 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");
106 if (root == obj_err || errors_n != 0) { 134 if (root == obj_err || errors_n != 0) {
107 break; 135 break;
108 } 136 }
109 137
110 // FIXME: Not freeing result or intermediate objects, can leak memory.
111 Object *result = eval(global_env, root); 138 Object *result = eval(global_env, root);
112 if (result != obj_nil) { 139 if (result != obj_nil) {
113 display(result); 140 display(result);
114 printf("\n"); 141 printf("\n");
115 } 142 }
143 pop_root();
144 // mark_and_sweep();
116 } 145 }
117 146
118 if (tokens.buf != NULL) { 147 if (tokens.buf != NULL) {