diff --git a/AK/Format.h b/AK/Format.h index 44aa749964..2d0768e358 100644 --- a/AK/Format.h +++ b/AK/Format.h @@ -10,7 +10,6 @@ #include #include -#include #include #include #include @@ -270,14 +269,19 @@ private: class TypeErasedFormatParams { public: - ReadonlySpan parameters() const { return m_parameters; } + TypeErasedFormatParams(u32 size) + : m_size(size) + { + } + + ReadonlySpan parameters() const { return { m_parameters, m_size }; } - void set_parameters(ReadonlySpan parameters) { m_parameters = parameters; } size_t take_next_index() { return m_next_index++; } private: - ReadonlySpan m_parameters; - size_t m_next_index { 0 }; + u32 m_size { 0 }; + u32 m_next_index { 0 }; + TypeErasedParameter m_parameters[0]; }; template @@ -295,16 +299,16 @@ public: static_assert(sizeof...(Parameters) <= max_format_arguments); explicit VariadicFormatParams(Parameters const&... parameters) - : m_data({ TypeErasedParameter { ¶meters, TypeErasedParameter::get_type(), __format_value }... }) + : TypeErasedFormatParams(sizeof...(Parameters)) + , m_parameter_storage { TypeErasedParameter { ¶meters, TypeErasedParameter::get_type(), __format_value }... } { constexpr bool any_debug_formatters = (is_debug_only_formatter>() || ...); static_assert(!any_debug_formatters || allow_debug_formatters == AllowDebugOnlyFormatters::Yes, "You are attempting to use a debug-only formatter outside of a debug log! Maybe one of your format values is an ErrorOr?"); - this->set_parameters(m_data); } private: - Array m_data; + TypeErasedParameter m_parameter_storage[sizeof...(Parameters)]; }; // We use the same format for most types for consistency. This is taken directly from