From 9a5fceac983db127de876c875a59307f8f2893ba Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 16 Oct 2021 11:30:07 +0200 Subject: Tag all objects as roots during parsing --- src/bootstrap/main.c | 129 +++++++++++++++++++++++++++++++-------------------- 1 file changed, 79 insertions(+), 50 deletions(-) (limited to 'src/bootstrap/main.c') 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) { obj_true = alloc_object(OBJ_TYPE_BOOL); obj_false = alloc_object(OBJ_TYPE_BOOL); obj_err = alloc_object(OBJ_TYPE_ERR); - - // 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); + obj_quote = make_symbol((StringView){"quote", 5}); + push_root(obj_nil); + push_root(obj_true); + push_root(obj_false); + 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); } void @@ -102,17 +108,40 @@ process_source(const StringView *source) { .current = 0, }; while (has_next_token(&visitor) && peek_token(&visitor).type != TOKEN_EOF) { + // check the stack before parsing + size_t root_stack_size = gc.roots.size; 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; } - // FIXME: Not freeing result or intermediate objects, can leak memory. Object *result = eval(global_env, root); if (result != obj_nil) { display(result); printf("\n"); } + pop_root(); + // mark_and_sweep(); } if (tokens.buf != NULL) { -- cgit v1.2.1