mirror of
https://github.com/usatiuk/psil.git
synced 2025-10-28 10:47:49 +01:00
pretty up logger/options
This commit is contained in:
@@ -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)
|
||||
|
||||
|
||||
@@ -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)
|
||||
6
src/support/CMakeLists.txt
Normal file
6
src/support/CMakeLists.txt
Normal 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)
|
||||
@@ -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<std::string, int> _levels;
|
||||
static inline std::unordered_map<int, std::string> _level_names{
|
||||
{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::reference_wrapper<std::ostream> _out = std::cout;
|
||||
std::reference_wrapper<std::ostream> _out_err = std::cerr;
|
||||
@@ -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<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;
|
||||
static Options &get();
|
||||
};
|
||||
|
||||
|
||||
@@ -7,13 +7,16 @@
|
||||
#include <iomanip>
|
||||
#include <sstream>
|
||||
|
||||
#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<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 (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_out(std::ostream &out) { get()._out = out; }
|
||||
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 = {}; }
|
||||
@@ -2,8 +2,8 @@ set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||
|
||||
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)
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
#include "Options.h"
|
||||
|
||||
namespace Command {
|
||||
enum Command : CellValType {
|
||||
enum CommandE : CellValType {
|
||||
NIL = 1,
|
||||
LDC = 2,
|
||||
LD = 3,
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
|
||||
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 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") {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
Reference in New Issue
Block a user