From 6d241b2daf0ac32b28f67316d0a1a5beffb466e4 Mon Sep 17 00:00:00 2001 From: Stepan Usatiuk Date: Wed, 3 Jan 2024 17:24:42 +0100 Subject: [PATCH] pretty up logger/options --- src/CMakeLists.txt | 2 +- src/logger/CMakeLists.txt | 6 ------ src/support/CMakeLists.txt | 6 ++++++ src/{logger => support}/include/Logger.h | 4 +--- src/{vm => support}/include/Options.h | 5 +++-- src/{logger => support}/src/Logger.cpp | 8 +++++--- src/{vm => support}/src/Options.cpp | 0 src/vm/CMakeLists.txt | 4 ++-- src/vm/include/Command.h | 2 +- src/vm/src/Compiler.cpp | 7 +++++-- src/vm/src/MemoryContext.cpp | 3 +++ test/vm/CompilerTest.cpp | 8 ++++++-- 12 files changed, 33 insertions(+), 22 deletions(-) delete mode 100644 src/logger/CMakeLists.txt create mode 100644 src/support/CMakeLists.txt rename src/{logger => support}/include/Logger.h (94%) rename src/{vm => support}/include/Options.h (81%) rename src/{logger => support}/src/Logger.cpp (87%) rename src/{vm => support}/src/Options.cpp (100%) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 2635a17..01d0553 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,7 +2,7 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_subdirectory(vm) -add_subdirectory(logger) +add_subdirectory(support) add_executable(psil main.cpp) diff --git a/src/logger/CMakeLists.txt b/src/logger/CMakeLists.txt deleted file mode 100644 index e62d350..0000000 --- a/src/logger/CMakeLists.txt +++ /dev/null @@ -1,6 +0,0 @@ -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_CXX_STANDARD_REQUIRED ON) - -add_library(logger src/Logger.cpp) - -target_include_directories(logger PUBLIC include) diff --git a/src/support/CMakeLists.txt b/src/support/CMakeLists.txt new file mode 100644 index 0000000..4fb07b8 --- /dev/null +++ b/src/support/CMakeLists.txt @@ -0,0 +1,6 @@ +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +add_library(support src/Logger.cpp src/Options.cpp) + +target_include_directories(support PUBLIC include) diff --git a/src/logger/include/Logger.h b/src/support/include/Logger.h similarity index 94% rename from src/logger/include/Logger.h rename to src/support/include/Logger.h index 7b46e78..79105ef 100644 --- a/src/logger/include/Logger.h +++ b/src/support/include/Logger.h @@ -24,21 +24,19 @@ public: // 3 - debug // 4 - trace static void set_level(const std::string &tag, int level); - static void set_default_level(int level); static void set_out(std::ostream &out); static void set_out_err(std::ostream &out_err); static void reset(); -private: static Logger &get(); +private: std::unordered_map _levels; static inline std::unordered_map _level_names{ {ALWAYS, "ALWAYS"}, {ERROR, "ERROR"}, {INFO, "INFO"}, {DEBUG, "DEBUG"}, {TRACE, "TRACE"}, }; - int _default_level = 1; std::chrono::time_point _start_time = std::chrono::high_resolution_clock::now(); std::reference_wrapper _out = std::cout; std::reference_wrapper _out_err = std::cerr; diff --git a/src/vm/include/Options.h b/src/support/include/Options.h similarity index 81% rename from src/vm/include/Options.h rename to src/support/include/Options.h index e431039..95e6a6c 100644 --- a/src/vm/include/Options.h +++ b/src/support/include/Options.h @@ -17,13 +17,14 @@ public: static void set_bool(const std::string &opt, bool val); static void set_int(const std::string &opt, size_t val); static void reset(); + static Options &get(); private: const static inline std::unordered_map> _defaults{{"cell_limit", 50000U}, - {"command_strs", false}}; + {"command_strs", false}, + {"default_log_level", 1U}}; std::unordered_map> _current = _defaults; - static Options &get(); }; diff --git a/src/logger/src/Logger.cpp b/src/support/src/Logger.cpp similarity index 87% rename from src/logger/src/Logger.cpp rename to src/support/src/Logger.cpp index c38918b..d82eef6 100644 --- a/src/logger/src/Logger.cpp +++ b/src/support/src/Logger.cpp @@ -7,13 +7,16 @@ #include #include +#include "Options.h" Logger &Logger::get() { + // Ensure proper destruction order for tests + Options::get(); static Logger logger; return logger; } void Logger::log(const std::string &tag, const std::string &what, int level) { - int en_level = get()._default_level; + int en_level = Options::get_int("default_log_level"); if (get()._levels.find(tag) != get()._levels.end()) en_level = get()._levels.at(tag); if (en_level < level) return; @@ -30,7 +33,7 @@ void Logger::log(const std::string &tag, const std::string &what, int level) { } void Logger::log(const std::string &tag, const std::function &fn, int level) { - int en_level = get()._default_level; + int en_level = Options::get_int("default_log_level"); if (get()._levels.find(tag) != get()._levels.end()) en_level = get()._levels.at(tag); if (en_level < level) return; @@ -43,5 +46,4 @@ void Logger::log(const std::string &tag, const std::function builtins{{"+", ADD}}; + Handle Compiler::compile(const Handle &src, Handle fake_env, const Handle &suffix) { Handle out; @@ -56,9 +59,9 @@ Handle Compiler::compile(const Handle &src, Handle fake_env, const Handle &suffi Handle car = expr.car(); Handle cdr = expr.cdr(); if (car.atom()) { - if (car.strval() == "+") { + if (builtins.find(car.strval()) != builtins.end()) { out.splice(compileArgsRaw(cdr)); - out.append(make_cmd(ADD)); + out.append(make_cmd(builtins.at(car.strval()))); } else if (car.strval() == "read") { out.append(make_cmd(READ)); } else if (car.strval() == "lambda") { diff --git a/src/vm/src/MemoryContext.cpp b/src/vm/src/MemoryContext.cpp index 376ec8a..fe79c8d 100644 --- a/src/vm/src/MemoryContext.cpp +++ b/src/vm/src/MemoryContext.cpp @@ -197,6 +197,9 @@ void MemoryContext::gc_thread_entry() { } } MemoryContext &MemoryContext::get() { + // Ensure proper destruction order for tests + Options::get(); + Logger::get(); static MemoryContext mc; return mc; } diff --git a/test/vm/CompilerTest.cpp b/test/vm/CompilerTest.cpp index 6bc780c..ebd0cdc 100644 --- a/test/vm/CompilerTest.cpp +++ b/test/vm/CompilerTest.cpp @@ -163,14 +163,18 @@ TEST(CompilerTest, GlobalDefineFnMulti) { TEST(CompilerTest, GlobalDefineFnRec) { std::stringstream ssin; std::stringstream ssout; + Options::set_bool("command_strs", false); + Logger::set_level("MemoryContext", Logger::INFO); { VM vm(ssin, ssout); Parser parser; parser.loadStr( - "(LDC (define (fib n) (if n (if (+ n -1) (+ (fib (+ n -1)) (fib(+ n -2))) 1) 0) ) EVAL LDC (fib 10) EVAL PRINT STOP)"); + "(LDC (define (fib n) (if n (if (+ n -1) (+ (fib (+ n -1)) (fib(+ n -2))) 1) 0) ) EVAL LDC (fib 20) EVAL PRINT STOP)"); vm.loadControl(parser.parseExpr()); vm.run(); } + Options::set_bool("command_strs", true); + Logger::set_level("MemoryContext", Options::get_int("default_log_level")); ssout.flush(); - EXPECT_EQ(ssout.str(), "55"); + EXPECT_EQ(ssout.str(), "6765"); } \ No newline at end of file