diff --git a/esphome/core/base_automation.h b/esphome/core/base_automation.h index f0b3898278..b809c56f1a 100644 --- a/esphome/core/base_automation.h +++ b/esphome/core/base_automation.h @@ -217,6 +217,13 @@ template class LambdaAction : public Action { public: explicit LambdaAction(std::function &&f) : f_(std::move(f)) {} + // Override play_complex to call play() non-virtually (qualified call), + // eliminating one virtual dispatch frame from the call stack. + void play_complex(const Ts &...x) override { + this->num_running_++; + LambdaAction::play(x...); + this->play_next_(x...); + } void play(const Ts &...x) override { this->f_(x...); } protected: @@ -250,6 +257,13 @@ template class ContinuationAction : public Action { public: explicit ContinuationAction(Action *parent) : parent_(parent) {} + // Override play_complex to call play() non-virtually (qualified call), + // eliminating one virtual dispatch frame from the call stack. + void play_complex(const Ts &...x) override { + this->num_running_++; + ContinuationAction::play(x...); + this->play_next_(x...); + } void play(const Ts &...x) override { this->parent_->play_next_(x...); } protected: