pretty up logger/options

This commit is contained in:
2024-01-03 17:24:42 +01:00
parent ddf7eeed4e
commit 6d241b2daf
12 changed files with 33 additions and 22 deletions

View File

@@ -2,7 +2,7 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_subdirectory(vm) add_subdirectory(vm)
add_subdirectory(logger) add_subdirectory(support)
add_executable(psil main.cpp) add_executable(psil main.cpp)

View File

@@ -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)

View File

@@ -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)

View File

@@ -24,21 +24,19 @@ public:
// 3 - debug // 3 - debug
// 4 - trace // 4 - trace
static void set_level(const std::string &tag, int level); 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(std::ostream &out);
static void set_out_err(std::ostream &out_err); static void set_out_err(std::ostream &out_err);
static void reset(); static void reset();
private:
static Logger &get(); static Logger &get();
private:
std::unordered_map<std::string, int> _levels; std::unordered_map<std::string, int> _levels;
static inline std::unordered_map<int, std::string> _level_names{ static inline std::unordered_map<int, std::string> _level_names{
{ALWAYS, "ALWAYS"}, {ERROR, "ERROR"}, {INFO, "INFO"}, {DEBUG, "DEBUG"}, {TRACE, "TRACE"}, {ALWAYS, "ALWAYS"}, {ERROR, "ERROR"}, {INFO, "INFO"}, {DEBUG, "DEBUG"}, {TRACE, "TRACE"},
}; };
int _default_level = 1;
std::chrono::time_point<std::chrono::high_resolution_clock> _start_time = std::chrono::high_resolution_clock::now(); std::chrono::time_point<std::chrono::high_resolution_clock> _start_time = std::chrono::high_resolution_clock::now();
std::reference_wrapper<std::ostream> _out = std::cout; std::reference_wrapper<std::ostream> _out = std::cout;
std::reference_wrapper<std::ostream> _out_err = std::cerr; std::reference_wrapper<std::ostream> _out_err = std::cerr;

View File

@@ -17,13 +17,14 @@ public:
static void set_bool(const std::string &opt, bool val); static void set_bool(const std::string &opt, bool val);
static void set_int(const std::string &opt, size_t val); static void set_int(const std::string &opt, size_t val);
static void reset(); static void reset();
static Options &get();
private: private:
const static inline std::unordered_map<std::string, std::variant<size_t, bool>> _defaults{{"cell_limit", 50000U}, const static inline std::unordered_map<std::string, std::variant<size_t, bool>> _defaults{{"cell_limit", 50000U},
{"command_strs", false}}; {"command_strs", false},
{"default_log_level", 1U}};
std::unordered_map<std::string, std::variant<size_t, bool>> _current = _defaults; std::unordered_map<std::string, std::variant<size_t, bool>> _current = _defaults;
static Options &get();
}; };

View File

@@ -7,13 +7,16 @@
#include <iomanip> #include <iomanip>
#include <sstream> #include <sstream>
#include "Options.h"
Logger &Logger::get() { Logger &Logger::get() {
// Ensure proper destruction order for tests
Options::get();
static Logger logger; static Logger logger;
return logger; return logger;
} }
void Logger::log(const std::string &tag, const std::string &what, int level) { 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 (get()._levels.find(tag) != get()._levels.end()) en_level = get()._levels.at(tag);
if (en_level < level) return; 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<void(std::ostream &)> &fn, int level) { void Logger::log(const std::string &tag, const std::function<void(std::ostream &)> &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 (get()._levels.find(tag) != get()._levels.end()) en_level = get()._levels.at(tag);
if (en_level < level) return; if (en_level < level) return;
@@ -43,5 +46,4 @@ void Logger::log(const std::string &tag, const std::function<void(std::ostream &
void Logger::set_level(const std::string &tag, int level) { get()._levels[tag] = level; } void Logger::set_level(const std::string &tag, int level) { get()._levels[tag] = level; }
void Logger::set_out(std::ostream &out) { get()._out = out; } void Logger::set_out(std::ostream &out) { get()._out = out; }
void Logger::set_out_err(std::ostream &out_err) { get()._out_err = out_err; } void Logger::set_out_err(std::ostream &out_err) { get()._out_err = out_err; }
void Logger::set_default_level(int level) { get()._default_level = level; }
void Logger::reset() { get()._levels = {}; } void Logger::reset() { get()._levels = {}; }

View File

@@ -2,8 +2,8 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_library(vm src/VM.cpp src/Cell.cpp add_library(vm src/VM.cpp src/Cell.cpp
src/Parser.cpp src/MemoryContext.cpp src/Handle.cpp src/Compiler.cpp src/Options.cpp) src/Parser.cpp src/MemoryContext.cpp src/Handle.cpp src/Compiler.cpp)
target_link_libraries(vm PUBLIC logger) target_link_libraries(vm PUBLIC support)
target_include_directories(vm PUBLIC include) target_include_directories(vm PUBLIC include)

View File

@@ -12,7 +12,7 @@
#include "Options.h" #include "Options.h"
namespace Command { namespace Command {
enum Command : CellValType { enum CommandE : CellValType {
NIL = 1, NIL = 1,
LDC = 2, LDC = 2,
LD = 3, LD = 3,

View File

@@ -11,6 +11,9 @@
using namespace Command; using namespace Command;
static std::unordered_map<std::string_view, CommandE> builtins{{"+", ADD}};
Handle Compiler::compile(const Handle &src, Handle fake_env, const Handle &suffix) { Handle Compiler::compile(const Handle &src, Handle fake_env, const Handle &suffix) {
Handle out; Handle out;
@@ -56,9 +59,9 @@ Handle Compiler::compile(const Handle &src, Handle fake_env, const Handle &suffi
Handle car = expr.car(); Handle car = expr.car();
Handle cdr = expr.cdr(); Handle cdr = expr.cdr();
if (car.atom()) { if (car.atom()) {
if (car.strval() == "+") { if (builtins.find(car.strval()) != builtins.end()) {
out.splice(compileArgsRaw(cdr)); out.splice(compileArgsRaw(cdr));
out.append(make_cmd(ADD)); out.append(make_cmd(builtins.at(car.strval())));
} else if (car.strval() == "read") { } else if (car.strval() == "read") {
out.append(make_cmd(READ)); out.append(make_cmd(READ));
} else if (car.strval() == "lambda") { } else if (car.strval() == "lambda") {

View File

@@ -197,6 +197,9 @@ void MemoryContext::gc_thread_entry() {
} }
} }
MemoryContext &MemoryContext::get() { MemoryContext &MemoryContext::get() {
// Ensure proper destruction order for tests
Options::get();
Logger::get();
static MemoryContext mc; static MemoryContext mc;
return mc; return mc;
} }

View File

@@ -163,14 +163,18 @@ TEST(CompilerTest, GlobalDefineFnMulti) {
TEST(CompilerTest, GlobalDefineFnRec) { TEST(CompilerTest, GlobalDefineFnRec) {
std::stringstream ssin; std::stringstream ssin;
std::stringstream ssout; std::stringstream ssout;
Options::set_bool("command_strs", false);
Logger::set_level("MemoryContext", Logger::INFO);
{ {
VM vm(ssin, ssout); VM vm(ssin, ssout);
Parser parser; Parser parser;
parser.loadStr( 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.loadControl(parser.parseExpr());
vm.run(); vm.run();
} }
Options::set_bool("command_strs", true);
Logger::set_level("MemoryContext", Options::get_int("default_log_level"));
ssout.flush(); ssout.flush();
EXPECT_EQ(ssout.str(), "55"); EXPECT_EQ(ssout.str(), "6765");
} }