diff --git a/src/google/protobuf/message_lite.cc b/src/google/protobuf/message_lite.cc index fc0f56ac54..b920234e40 100644 --- a/src/google/protobuf/message_lite.cc +++ b/src/google/protobuf/message_lite.cc @@ -204,7 +204,14 @@ class ZeroCopyCodedInputStream : public io::ZeroCopyInputStream { bool aliasing_enabled() { return cis_->aliasing_enabled_; } bool ReadCord(absl::Cord* cord, int count) final { - return cis_->ReadCord(cord, count); + // Fast path: tail call into ReadCord reading new value. + if (PROTOBUF_PREDICT_TRUE(cord->empty())) { + return cis_->ReadCord(cord, count); + } + absl::Cord tmp; + bool res = cis_->ReadCord(&tmp, count); + cord->Append(std::move(tmp)); + return res; } private: io::CodedInputStream* cis_;