From aceb801adab8f0b4c1455873891d978e749c9f63 Mon Sep 17 00:00:00 2001 From: Felix Brendel Date: Sat, 7 Sep 2019 22:43:55 +0200 Subject: [PATCH] before arguments refactor --- .dir-locals.el | 2 +- build.bat | 4 +- build.sh | 0 manual/build.sh | 0 manual/built-in-docs.org | 271 ++++++++++++++++++++++++++++++++++----- src/built_ins.cpp | 24 ++-- src/defines.cpp | 38 +++++- src/eval.cpp | 10 +- src/ftb | 2 +- src/gc.cpp | 81 ++++++++++++ src/main.cpp | 2 +- src/profiler.cpp | 17 --- src/slime.h | 3 +- src/structs.cpp | 21 +-- src/testing.cpp | 1 + 15 files changed, 386 insertions(+), 90 deletions(-) mode change 100755 => 100644 build.sh mode change 100755 => 100644 manual/build.sh create mode 100644 src/gc.cpp diff --git a/.dir-locals.el b/.dir-locals.el index d84842d..3ae24d0 100644 --- a/.dir-locals.el +++ b/.dir-locals.el @@ -26,7 +26,7 @@ (font-lock-add-keywords 'c++-mode - '(("\\<\\(if_debug\\|if_windows\\|if_linux\\|defer\\|proc\\|try\\|try_void\\|ignore_logging\\|dont_break_on_errors\\)\\>" . + '(("\\<\\(if_debug\\|if_windows\\|if_linux\\|defer\\|proc\\|try\\|try_void\\|for_array_list\\|for_lisp_vector\\|for_lisp_list\\|ignore_logging\\|dont_break_on_errors\\)\\>" . font-lock-keyword-face))))))) (c++-mode . ((eval . (company-clang-set-prefix "slime.h")) diff --git a/build.bat b/build.bat index efcdc6d..9e0c21a 100644 --- a/build.bat +++ b/build.bat @@ -9,8 +9,8 @@ pushd bin taskkill /F /IM %exeName% > NUL 2> NUL echo ---------- Compiling ---------- -rem call ..\timecmd cl ../src/main.cpp /std:c++latest /Fe%exeName% /W3 /Zi /nologo /EHsc /link /NODEFAULTLIB:libucrt libucrtd.lib -call ..\timecmd clang-cl ../src/main.cpp -o %exeName% /O2 /std:c++latest /W3 /Zi /EHsc +call ..\timecmd cl ../src/main.cpp /D_DEBUG /Zi /std:c++latest /Fe%exeName% /W3 /wd4003 /nologo /EHsc /link /NODEFAULTLIB:libucrt libucrtd.lib +rem call ..\timecmd clang-cl ../src/main.cpp -o %exeName% /O2 /std:c++latest /W3 /Zi /EHsc popd if %errorlevel% == 0 ( 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/manual/built-in-docs.org b/manual/built-in-docs.org index 287ec35..0dc4b00 100644 --- a/manual/built-in-docs.org +++ b/manual/built-in-docs.org @@ -1,7 +1,7 @@ \hrule * === - - defined in :: =src/./built_ins.cpp:161:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:161:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -10,7 +10,7 @@ Takes 0 or more arguments and returns =t= if all arguments are equal and =()= ot \hrule * =>= - - defined in :: =src/./built_ins.cpp:177:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:177:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -19,7 +19,7 @@ TODO \hrule * =>== - - defined in :: =src/./built_ins.cpp:194:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:194:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -28,7 +28,7 @@ TODO \hrule * =<= - - defined in :: =src/./built_ins.cpp:211:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:211:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -37,7 +37,7 @@ TODO \hrule * =<== - - defined in :: =src/./built_ins.cpp:230:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:230:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -46,7 +46,7 @@ TODO \hrule * =+= - - defined in :: =src/./built_ins.cpp:247:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:247:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -55,7 +55,7 @@ TODO \hrule * =-= - - defined in :: =src/./built_ins.cpp:259:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:259:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -64,7 +64,7 @@ TODO \hrule * =*= - - defined in :: =src/./built_ins.cpp:281:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:281:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -73,7 +73,7 @@ TODO \hrule * =/= - - defined in :: =src/./built_ins.cpp:301:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:301:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -82,7 +82,7 @@ TODO \hrule * =**= - - defined in :: =src/./built_ins.cpp:321:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:321:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -91,7 +91,7 @@ TODO \hrule * =%= - - defined in :: =src/./built_ins.cpp:336:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:336:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -100,7 +100,7 @@ TODO \hrule * =assert= - - defined in :: =src/./built_ins.cpp:351:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:351:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -109,7 +109,7 @@ TODO \hrule * =define= - - defined in :: =src/./built_ins.cpp:362:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:362:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -118,7 +118,7 @@ TODO \hrule * =mutate= - - defined in :: =src/./built_ins.cpp:424:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:424:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -127,7 +127,7 @@ TODO \hrule * =vector-length= - - defined in :: =src/./built_ins.cpp:449:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:449:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -136,7 +136,7 @@ TODO \hrule * =vector-ref= - - defined in :: =src/./built_ins.cpp:457:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:457:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -145,7 +145,7 @@ TODO \hrule * =vector-set!= - - defined in :: =src/./built_ins.cpp:474:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:474:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -154,7 +154,7 @@ TODO \hrule * =set!= - - defined in :: =src/./built_ins.cpp:494:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:494:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -163,7 +163,7 @@ TODO \hrule * =set-car!= - - defined in :: =src/./built_ins.cpp:516:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:516:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -172,7 +172,7 @@ TODO \hrule * =set-cdr!= - - defined in :: =src/./built_ins.cpp:527:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:527:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -181,7 +181,7 @@ TODO \hrule * =if= - - defined in :: =src/./built_ins.cpp:538:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:538:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -190,7 +190,7 @@ TODO \hrule * =quote= - - defined in :: =src/./built_ins.cpp:558:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:558:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -199,7 +199,7 @@ TODO \hrule * =quasiquote= - - defined in :: =src/./built_ins.cpp:563:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:563:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -208,7 +208,7 @@ TODO \hrule * =and= - - defined in :: =src/./built_ins.cpp:659:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:660:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -217,7 +217,7 @@ TODO \hrule * =or= - - defined in :: =src/./built_ins.cpp:670:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:671:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -226,7 +226,7 @@ TODO \hrule * =not= - - defined in :: =src/./built_ins.cpp:681:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:682:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -235,7 +235,7 @@ TODO \hrule * =while= - - defined in :: =src/./built_ins.cpp:691:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:692:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -244,7 +244,7 @@ TODO \hrule * =lambda= - - defined in :: =src/./built_ins.cpp:769:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:770:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -253,7 +253,7 @@ TODO \hrule * =special-lambda= - - defined in :: =src/./built_ins.cpp:781:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:782:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -262,7 +262,7 @@ TODO \hrule * =eval= - - defined in :: =src/./built_ins.cpp:789:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:790:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -271,7 +271,7 @@ TODO \hrule * =begin= - - defined in :: =src/./built_ins.cpp:801:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:802:0= - type :: =:cfunction= - docu :: #+BEGIN: @@ -280,8 +280,215 @@ TODO \hrule * =list= - - defined in :: =src/./built_ins.cpp:817:0= + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:818:0= - type :: =:cfunction= - docu :: #+BEGIN: TODO + #+END: +\hrule +* =vector= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:822:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =pair= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:828:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =first= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:838:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =rest= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:849:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =set-type= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:860:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =delete-type= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:872:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =type= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:879:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =info= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:913:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =show= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:994:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =addr-of= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1006:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =generate-docs= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1012:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =print= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1021:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =read= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1029:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =exit= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1046:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =break= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1057:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =memstat= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1062:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =try= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1066:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =load= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1081:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =import= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1092:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =copy= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1103:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =error= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1111:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =symbol->keyword= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1118:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TODO + #+END: +\hrule +* =string->symbol= + + - defined in :: =d:\code\gitlab\slime\src\./built_ins.cpp:1127:0= + - type :: =:cfunction= + - docu :: + #+BEGIN: +TOD \ No newline at end of file diff --git a/src/built_ins.cpp b/src/built_ins.cpp index f26ad9d..61f222c 100644 --- a/src/built_ins.cpp +++ b/src/built_ins.cpp @@ -464,7 +464,7 @@ proc load_built_ins_into_environment() -> void { try assert_type(vec, Lisp_Object_Type::Vector); try assert_type(idx, Lisp_Object_Type::Number); - int int_idx = ((size_t)idx->value.number); + int int_idx = ((int)idx->value.number); try assert(int_idx >= 0); try assert(int_idx < vec->value.vector.length); @@ -482,7 +482,7 @@ proc load_built_ins_into_environment() -> void { try assert_type(vec, Lisp_Object_Type::Vector); try assert_type(idx, Lisp_Object_Type::Number); - int int_idx = ((size_t)idx->value.number); + int int_idx = ((int)idx->value.number); try assert(int_idx >= 0); try assert(int_idx < vec->value.vector.length); @@ -598,6 +598,7 @@ proc load_built_ins_into_environment() -> void { Lisp_Object* newPair = Memory::nil; Lisp_Object* newPairHead = newPair; Lisp_Object* head = expr; + while (Memory::get_type(head) == Lisp_Object_Type::Pair) { // if it is ,@ we have to actually do more work // and inline the result @@ -1150,25 +1151,18 @@ proc load_built_ins_into_environment() -> void { int resulting_string_len = 0; - Lisp_Object* head = evaluated_arguments; - - while (Memory::get_type(head) == Lisp_Object_Type::Pair) { - try assert_type(head->value.pair.first, Lisp_Object_Type::String); - - resulting_string_len += head->value.pair.first->value.string->length; - head = head->value.pair.rest; + for_lisp_list (evaluated_arguments) { + try assert_type(it, Lisp_Object_Type::String); + resulting_string_len += it->value.string->length; } - head = evaluated_arguments; - String* resulting_string = Memory::create_string("", resulting_string_len); int index_in_string = 0; - while (Memory::get_type(head) == Lisp_Object_Type::Pair) { + for_lisp_list (evaluated_arguments) { strcpy((&resulting_string->data)+index_in_string, - Memory::get_c_str(head->value.pair.first->value.string)); - index_in_string += head->value.pair.first->value.string->length; - head = head->value.pair.rest; + Memory::get_c_str(it->value.string)); + index_in_string += it->value.string->length; } return Memory::create_lisp_object_string(resulting_string); diff --git a/src/defines.cpp b/src/defines.cpp index 7331ad5..e0478d6 100644 --- a/src/defines.cpp +++ b/src/defines.cpp @@ -142,7 +142,43 @@ /* - Usage of the create_error_macros: + * iterate over array lists + */ +#define for_array_list(l) \ + if (!l); \ + else \ + if (int it_index = 0); \ + else \ + for (auto it = l->data[0]; \ + it_index < l->next_index; \ + it=l->data[++it_index]) + +/* + * iterate over lisp vectors + */ +#define for_lisp_vector(v) \ + if (!v); \ + else \ + if (int it_index = 0); \ + else \ + for (auto it = v->value.vector.data; \ + it_index < v->value.vector.length; \ + it=v->value.vector.data+(++it_index)) + +/* + * iterate over lisp lists + */ +#define for_lisp_list(l) \ + if (!l); \ + else \ + if (int it_index = 0); \ + else \ + for (Lisp_Object* head = l, *it; \ + Memory::get_type(head) == Lisp_Object_Type::Pair && (it = head->value.pair.first); \ + head = head->value.pair.rest, ++it_index) + +/** + Usage of the create_error_macros: */ #define __create_error(keyword, ...) \ create_error( \ diff --git a/src/eval.cpp b/src/eval.cpp index a79b13c..79441eb 100644 --- a/src/eval.cpp +++ b/src/eval.cpp @@ -349,6 +349,7 @@ proc list_length(Lisp_Object* node) -> int { assert_type(node, Lisp_Object_Type::Pair); int len = 0; + while (Memory::get_type(node) == Lisp_Object_Type::Pair) { ++len; node = node->value.pair.rest; @@ -360,15 +361,6 @@ proc list_length(Lisp_Object* node) -> int { return 0; } -proc extract_keyword_value(char* keyword, Parsed_Arguments* args) -> Lisp_Object* { - // NOTE(Felix): This will be a hashmap lookup later - for (int i = 0; i < args->keyword_keys->next_index; ++i) { - if (string_equal(args->keyword_keys->data[i]->value.symbol.identifier, keyword)) - return args->keyword_values->data[i]; - } - return nullptr; -} - proc eval_arguments(Lisp_Object* arguments, int *out_arguments_length) -> Lisp_Object* { int my_out_arguments_length = 0; if (arguments == Memory::nil) { diff --git a/src/ftb b/src/ftb index 5d6da78..63f8554 160000 --- a/src/ftb +++ b/src/ftb @@ -1 +1 @@ -Subproject commit 5d6da78c90968738bcbf247530b3a3d0f095888b +Subproject commit 63f8554200fc6edd821818f531ce76fd8d7aeef8 diff --git a/src/gc.cpp b/src/gc.cpp new file mode 100644 index 0000000..3ee603c --- /dev/null +++ b/src/gc.cpp @@ -0,0 +1,81 @@ +namespace GC { + proc maybe_mark(Environment* env) -> void; + + int current_mark; + + Lisp_Object_Array_List* marked_objects; + String_Array_List* marked_strings; + Environment_Array_List* marked_environments; + Environment_Array_List* protected_environments; + + proc marked(Lisp_Object* node) -> bool { + return false; + } + + proc marked(Environment* env) -> bool { + return false; + } + + proc maybe_mark(Lisp_Object* node) -> void { + if (marked(node)) + return; + + append_to_array_list(marked_objects, node); + + switch (Memory::get_type(node)) { + case Lisp_Object_Type::Pair: { + for_lisp_list (node) { + maybe_mark(it); + } + } break; + case Lisp_Object_Type::Vector: { + for_lisp_vector (node) { + maybe_mark(it); + } + } break; + case Lisp_Object_Type::String: { + append_to_array_list(marked_strings, node->value.string); + } break; + case Lisp_Object_Type::Function: { + maybe_mark(node->value.function.parent_environment); + maybe_mark(node->value.function.body); + } break; + } + + } + + proc maybe_mark(Environment* env) -> void { + if (marked(env)) + return; + + append_to_array_list(marked_environments, env); + + for_array_list (env->parents) { + maybe_mark(it); + } + + Lisp_Object* it = env->values[0]; + for (int i = 0; i < env->next_index; it = env->values[++i]) { + maybe_mark(it); + } + } + + proc garbage_collect() -> void { + profile_this; + ++current_mark; + + for_array_list (protected_environments) maybe_mark(it); + for_array_list (Globals::Current_Execution::envi_stack) maybe_mark(it); + + } + + proc gc_init_and_go() -> void { + current_mark = 0; + marked_objects = create_Lisp_Object_array_list(1024); + marked_environments = create_Environment_array_list(1024); + + while (1) { + garbage_collect(); + } + } +} diff --git a/src/main.cpp b/src/main.cpp index 21b00b5..bead382 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,7 +1,7 @@ #include "slime.h" int main(int argc, char* argv[]) { - if (argc > 1) { + if (argc > 1) { if (Slime::string_equal(argv[1], "--run-tests")) { return Slime::run_all_tests() ? 0 : 1; } diff --git a/src/profiler.cpp b/src/profiler.cpp index a1de033..e69de29 100644 --- a/src/profiler.cpp +++ b/src/profiler.cpp @@ -1,17 +0,0 @@ -// namespace Profiler { -// proc init() -> void { -// out_file = fopen("profiler.report", "w"); -// if (!out_file) -// create_generic_error("couldnt create prfiler file."); -// } -// proc exit() -> void { -// fclose(out_file); -// } - -// proc log_entry(const char* func, const char* file, int line) -> void { -// fprintf(out_file,"%d -> %s %s %d %ld\n", Globals::thread_type, func, file, line, clock()); -// } -// proc log_exit() -> void { -// fprintf(out_file, "%d <- %ld\n", Globals::thread_type, clock()); -// } -// } diff --git a/src/slime.h b/src/slime.h index 85ce1f1..d89dc98 100644 --- a/src/slime.h +++ b/src/slime.h @@ -24,7 +24,7 @@ #undef _CRT_SECURE_NO_DEPRECATE #undef _CRT_SECURE_NO_WARNINGS -#include "./ftb/macros.h" +#include "./ftb/macros.hpp" #include "./ftb/profiler.hpp" namespace Slime { @@ -34,6 +34,7 @@ namespace Slime { # include "./forward_decls.cpp" # include "./profiler.cpp" # include "./memory.cpp" +# include "./gc.cpp" # include "./lisp_object.cpp" # include "./error.cpp" # include "./io.cpp" diff --git a/src/structs.cpp b/src/structs.cpp index 7d9bba5..69977ab 100644 --- a/src/structs.cpp +++ b/src/structs.cpp @@ -36,7 +36,8 @@ typedef uint64_t u64; enum class Lisp_Object_Flags : u64 { // bits 1 to 5 (including) will be reserved for the type - aliveness = 1 << 5, + Already_Garbage_Collected = 1 << 5, + Under_Construction = 1 << 6, }; enum struct Function_Type { @@ -103,6 +104,15 @@ struct Keyword_Arguments { Lisp_Object_Array_List* values; }; +struct Arguments { + // NOTE(Felix): rest_argument will be nullptr if no rest argument + // is declared otherwise its a symbol + Lisp_Object* rest_argument; + Keyword_Arguments keyword_arguments; + Positional_Arguments positional_arguments; +}; + + struct Function { Function_Type type; Positional_Arguments* positional_arguments; @@ -135,17 +145,8 @@ struct Lisp_Object { } value; }; -struct Parsed_Arguments { - Lisp_Object_Array_List* positional_arguments; - // TODO(Felix): Really use hashmap (keyword[sting] -> - // value[Lisp_Object*]) here - Lisp_Object_Array_List* keyword_keys; - Lisp_Object_Array_List* keyword_values; -}; - struct Environment { Environment_Array_List* parents; - int capacity; int next_index; diff --git a/src/testing.cpp b/src/testing.cpp index 469ef1e..2e1e62b 100644 --- a/src/testing.cpp +++ b/src/testing.cpp @@ -516,6 +516,7 @@ proc test_built_in_type() -> testresult { // trying to set invalid user type char exp_string3[] = "(begin (set-type a \"wrong tpye\")(type a))"; expression = Parser::parse_single_expression(exp_string3); + assert_no_error(); ignore_logging { dont_break_on_errors {