From a0286616f71f0b654f25b443bcc0ae4ba0723bc2 Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Mon, 13 Apr 2026 17:16:49 -1000 Subject: [PATCH] [light] Force-inline LightCall::set_flag_/clear_flag_ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both are trivial bit operations on a uint16_t (one or/and on flags_), but without ESPHOME_ALWAYS_INLINE each call costs a call0/call8 plus the return/register-window rotation — more work than the body itself. validate_() invokes these ~8 times and transform_parameters_() adds more, so runtime benchmarks should reflect the elimination of the call overhead. Note: a previous attempt at this (#15402) was closed based on flash size deltas alone. This reopens the question with CodSpeed in-loop to measure actual runtime impact. --- esphome/components/light/light_call.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/esphome/components/light/light_call.h b/esphome/components/light/light_call.h index 88d29bd3490..39953d0d204 100644 --- a/esphome/components/light/light_call.h +++ b/esphome/components/light/light_call.h @@ -222,7 +222,7 @@ class LightCall { inline bool get_save_() { return (this->flags_ & FLAG_SAVE) != 0; } // Helper to set flag - defaults to true for common case - void set_flag_(FieldFlags flag, bool value = true) { + void set_flag_(FieldFlags flag, bool value = true) ESPHOME_ALWAYS_INLINE { if (value) { this->flags_ |= flag; } else { @@ -231,7 +231,7 @@ class LightCall { } // Helper to clear flag - reduces code size for common case - void clear_flag_(FieldFlags flag) { this->flags_ &= ~flag; } + void clear_flag_(FieldFlags flag) ESPHOME_ALWAYS_INLINE { this->flags_ &= ~flag; } // Helper to log unsupported feature and clear flag - reduces code duplication void log_and_clear_unsupported_(FieldFlags flag, const LogString *feature, bool use_color_mode_log);