diff --git a/3rd/ftb b/3rd/ftb index 7d8eabf..7b128b3 160000 --- a/3rd/ftb +++ b/3rd/ftb @@ -1 +1 @@ -Subproject commit 7d8eabf47938ff4a056f94e8cbeb4a49ab9ea2d1 +Subproject commit 7b128b33c97060bb5a76be8d969d5318fb2cf65c diff --git a/bin/slime.rdbg b/bin/slime.rdbg index 30b5991..61b64ec 100644 Binary files a/bin/slime.rdbg and b/bin/slime.rdbg differ diff --git a/build.sh b/build.sh old mode 100755 new mode 100644 diff --git a/manual/build.sh b/manual/build.sh old mode 100755 new mode 100644 diff --git a/src/built_ins.cpp b/src/built_ins.cpp index 5252732..0a441d3 100644 --- a/src/built_ins.cpp +++ b/src/built_ins.cpp @@ -77,7 +77,8 @@ namespace Slime { try result = eval_expr(expr); } - delete program; + program->dealloc(); + free(program); free(file_content); return result; @@ -1012,6 +1013,7 @@ namespace Slime { profile_with_name("(exit)"); fetch(code); try assert_type(code, Lisp_Object_Type::Number); + Slime::Memory::free_everything(); exit((int)code->value.number); }; define((break), "TODO") { diff --git a/src/eval.cpp b/src/eval.cpp index 19e8e7a..3e8cc35 100644 --- a/src/eval.cpp +++ b/src/eval.cpp @@ -44,6 +44,7 @@ namespace Slime { Lisp_Object* sym, *val; // used as temp storage to use `try` Array_List read_in_keywords; + read_in_keywords.alloc(); int obligatory_keywords_count = 0; int read_obligatory_keywords_count = 0; @@ -73,6 +74,7 @@ namespace Slime { }; proc read_keyword_args = [&] { + // debug_break(); // keyword arguments: use all given ones and keep track of the // added ones (array list), if end of parameters in encountered or // something that is not a keyword is encountered or a keyword @@ -93,7 +95,7 @@ namespace Slime { while (Memory::get_type(next_arg) == Lisp_Object_Type::Keyword) { // check if this one is even an accepted keyword bool accepted = false; - for (int i = 0; i < arg_spec->keyword.values.next_index; ++i) { + for (int i = 0; i < arg_spec->keyword.keywords.next_index; ++i) { if (next_arg == arg_spec->keyword.keywords.data[i]) { accepted = true; @@ -146,12 +148,12 @@ namespace Slime { try_void sym = Memory::get_symbol(next_arg->value.symbol); next_arg = cs->data[++arg_start]; --arg_count; + // NOTE(Felix): It seems we do not need to evaluate the argument here... if (is_c_function) { try_void define_symbol(sym, next_arg); } else { - try_void define_symbol( - sym, + try_void define_symbol(sym, Memory::copy_lisp_object_except_pairs(next_arg)); } @@ -239,7 +241,6 @@ namespace Slime { try check_keyword_args(); try read_rest_arg(); - // TODO(Felix): fucking destructors return new_env; } proc create_extended_environment_for_function_application( @@ -283,6 +284,10 @@ namespace Slime { Lisp_Object* sym, *val; // used as temp storage to use `try` Array_List read_in_keywords; + read_in_keywords.alloc(); + defer { + read_in_keywords.dealloc(); + }; int obligatory_keywords_count = 0; int read_obligatory_keywords_count = 0; @@ -664,6 +669,11 @@ namespace Slime { Array_List nas; Array_List ams; + cs.alloc(); + pcs.alloc(); + nas.alloc(); + ams.alloc(); + proc debug_step = [&] { printf("cs:\n "); for (auto lo : cs) { @@ -1020,20 +1030,17 @@ namespace Slime { Lisp_Object* parsed, * evaluated; while (true) { - [&] { - delete_error(); - fputs("> ", stdout); - line = read_expression(); - defer { - free(line); - }; - try_void parsed = Parser::parse_single_expression(line); - try_void evaluated = nrc_eval(parsed); - if (evaluated != Memory::nil) { - print(evaluated); - fputs("\n", stdout); - } - }(); + delete_error(); + fputs("> ", stdout); + line = read_expression(); + try_void parsed = Parser::parse_single_expression(line); + free(line); + try_void evaluated = nrc_eval(parsed); + // try_void evaluated = eval_expr(parsed); + if (evaluated != Memory::nil) { + print(evaluated); + fputs("\n", stdout); + } } } } diff --git a/src/lisp_object.cpp b/src/lisp_object.cpp index 08cda75..50ff3ed 100644 --- a/src/lisp_object.cpp +++ b/src/lisp_object.cpp @@ -38,16 +38,16 @@ namespace Slime { delete this->value.hashMap; } break; case Lisp_Object_Type::CFunction: { - this->value.cFunction->args.positional.symbols.~Array_List(); - this->value.cFunction->args.keyword.keywords.~Array_List(); - this->value.cFunction->args.keyword.values.~Array_List(); - delete this->value.cFunction; + this->value.cFunction->args.positional.symbols.dealloc(); + this->value.cFunction->args.keyword.keywords.dealloc(); + this->value.cFunction->args.keyword.values.dealloc(); + free(this->value.cFunction); } break; case Lisp_Object_Type::Function:{ - this->value.function->args.positional.symbols.~Array_List(); - this->value.function->args.keyword.keywords.~Array_List(); - this->value.function->args.keyword.values.~Array_List(); - delete this->value.function; + this->value.function->args.positional.symbols.dealloc(); + this->value.function->args.keyword.keywords.dealloc(); + this->value.function->args.keyword.values.dealloc(); + free(this->value.function); } break; default: break; } diff --git a/src/main.cpp b/src/main.cpp index f37276c..07cf82a 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,12 +3,12 @@ int main(int argc, char* argv[]) { #ifdef _MSC_VER - // enable colored terminal output for windows - HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); - DWORD dwMode = 0; - GetConsoleMode(hOut, &dwMode); - dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; - SetConsoleMode(hOut, dwMode); + // enable colored terminal output for windows + HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); + DWORD dwMode = 0; + GetConsoleMode(hOut, &dwMode); + dwMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; + SetConsoleMode(hOut, dwMode); #endif if (argc > 1) { diff --git a/src/memory.cpp b/src/memory.cpp index 31aa960..5ae73a0 100644 --- a/src/memory.cpp +++ b/src/memory.cpp @@ -139,10 +139,15 @@ namespace Slime::Memory { lo->~Lisp_Object(); }); environment_memory.for_each([](Environment* env){ + env->parents.dealloc(); env->~Environment(); }); // free the exe dir: free(Globals::load_path.data[0]); + Globals::load_path.dealloc(); + Globals::Current_Execution::call_stack.dealloc(); + Globals::Current_Execution::envi_stack.dealloc(); + } @@ -151,8 +156,7 @@ namespace Slime::Memory { Environment* env = environment_memory.allocate(); // inject a new array list; - new(&env->parents) Array_List; - + env->parents.alloc(); if (parent) env->parents.append(parent); @@ -171,6 +175,10 @@ namespace Slime::Memory { profile_this(); char* exe_path = get_exe_dir(); // don't free exe path because it will be used until end of time + Globals::load_path.alloc(); + Globals::Current_Execution::call_stack.alloc(); + Globals::Current_Execution::envi_stack.alloc(); + add_to_load_path(exe_path); add_to_load_path("../bin/"); @@ -420,7 +428,10 @@ namespace Slime::Memory { Lisp_Object* node; try node = create_lisp_object(); set_type(node, Lisp_Object_Type::CFunction); - node->value.cFunction = new cFunction; + node->value.cFunction = (cFunction*)malloc(sizeof(cFunction)); + node->value.cFunction->args.keyword.keywords.alloc(); + node->value.cFunction->args.keyword.values.alloc(); + node->value.cFunction->args.positional.symbols.alloc(); node->value.cFunction->is_special_form = is_special; return node; } @@ -429,7 +440,10 @@ namespace Slime::Memory { Lisp_Object* func; try func = Memory::create_lisp_object(); Memory::set_type(func, Lisp_Object_Type::Function); - func->value.function = new Function; + func->value.function = (Function*)malloc(sizeof(Function)); + func->value.function->args.keyword.keywords.alloc(); + func->value.function->args.keyword.values.alloc(); + func->value.function->args.positional.symbols.alloc(); func->value.function->type = ft; return func; } diff --git a/src/parse.cpp b/src/parse.cpp index 0e66852..d0c1ddd 100644 --- a/src/parse.cpp +++ b/src/parse.cpp @@ -381,7 +381,8 @@ namespace Slime::Parser { parser_line = 1; parser_col = 0; - Array_List* program = new Array_List; + Array_List* program = (Array_List*)malloc(sizeof(Array_List)); + program->alloc(); int index_in_text = 0; Lisp_Object* parsed; diff --git a/src/structs.cpp b/src/structs.cpp index 7204160..dba0703 100644 --- a/src/structs.cpp +++ b/src/structs.cpp @@ -96,7 +96,6 @@ namespace Slime { Hash_Map hm; ~Environment() { - parents.~Array_List(); hm.~Hash_Map(); } }; diff --git a/src/testing.cpp b/src/testing.cpp index b7264aa..65038fb 100644 --- a/src/testing.cpp +++ b/src/testing.cpp @@ -118,6 +118,10 @@ namespace Slime { proc test_array_lists_adding_and_removing() -> testresult { // test adding and removing Array_List list; + list.alloc(); + defer { + list.dealloc(); + }; list.append(1); list.append(2); list.append(3); @@ -144,6 +148,11 @@ namespace Slime { proc test_array_lists_sorting() -> testresult { // test adding and removing Array_List list; + list.alloc(); + defer { + list.dealloc(); + }; + list.append(1); list.append(2); list.append(3); @@ -177,6 +186,11 @@ namespace Slime { proc test_array_lists_searching() -> testresult { Array_List list; + list.alloc(); + defer { + list.dealloc(); + }; + list.append(1); list.append(2); list.append(3); diff --git a/tests/fullslime/build.sh b/tests/fullslime/build.sh old mode 100755 new mode 100644 diff --git a/tests/libslime/build.sh b/tests/libslime/build.sh old mode 100755 new mode 100644