diff --git a/EScript/Compiler/Compiler.cpp b/EScript/Compiler/Compiler.cpp index 068e4ff..b7017bc 100644 --- a/EScript/Compiler/Compiler.cpp +++ b/EScript/Compiler/Compiler.cpp @@ -25,6 +25,7 @@ #include "AST/UserFunctionExpr.h" #include "AST/ValueExpr.h" #include "../Objects/Callables/UserFunction.h" +#include "../Utils/Logger.h" #include #include @@ -48,7 +49,7 @@ static bool _handlerInitialized UNUSED_ATTRIBUTE = initHandler(handlerRegistry); //! (ctor) -Compiler::Compiler(Logger * _logger) : logger(_logger ? _logger : new StdLogger(std::cout)) { +Compiler::Compiler(Logger & _logger) : logger(_logger) { } std::pair,_CountedRef> diff --git a/EScript/Compiler/Compiler.h b/EScript/Compiler/Compiler.h index 19017ef..bfa9de1 100644 --- a/EScript/Compiler/Compiler.h +++ b/EScript/Compiler/Compiler.h @@ -10,7 +10,6 @@ #define ES_COMPILER_H #include "../Utils/CodeFragment.h" -#include "../Utils/Logger.h" #include "../Utils/StringId.h" #include "../Utils/StringData.h" #include "../Instructions/Instruction.h" @@ -33,7 +32,7 @@ class ASTNode; class Compiler { public: - Compiler(Logger * _logger = nullptr); + Compiler(Logger & _logger); std::pair,_CountedRef> compile(const CodeFragment & code,const std::vector& injectedStaticVarNames); @@ -42,9 +41,9 @@ class Compiler { //! @name Logging // @{ public: - Logger * getLogger()const { return logger.get(); } + Logger & getLogger()const { return logger; } private: - _CountedRef logger; + Logger & logger; // @} // ------------- diff --git a/EScript/Compiler/Parser.cpp b/EScript/Compiler/Parser.cpp index 9408f88..cd30c76 100644 --- a/EScript/Compiler/Parser.cpp +++ b/EScript/Compiler/Parser.cpp @@ -25,6 +25,7 @@ #include "../Consts.h" #include "../Utils/IO/IO.h" +#include "../Utils/Logger.h" #include "../Objects/Callables/UserFunction.h" #include @@ -2150,8 +2151,8 @@ ASTNode::refArray_t readExpressionsInBrackets(ParsingContext & ctxt,int & cursor // --------------------------------- //! (ctor) -Parser::Parser(Logger * _logger) : - logger(_logger ? _logger : new StdLogger(std::cout)) { +Parser::Parser(Logger & _logger) : + logger(_logger) { //ctor } @@ -2163,7 +2164,7 @@ ERef Parser::parse(const CodeFragment & code) { tokenizer.defineToken("__DIR__",new TValueString(IO::dirname(code.getFilename()))); Tokenizer::tokenList_t tokens; - ParsingContext ctxt(tokens,code,*logger.get()); + ParsingContext ctxt(tokens,code,logger); ctxt.rootBlock = rootBlock.get(); /// 1. Tokenize diff --git a/EScript/Compiler/Parser.h b/EScript/Compiler/Parser.h index b47fcc3..1ec0de4 100644 --- a/EScript/Compiler/Parser.h +++ b/EScript/Compiler/Parser.h @@ -13,7 +13,6 @@ #include "Tokenizer.h" #include "../Utils/CodeFragment.h" -#include "../Utils/Logger.h" #include @@ -22,6 +21,7 @@ #endif namespace EScript { +class Logger; namespace AST{ class Block; } @@ -29,10 +29,10 @@ class Block; //! [Parser] class Parser { public: - Parser(Logger * logger = nullptr); + Parser(Logger & _logger); ERef parse(const CodeFragment & code); private: - _CountedRef logger; + Logger & logger; }; } diff --git a/EScript/Runtime/Runtime.cpp b/EScript/Runtime/Runtime.cpp index 08c4793..ff98d57 100644 --- a/EScript/Runtime/Runtime.cpp +++ b/EScript/Runtime/Runtime.cpp @@ -21,6 +21,7 @@ #include "../Utils/Logger.h" #include #include +#include #include #include @@ -135,12 +136,12 @@ Runtime::Runtime() : internals(new RuntimeInternals(*this, EScript::getSGlobals()->clone(), std::make_shared())), - logger(new LoggerGroup(Logger::LOG_WARNING)){ + logger(Logger::LOG_WARNING){ declareConstant(internals->getGlobals(),"GLOBALS",internals->getGlobals()); declareConstant(internals->getGlobals(),"SGLOBALS",EScript::getSGlobals()); - logger->addLogger("coutLogger",new StdLogger(std::cout)); + logger.addLogger("coutLogger", std::make_shared(std::cout)); //ctor } @@ -155,11 +156,7 @@ Runtime::Runtime(const Runtime& other) : } //! (dtor) -Runtime::~Runtime() { -// declareConstant(internals->getGlobals(), "GLOBALS",nullptr); //! \todo threading: Remove this and check the effect. - internals.reset(nullptr); - //dtor -} +Runtime::~Runtime() = default; ERef Runtime::_fork()const{ return new Runtime(*this); @@ -247,7 +244,7 @@ size_t Runtime::getStackSize()const { return internals->getStackSize(); } size_t Runtime::_getStackSizeLimit()const { return internals->_getStackSizeLimit(); } -void Runtime::info(const std::string & s) { logger->info(s); } +void Runtime::info(const std::string & s) { logger.info(s); } void Runtime::setAddStackInfoToExceptions(bool b) { internals->setAddStackInfoToExceptions(b); } @@ -261,7 +258,7 @@ void Runtime::_setStackSizeLimit(const size_t s) { internals->_setStackSizeLimit void Runtime::setTreatWarningsAsError(bool b){ if(b){ // --> disable coutLogger and add throwLogger - Logger * coutLogger = logger->getLogger("coutLogger"); + Logger * coutLogger = logger.getLogger("coutLogger"); if(coutLogger!=nullptr) coutLogger->setMinLevel(Logger::LOG_ERROR); @@ -272,12 +269,12 @@ void Runtime::setTreatWarningsAsError(bool b){ public: ThrowLogger(Runtime & _rt) : Logger(LOG_PEDANTIC_WARNING,LOG_WARNING), rt(_rt){} }; - logger->addLogger("throwLogger",new ThrowLogger(*this)); + logger.addLogger("throwLogger", std::make_shared(*this)); }else{ - Logger * coutLogger = logger->getLogger("coutLogger"); + Logger * coutLogger = logger.getLogger("coutLogger"); if(coutLogger!=nullptr) coutLogger->setMinLevel(Logger::LOG_ALL); - logger->removeLogger("throwLogger"); + logger.removeLogger("throwLogger"); } } void Runtime::throwException(const std::string & s,Object * obj){ internals->throwException(s,obj); } @@ -330,22 +327,22 @@ class CountingLogger : public Logger{ }; void Runtime::enableLogCounting(){ - if(logger->getLogger("countingLogger")==nullptr) - logger->addLogger("countingLogger",new CountingLogger); + if(logger.getLogger("countingLogger")==nullptr) + logger.addLogger("countingLogger", std::make_shared()); } void Runtime::disableLogCounting(){ - logger->removeLogger("countingLogger"); + logger.removeLogger("countingLogger"); } void Runtime::resetLogCounter(Logger::level_t level){ - CountingLogger * l = dynamic_cast(logger->getLogger("countingLogger")); + CountingLogger * l = dynamic_cast(logger.getLogger("countingLogger")); if(l!=nullptr) l->reset(level); } uint32_t Runtime::getLogCounter(Logger::level_t level)const{ - CountingLogger * l = dynamic_cast(logger->getLogger("countingLogger")); + auto l = dynamic_cast(logger.getLogger("countingLogger")); return l==nullptr ? 0 : l->get(level); } diff --git a/EScript/Runtime/Runtime.h b/EScript/Runtime/Runtime.h index fecddb2..a672491 100644 --- a/EScript/Runtime/Runtime.h +++ b/EScript/Runtime/Runtime.h @@ -122,20 +122,21 @@ class Runtime : public ExtObject { std::string getCurrentFile()const; int getCurrentLine()const; uint32_t getLogCounter(Logger::level_t level)const; - LoggerGroup * getLogger()const { return logger.get(); } - Logger::level_t getLoggingLevel() { return logger->getMinLevel(); } + LoggerGroup & getLogger() { return logger; } + const LoggerGroup & getLogger() const { return logger; } + Logger::level_t getLoggingLevel() { return logger.getMinLevel(); } std::string getStackInfo(); std::string getLocalStackInfo(); - void log(Logger::level_t l,const std::string & s) { logger->log(l,s); } + void log(Logger::level_t l,const std::string & s) { logger.log(l,s); } void resetLogCounter(Logger::level_t level); void setAddStackInfoToExceptions(bool b); - void setLoggingLevel(Logger::level_t level) { logger->setMinLevel(level); } + void setLoggingLevel(Logger::level_t level) { logger.setMinLevel(level); } void setTreatWarningsAsError(bool b); private: - _CountedRef logger; + LoggerGroup logger; // @} }; diff --git a/EScript/Runtime/RuntimeInternals.cpp b/EScript/Runtime/RuntimeInternals.cpp index 412ee6b..8e65ac6 100644 --- a/EScript/Runtime/RuntimeInternals.cpp +++ b/EScript/Runtime/RuntimeInternals.cpp @@ -1226,7 +1226,7 @@ void RuntimeInternals::warn(const std::string & s)const { if(getActiveFCC()){ os<<" ('" << getActiveFCC()->getUserFunction()->getCode().getFilename() << "':~"<warn(os.str()); + runtime.getLogger().warn(os.str()); } // ------------------------------------------------------------- diff --git a/EScript/Utils/Logger.cpp b/EScript/Utils/Logger.cpp index 0fb59a4..9e11481 100644 --- a/EScript/Utils/Logger.cpp +++ b/EScript/Utils/Logger.cpp @@ -7,8 +7,9 @@ // Licensed under the MIT License. See LICENSE file for details. // --------------------------------------------------------------------------------- #include "Logger.h" -#include #include +#include +#include namespace EScript{ @@ -16,9 +17,10 @@ namespace EScript{ // ------------------------------------------------ // LoggerGroup -void LoggerGroup::addLogger(const std::string & name,Logger * logger){ - if(logger==nullptr) +void LoggerGroup::addLogger(const std::string & name, const std::shared_ptr & logger){ + if (!logger) { throw std::invalid_argument("addLogger(nullptr)"); + } loggerRegistry[name] = logger; } @@ -35,6 +37,13 @@ Logger * LoggerGroup::getLogger(const std::string & name){ } return nullptr; } +const Logger * LoggerGroup::getLogger(const std::string & name) const{ + const auto lbIt = loggerRegistry.lower_bound(name); + if(lbIt!=loggerRegistry.cend() && !(loggerRegistry.key_comp()(name, lbIt->first)) ){ + return lbIt->second.get(); + } + return nullptr; +} //! ---|> Logger void LoggerGroup::doLog(level_t l,const std::string & msg){ diff --git a/EScript/Utils/Logger.h b/EScript/Utils/Logger.h index fe6037e..b2af5df 100644 --- a/EScript/Utils/Logger.h +++ b/EScript/Utils/Logger.h @@ -13,13 +13,14 @@ #include "ObjRef.h" #include -#include +#include #include +#include namespace EScript { //! [Logger] -class Logger : public EReferenceCounter { +class Logger { public: enum level_t{ LOG_ALL = 0, @@ -65,16 +66,17 @@ class Logger : public EReferenceCounter { class LoggerGroup : public Logger { public: LoggerGroup(level_t _minLevel = LOG_ALL,level_t _maxLevel = LOG_NONE) : Logger(_minLevel,_maxLevel){} - virtual ~LoggerGroup(){} + virtual ~LoggerGroup() = default; - void addLogger(const std::string & name,Logger * logger); + void addLogger(const std::string & name, const std::shared_ptr & logger); bool removeLogger(const std::string & name); void clearLoggers(); Logger * getLogger(const std::string & name); + const Logger * getLogger(const std::string & name) const; private: //! ---|> Logger void doLog(level_t l,const std::string & msg) override; - typedef std::map > loggerRegistry_t; + using loggerRegistry_t = std::map>; loggerRegistry_t loggerRegistry; };