mirror of
https://github.com/usatiuk/psil.git
synced 2025-10-28 18:57:48 +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)
|
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)
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
// 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;
|
||||||
@@ -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();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -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 = {}; }
|
||||||
@@ -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)
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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") {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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");
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user