diff --git a/rpcs3/util/logs.cpp b/rpcs3/util/logs.cpp index 15acd43682..98427267ff 100644 --- a/rpcs3/util/logs.cpp +++ b/rpcs3/util/logs.cpp @@ -309,8 +309,10 @@ void logs::message::broadcast(const char* fmt, const fmt_type_info* sup, ...) co thread_local std::string text; thread_local std::vector args; + static constexpr fmt_type_info empty_sup{}; + std::size_t args_count = 0; - for (auto v = sup; v->fmt_string; v++) + for (auto v = sup; v && v->fmt_string; v++) args_count++; text.clear(); @@ -321,7 +323,7 @@ void logs::message::broadcast(const char* fmt, const fmt_type_info* sup, ...) co for (u64& arg : args) arg = va_arg(c_args, u64); va_end(c_args); - fmt::raw_append(text, fmt, sup, args.data()); + fmt::raw_append(text, fmt, sup ? sup : &empty_sup, args.data()); std::string prefix = g_tls_log_prefix(); // Get first (main) listener diff --git a/rpcs3/util/logs.hpp b/rpcs3/util/logs.hpp index aad8f393da..45c41ea6ea 100644 --- a/rpcs3/util/logs.hpp +++ b/rpcs3/util/logs.hpp @@ -84,35 +84,25 @@ namespace logs { } - private: -#if __cpp_char8_t >= 201811 - using char2 = char8_t; -#else - using char2 = unsigned char; -#endif - #define GEN_LOG_METHOD(_sev)\ const message msg_##_sev{this, level::_sev};\ - template \ - void _sev(const char(&fmt)[N], const Args&... args)\ + template \ + void _sev(const CharT(&fmt)[N], const Args&... args)\ {\ if (level::_sev <= enabled.load(std::memory_order_relaxed)) [[unlikely]]\ {\ - static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make>()...};\ - msg_##_sev.broadcast(fmt, type_list, u64{fmt_unveil::get(args)}...);\ - }\ - }\ - template \ - void _sev(const char2(&fmt)[N], const Args&... args)\ - {\ - if (level::_sev <= enabled.load(std::memory_order_relaxed)) [[unlikely]]\ - {\ - static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make>()...};\ - msg_##_sev.broadcast(reinterpret_cast(+fmt), type_list, u64{fmt_unveil::get(args)}...);\ + if constexpr (sizeof...(Args) > 0)\ + {\ + static constexpr fmt_type_info type_list[sizeof...(Args) + 1]{fmt_type_info::make>()...};\ + msg_##_sev.broadcast(reinterpret_cast(fmt), type_list, u64{fmt_unveil::get(args)}...);\ + }\ + else\ + {\ + msg_##_sev.broadcast(reinterpret_cast(fmt), nullptr);\ + }\ }\ }\ - public: GEN_LOG_METHOD(fatal) GEN_LOG_METHOD(error) GEN_LOG_METHOD(todo)