From bb58afb57221eb0316d6ee14e19c5f4c4a822ba1 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 16 Oct 2021 21:22:08 +0200 Subject: Add a working GC with mark-and-sweep --- src/bootstrap/main.c | 117 ++++++++++++++++++++++----------------------------- 1 file changed, 50 insertions(+), 67 deletions(-) (limited to 'src/bootstrap/main.c') 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) { push_root(obj_err); push_root(obj_quote); -// // Global environment. -// global_env = env_create(NULL); - -// // Primitive symbols. -// MAKE_ENV_VAR(global_env, "else", obj_true); -// MAKE_ENV_VAR(global_env, "nil", obj_nil); - -// // Primitive procedures. -// MAKE_ENV_PROC(global_env, "eval", proc_eval); -// MAKE_ENV_PROC(global_env, "quote", proc_quote); -// MAKE_ENV_PROC(global_env, "car", proc_car); -// MAKE_ENV_PROC(global_env, "cdr", proc_cdr); -// MAKE_ENV_PROC(global_env, "cons", proc_cons); -// MAKE_ENV_PROC(global_env, "list", proc_list); -// MAKE_ENV_PROC(global_env, "+", proc_sum); -// MAKE_ENV_PROC(global_env, "-", proc_sub); -// MAKE_ENV_PROC(global_env, "*", proc_mul); -// MAKE_ENV_PROC(global_env, "/", proc_div); -// MAKE_ENV_PROC(global_env, "%", proc_mod); -// MAKE_ENV_PROC(global_env, "print", proc_print); -// MAKE_ENV_PROC(global_env, "display", proc_display); -// MAKE_ENV_PROC(global_env, "newline", proc_newline); -// MAKE_ENV_PROC(global_env, "boolean?", proc_is_boolean); -// MAKE_ENV_PROC(global_env, "nil?", proc_is_nil); -// MAKE_ENV_PROC(global_env, "symbol?", proc_is_symbol); -// MAKE_ENV_PROC(global_env, "string?", proc_is_string); -// MAKE_ENV_PROC(global_env, "fixnum?", proc_is_fixnum); -// MAKE_ENV_PROC(global_env, "pair?", proc_is_pair); -// MAKE_ENV_PROC(global_env, "procedure?", proc_is_procedure); -// MAKE_ENV_PROC(global_env, "error?", proc_is_error); -// MAKE_ENV_PROC(global_env, "not", proc_not); -// MAKE_ENV_PROC(global_env, "and", proc_and); -// MAKE_ENV_PROC(global_env, "or", proc_or); -// MAKE_ENV_PROC(global_env, "if", proc_if); -// MAKE_ENV_PROC(global_env, "cond", proc_cond); -// MAKE_ENV_PROC(global_env, "<", proc_num_less_than); -// MAKE_ENV_PROC(global_env, "<=", proc_num_lesseq_than); -// MAKE_ENV_PROC(global_env, ">", proc_num_greater_than); -// MAKE_ENV_PROC(global_env, ">=", proc_num_greatereq_than); -// MAKE_ENV_PROC(global_env, "=", proc_num_equal); -// MAKE_ENV_PROC(global_env, "eq?", proc_equal); -// MAKE_ENV_PROC(global_env, "def", proc_define); -// MAKE_ENV_PROC(global_env, "set!", proc_set); -// MAKE_ENV_PROC(global_env, "lambda", proc_lambda); -// MAKE_ENV_PROC(global_env, "fun", proc_fun); - -// // Runtime procedures. -// MAKE_ENV_PROC(global_env, "supress-errors", proc_supress_errors); + // Global environment. + global_env = env_create(NULL); + // TODO: make sure we create symbols and strings only once (interning + // strings?) + + // Primitive symbols. + MAKE_ENV_VAR(global_env, "else", obj_true); + MAKE_ENV_VAR(global_env, "nil", obj_nil); + + // Primitive procedures. + MAKE_ENV_PROC(global_env, "eval", proc_eval); + MAKE_ENV_PROC(global_env, "quote", proc_quote); + MAKE_ENV_PROC(global_env, "car", proc_car); + MAKE_ENV_PROC(global_env, "cdr", proc_cdr); + MAKE_ENV_PROC(global_env, "cons", proc_cons); + MAKE_ENV_PROC(global_env, "list", proc_list); + MAKE_ENV_PROC(global_env, "+", proc_sum); + MAKE_ENV_PROC(global_env, "-", proc_sub); + MAKE_ENV_PROC(global_env, "*", proc_mul); + MAKE_ENV_PROC(global_env, "/", proc_div); + MAKE_ENV_PROC(global_env, "%", proc_mod); + MAKE_ENV_PROC(global_env, "print", proc_print); + MAKE_ENV_PROC(global_env, "display", proc_display); + MAKE_ENV_PROC(global_env, "newline", proc_newline); + MAKE_ENV_PROC(global_env, "boolean?", proc_is_boolean); + MAKE_ENV_PROC(global_env, "nil?", proc_is_nil); + MAKE_ENV_PROC(global_env, "symbol?", proc_is_symbol); + MAKE_ENV_PROC(global_env, "string?", proc_is_string); + MAKE_ENV_PROC(global_env, "fixnum?", proc_is_fixnum); + MAKE_ENV_PROC(global_env, "pair?", proc_is_pair); + MAKE_ENV_PROC(global_env, "procedure?", proc_is_procedure); + MAKE_ENV_PROC(global_env, "error?", proc_is_error); + MAKE_ENV_PROC(global_env, "not", proc_not); + MAKE_ENV_PROC(global_env, "and", proc_and); + MAKE_ENV_PROC(global_env, "or", proc_or); + MAKE_ENV_PROC(global_env, "if", proc_if); + MAKE_ENV_PROC(global_env, "cond", proc_cond); + MAKE_ENV_PROC(global_env, "<", proc_num_less_than); + MAKE_ENV_PROC(global_env, "<=", proc_num_lesseq_than); + MAKE_ENV_PROC(global_env, ">", proc_num_greater_than); + MAKE_ENV_PROC(global_env, ">=", proc_num_greatereq_than); + MAKE_ENV_PROC(global_env, "=", proc_num_equal); + MAKE_ENV_PROC(global_env, "eq?", proc_equal); + MAKE_ENV_PROC(global_env, "def", proc_define); + MAKE_ENV_PROC(global_env, "set!", proc_set); + MAKE_ENV_PROC(global_env, "lambda", proc_lambda); + MAKE_ENV_PROC(global_env, "fun", proc_fun); + + // Runtime procedures. + MAKE_ENV_PROC(global_env, "supress-errors", proc_supress_errors); } void @@ -113,24 +115,6 @@ process_source(const StringView *source) { Object *root = parse_tree(&visitor); gc.roots.size = root_stack_size; push_root(root); - // printf("AFTER: %ld\n", gc.roots.size); - // return the stack before parsing to previous state except we now have - // the root object as well. - // printf("-----------\n"); - // printf("ROOTS: \n"); - // for (size_t i = 0; i < gc.roots.size; i++) { - // display(gc.roots.buf[i]); - // printf("\n"); - // } - // printf("...........\n"); - for (size_t i = 0; i < gc.obj_cap; i++) { - Object *obj = &gc.obj_list[i]; - printf("marked? : %d ", obj->marked); - printf("type: %d ", obj->type); - display(obj); - printf("\n"); - } - // printf("===========\n"); if (root == obj_err || errors_n != 0) { break; } @@ -141,7 +125,6 @@ process_source(const StringView *source) { printf("\n"); } pop_root(); - // mark_and_sweep(); } if (tokens.buf != NULL) { -- cgit v1.2.1