Makes Http2FrameDecoder a direct member of Http2DecoderAdapter, to avoid an unnecessary pointer dereference.

Also removes the no-argument constructor of Http2FrameDecoder, which is only used in tests.

PiperOrigin-RevId: 435046211
diff --git a/http2/decoder/http2_frame_decoder.h b/http2/decoder/http2_frame_decoder.h
index 295a0b0..b758dc8 100644
--- a/http2/decoder/http2_frame_decoder.h
+++ b/http2/decoder/http2_frame_decoder.h
@@ -50,7 +50,6 @@
 class QUICHE_EXPORT_PRIVATE Http2FrameDecoder {
  public:
   explicit Http2FrameDecoder(Http2FrameDecoderListener* listener);
-  Http2FrameDecoder() : Http2FrameDecoder(nullptr) {}
 
   Http2FrameDecoder(const Http2FrameDecoder&) = delete;
   Http2FrameDecoder& operator=(const Http2FrameDecoder&) = delete;
@@ -127,7 +126,8 @@
   };
 
   friend class test::Http2FrameDecoderPeer;
-  friend std::ostream& operator<<(std::ostream& out, State v);
+  QUICHE_EXPORT_PRIVATE friend std::ostream& operator<<(std::ostream& out,
+                                                        State v);
 
   DecodeStatus StartDecodingPayload(DecodeBuffer* db);
   DecodeStatus ResumeDecodingPayload(DecodeBuffer* db);
diff --git a/http2/decoder/http2_frame_decoder_test.cc b/http2/decoder/http2_frame_decoder_test.cc
index b3fd723..c628821 100644
--- a/http2/decoder/http2_frame_decoder_test.cc
+++ b/http2/decoder/http2_frame_decoder_test.cc
@@ -34,13 +34,6 @@
 
 class Http2FrameDecoderTest : public RandomDecoderTest {
  protected:
-  void SetUp() override {
-    // On any one run of this suite, we'll always choose the same value for
-    // use_default_constructor_ because the random seed is the same for each
-    // test case, but across runs the random seed changes.
-    use_default_constructor_ = Random().OneIn(2);
-  }
-
   DecodeStatus StartDecoding(DecodeBuffer* db) override {
     HTTP2_DVLOG(2) << "StartDecoding, db->Remaining=" << db->Remaining();
     collector_.Reset();
@@ -91,16 +84,8 @@
   }
 
   void PrepareDecoder() {
-    // Alternate which constructor is used.
-    if (use_default_constructor_) {
-      decoder_ = std::make_unique<Http2FrameDecoder>();
-      decoder_->set_listener(&collector_);
-    } else {
-      decoder_ = std::make_unique<Http2FrameDecoder>(&collector_);
-    }
+    decoder_ = std::make_unique<Http2FrameDecoder>(&collector_);
     decoder_->set_maximum_payload_size(maximum_payload_size_);
-
-    use_default_constructor_ = !use_default_constructor_;
   }
 
   void ResetDecodeSpeedCounters() {
@@ -212,7 +197,6 @@
   uint32_t maximum_payload_size_ = Http2SettingsInfo::DefaultMaxFrameSize();
   FramePartsCollectorListener collector_;
   std::unique_ptr<Http2FrameDecoder> decoder_;
-  bool use_default_constructor_;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
diff --git a/spdy/core/http2_frame_decoder_adapter.cc b/spdy/core/http2_frame_decoder_adapter.cc
index e79234f..f9e0f40 100644
--- a/spdy/core/http2_frame_decoder_adapter.cc
+++ b/spdy/core/http2_frame_decoder_adapter.cc
@@ -242,24 +242,11 @@
   return "UNKNOWN_ERROR";
 }
 
-Http2DecoderAdapter::Http2DecoderAdapter() {
+Http2DecoderAdapter::Http2DecoderAdapter() : frame_decoder_(this) {
   QUICHE_DVLOG(1) << "Http2DecoderAdapter ctor";
 
-  set_spdy_state(SpdyState::SPDY_READY_FOR_FRAME);
-  spdy_framer_error_ = SpdyFramerError::SPDY_NO_ERROR;
-
-  decoded_frame_header_ = false;
-  has_frame_header_ = false;
-  on_headers_called_ = false;
-  on_hpack_fragment_called_ = false;
-  latched_probable_http_response_ = false;
-  has_expected_frame_type_ = false;
-
   CorruptFrameHeader(&frame_header_);
   CorruptFrameHeader(&hpack_first_frame_header_);
-
-  frame_decoder_ = std::make_unique<Http2FrameDecoder>(this);
-  hpack_decoder_ = nullptr;
 }
 
 Http2DecoderAdapter::~Http2DecoderAdapter() = default;
@@ -322,7 +309,7 @@
 
 void Http2DecoderAdapter::SetMaxFrameSize(size_t max_frame_size) {
   max_frame_size_ = max_frame_size;
-  frame_decoder_->set_maximum_payload_size(max_frame_size);
+  frame_decoder_.set_maximum_payload_size(max_frame_size);
 }
 
 // ===========================================================================
@@ -805,7 +792,7 @@
 size_t Http2DecoderAdapter::ProcessInputFrame(const char* data, size_t len) {
   QUICHE_DCHECK_NE(spdy_state_, SpdyState::SPDY_ERROR);
   DecodeBuffer db(data, len);
-  DecodeStatus status = frame_decoder_->DecodeFrame(&db);
+  DecodeStatus status = frame_decoder_.DecodeFrame(&db);
   if (spdy_state_ != SpdyState::SPDY_ERROR) {
     DetermineSpdyState(status);
   } else {
@@ -871,10 +858,11 @@
           // Push the Http2FrameDecoder out of state kDiscardPayload now
           // since doing so requires no input.
           DecodeBuffer tmp("", 0);
-          DecodeStatus status = frame_decoder_->DecodeFrame(&tmp);
-          if (status != DecodeStatus::kDecodeDone) {
+          DecodeStatus decode_status = frame_decoder_.DecodeFrame(&tmp);
+          if (decode_status != DecodeStatus::kDecodeDone) {
             QUICHE_BUG(spdy_bug_1_3)
-                << "Expected to be done decoding the frame, not " << status;
+                << "Expected to be done decoding the frame, not "
+                << decode_status;
             SetSpdyErrorAndNotify(SPDY_INTERNAL_FRAMER_ERROR, "");
           } else if (spdy_framer_error_ != SPDY_NO_ERROR) {
             QUICHE_BUG(spdy_bug_1_4)
@@ -915,7 +903,7 @@
     QUICHE_DCHECK_NE(error, SpdyFramerError::SPDY_NO_ERROR);
     spdy_framer_error_ = error;
     set_spdy_state(SpdyState::SPDY_ERROR);
-    frame_decoder_->set_listener(&no_op_listener_);
+    frame_decoder_.set_listener(&no_op_listener_);
     visitor()->OnError(error, detailed_error);
   }
 }
@@ -945,9 +933,9 @@
 
 size_t Http2DecoderAdapter::remaining_total_payload() const {
   QUICHE_DCHECK(has_frame_header_);
-  size_t remaining = frame_decoder_->remaining_payload();
+  size_t remaining = frame_decoder_.remaining_payload();
   if (IsPaddable(frame_type()) && frame_header_.IsPadded()) {
-    remaining += frame_decoder_->remaining_padding();
+    remaining += frame_decoder_.remaining_padding();
   }
   return remaining;
 }
@@ -959,13 +947,13 @@
 }
 bool Http2DecoderAdapter::IsSkippingPadding() {
   bool result = frame_header_.IsPadded() && opt_pad_length_ &&
-                frame_decoder_->remaining_payload() == 0 &&
-                frame_decoder_->remaining_padding() > 0;
+                frame_decoder_.remaining_payload() == 0 &&
+                frame_decoder_.remaining_padding() > 0;
   QUICHE_DVLOG(2) << "Http2DecoderAdapter::IsSkippingPadding: " << result;
   return result;
 }
 bool Http2DecoderAdapter::IsDiscardingPayload() {
-  bool result = decoded_frame_header_ && frame_decoder_->IsDiscardingPayload();
+  bool result = decoded_frame_header_ && frame_decoder_.IsDiscardingPayload();
   QUICHE_DVLOG(2) << "Http2DecoderAdapter::IsDiscardingPayload: " << result;
   return result;
 }
diff --git a/spdy/core/http2_frame_decoder_adapter.h b/spdy/core/http2_frame_decoder_adapter.h
index 3ed18f2..0c21972 100644
--- a/spdy/core/http2_frame_decoder_adapter.h
+++ b/spdy/core/http2_frame_decoder_adapter.h
@@ -290,22 +290,22 @@
 
   // The HPACK decoder to be used for this adapter. User is responsible for
   // clearing if the adapter is to be used for another connection.
-  std::unique_ptr<spdy::HpackDecoderAdapter> hpack_decoder_ = nullptr;
+  std::unique_ptr<spdy::HpackDecoderAdapter> hpack_decoder_;
 
   // The HTTP/2 frame decoder.
-  std::unique_ptr<Http2FrameDecoder> frame_decoder_;
+  Http2FrameDecoder frame_decoder_;
 
   // Next frame type expected. Currently only used for CONTINUATION frames,
   // but could be used for detecting whether the first frame is a SETTINGS
   // frame.
-  // TODO(jamessyng): Provide means to indicate that decoder should require
+  // TODO(jamessynge): Provide means to indicate that decoder should require
   // SETTINGS frame as the first frame.
   Http2FrameType expected_frame_type_;
 
   // Attempt to duplicate the SpdyState and SpdyFramerError values that
   // SpdyFramer sets. Values determined by getting tests to pass.
-  SpdyState spdy_state_;
-  SpdyFramerError spdy_framer_error_;
+  SpdyState spdy_state_ = SpdyState::SPDY_READY_FOR_FRAME;
+  SpdyFramerError spdy_framer_error_ = SpdyFramerError::SPDY_NO_ERROR;
 
   // The limit on the size of received HTTP/2 payloads as specified in the
   // SETTINGS_MAX_FRAME_SIZE advertised to peer.
@@ -326,14 +326,14 @@
 
   // Has OnHeaders() already been called for current HEADERS block? Only
   // meaningful between OnHeadersStart and OnHeadersPriority.
-  bool on_headers_called_;
+  bool on_headers_called_ = false;
 
   // Has OnHpackFragment() already been called for current HPACK block?
   // SpdyFramer will pass an empty buffer to the HPACK decoder if a HEADERS
   // or PUSH_PROMISE has no HPACK data in it (e.g. a HEADERS frame with only
   // padding). Detect that condition and replicate the behavior using this
   // field.
-  bool on_hpack_fragment_called_;
+  bool on_hpack_fragment_called_ = false;
 
   // Have we seen a frame header that appears to be an HTTP/1 response?
   bool latched_probable_http_response_ = false;