From dd4b72e04621d86da92ac82568a0af8f8ef9d738 Mon Sep 17 00:00:00 2001 From: Kelsi Date: Wed, 25 Feb 2026 09:55:12 -0800 Subject: [PATCH] Avoid log argument evaluation when level is disabled --- include/core/logger.hpp | 43 +++++++++++++++++++++++++++++++++++------ 1 file changed, 37 insertions(+), 6 deletions(-) diff --git a/include/core/logger.hpp b/include/core/logger.hpp index 8e0d8f0a..a927abee 100644 --- a/include/core/logger.hpp +++ b/include/core/logger.hpp @@ -102,12 +102,43 @@ private: void ensureFile(); }; -// Convenience macros -#define LOG_DEBUG(...) wowee::core::Logger::getInstance().debug(__VA_ARGS__) -#define LOG_INFO(...) wowee::core::Logger::getInstance().info(__VA_ARGS__) -#define LOG_WARNING(...) wowee::core::Logger::getInstance().warning(__VA_ARGS__) -#define LOG_ERROR(...) wowee::core::Logger::getInstance().error(__VA_ARGS__) -#define LOG_FATAL(...) wowee::core::Logger::getInstance().fatal(__VA_ARGS__) +// Convenience macros. +// Guard calls at the macro site so variadic arguments are not evaluated +// when the corresponding level is disabled. +#define LOG_DEBUG(...) do { \ + auto& _wowee_logger = wowee::core::Logger::getInstance(); \ + if (_wowee_logger.shouldLog(wowee::core::LogLevel::DEBUG)) { \ + _wowee_logger.debug(__VA_ARGS__); \ + } \ +} while (0) + +#define LOG_INFO(...) do { \ + auto& _wowee_logger = wowee::core::Logger::getInstance(); \ + if (_wowee_logger.shouldLog(wowee::core::LogLevel::INFO)) { \ + _wowee_logger.info(__VA_ARGS__); \ + } \ +} while (0) + +#define LOG_WARNING(...) do { \ + auto& _wowee_logger = wowee::core::Logger::getInstance(); \ + if (_wowee_logger.shouldLog(wowee::core::LogLevel::WARNING)) { \ + _wowee_logger.warning(__VA_ARGS__); \ + } \ +} while (0) + +#define LOG_ERROR(...) do { \ + auto& _wowee_logger = wowee::core::Logger::getInstance(); \ + if (_wowee_logger.shouldLog(wowee::core::LogLevel::ERROR)) { \ + _wowee_logger.error(__VA_ARGS__); \ + } \ +} while (0) + +#define LOG_FATAL(...) do { \ + auto& _wowee_logger = wowee::core::Logger::getInstance(); \ + if (_wowee_logger.shouldLog(wowee::core::LogLevel::FATAL)) { \ + _wowee_logger.fatal(__VA_ARGS__); \ + } \ +} while (0) } // namespace core } // namespace wowee