| Index: third_party/protobuf/src/google/protobuf/io/coded_stream.h
|
| diff --git a/third_party/protobuf/src/google/protobuf/io/coded_stream.h b/third_party/protobuf/src/google/protobuf/io/coded_stream.h
|
| index c81a33ac6b25c459819fa4c48a0b885675e194cf..1402cc170de6b789691d13968ae396fa592527b3 100644
|
| --- a/third_party/protobuf/src/google/protobuf/io/coded_stream.h
|
| +++ b/third_party/protobuf/src/google/protobuf/io/coded_stream.h
|
| @@ -237,6 +237,17 @@ class LIBPROTOBUF_EXPORT CodedInputStream {
|
| // Read an unsigned integer with Varint encoding.
|
| bool ReadVarint64(uint64* value);
|
|
|
| + // Reads a varint off the wire into an "int". This should be used for reading
|
| + // sizes off the wire (sizes of strings, submessages, bytes fields, etc).
|
| + //
|
| + // The value from the wire is interpreted as unsigned. If its value exceeds
|
| + // the representable value of an integer on this platform, instead of
|
| + // truncating we return false. Truncating (as performed by ReadVarint32()
|
| + // above) is an acceptable approach for fields representing an integer, but
|
| + // when we are parsing a size from the wire, truncating the value would result
|
| + // in us misparsing the payload.
|
| + bool ReadVarintSizeAsInt(int* value);
|
| +
|
| // Read a tag. This calls ReadVarint32() and returns the result, or returns
|
| // zero (which is not a valid tag) if ReadVarint32() fails. Also, it updates
|
| // the last tag value, which can be checked with LastTagWas().
|
| @@ -594,9 +605,11 @@ class LIBPROTOBUF_EXPORT CodedInputStream {
|
| // if it fails and the uint32 it read otherwise. The latter has a bool
|
| // indicating success or failure as part of its return type.
|
| int64 ReadVarint32Fallback(uint32 first_byte_or_zero);
|
| + int ReadVarintSizeAsIntFallback();
|
| std::pair<uint64, bool> ReadVarint64Fallback();
|
| bool ReadVarint32Slow(uint32* value);
|
| bool ReadVarint64Slow(uint64* value);
|
| + int ReadVarintSizeAsIntSlow();
|
| bool ReadLittleEndian32Fallback(uint32* value);
|
| bool ReadLittleEndian64Fallback(uint64* value);
|
| // Fallback/slow methods for reading tags. These do not update last_tag_,
|
| @@ -771,17 +784,17 @@ class LIBPROTOBUF_EXPORT CodedOutputStream {
|
| uint8* target);
|
|
|
| // Returns the number of bytes needed to encode the given value as a varint.
|
| - static int VarintSize32(uint32 value);
|
| + static size_t VarintSize32(uint32 value);
|
| // Returns the number of bytes needed to encode the given value as a varint.
|
| - static int VarintSize64(uint64 value);
|
| + static size_t VarintSize64(uint64 value);
|
|
|
| // If negative, 10 bytes. Otheriwse, same as VarintSize32().
|
| - static int VarintSize32SignExtended(int32 value);
|
| + static size_t VarintSize32SignExtended(int32 value);
|
|
|
| // Compile-time equivalent of VarintSize32().
|
| template <uint32 Value>
|
| struct StaticVarintSize32 {
|
| - static const int value =
|
| + static const size_t value =
|
| (Value < (1 << 7))
|
| ? 1
|
| : (Value < (1 << 14))
|
| @@ -800,6 +813,44 @@ class LIBPROTOBUF_EXPORT CodedOutputStream {
|
| // created.
|
| bool HadError() const { return had_error_; }
|
|
|
| + // Deterministic serialization, if requested, guarantees that for a given
|
| + // binary, equal messages will always be serialized to the same bytes. This
|
| + // implies:
|
| + // . repeated serialization of a message will return the same bytes
|
| + // . different processes of the same binary (which may be executing on
|
| + // different machines) will serialize equal messages to the same bytes.
|
| + //
|
| + // Note the deterministic serialization is NOT canonical across languages; it
|
| + // is also unstable across different builds with schema changes due to unknown
|
| + // fields. Users who need canonical serialization, e.g., persistent storage in
|
| + // a canonical form, fingerprinting, etc., should define their own
|
| + // canonicalization specification and implement the serializer using
|
| + // reflection APIs rather than relying on this API.
|
| + //
|
| + // If determinisitc serialization is requested, the serializer will
|
| + // sort map entries by keys in lexicographical order or numerical order.
|
| + // (This is an implementation detail and may subject to change.)
|
| + //
|
| + // There are two ways to determine whether serialization should be
|
| + // deterministic for this CodedOutputStream. If SetSerializationDeterministic
|
| + // has not yet been called, then the default comes from the global default,
|
| + // which is false, until SetDefaultSerializationDeterministic has been called.
|
| + // Otherwise, SetSerializationDeterministic has been called, and the last
|
| + // value passed to it is all that matters.
|
| + void SetSerializationDeterministic(bool value) {
|
| + serialization_deterministic_is_overridden_ = true;
|
| + serialization_deterministic_override_ = value;
|
| + }
|
| + // See above. Also, note that users of this CodedOutputStream may need to
|
| + // call IsSerializationDeterminstic() to serialize in the intended way. This
|
| + // CodedOutputStream cannot enforce a desire for deterministic serialization
|
| + // by itself.
|
| + bool IsSerializationDeterminstic() const {
|
| + return serialization_deterministic_is_overridden_ ?
|
| + serialization_deterministic_override_ :
|
| + default_serialization_deterministic_;
|
| + }
|
| +
|
| private:
|
| GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(CodedOutputStream);
|
|
|
| @@ -809,6 +860,10 @@ class LIBPROTOBUF_EXPORT CodedOutputStream {
|
| int total_bytes_; // Sum of sizes of all buffers seen so far.
|
| bool had_error_; // Whether an error occurred during output.
|
| bool aliasing_enabled_; // See EnableAliasing().
|
| + // See SetSerializationDeterministic() regarding these three fields.
|
| + bool serialization_deterministic_is_overridden_;
|
| + bool serialization_deterministic_override_;
|
| + static bool default_serialization_deterministic_;
|
|
|
| // Advance the buffer by a given number of bytes.
|
| void Advance(int amount);
|
| @@ -835,7 +890,12 @@ class LIBPROTOBUF_EXPORT CodedOutputStream {
|
| GOOGLE_ATTRIBUTE_ALWAYS_INLINE static uint8* WriteVarint64ToArrayInline(
|
| uint64 value, uint8* target);
|
|
|
| - static int VarintSize32Fallback(uint32 value);
|
| + static size_t VarintSize32Fallback(uint32 value);
|
| +
|
| + // See above. Other projects may use "friend" to allow them to call this.
|
| + static void SetDefaultSerializationDeterministic() {
|
| + default_serialization_deterministic_ = true;
|
| + }
|
| };
|
|
|
| // inline methods ====================================================
|
| @@ -868,6 +928,19 @@ inline bool CodedInputStream::ReadVarint64(uint64* value) {
|
| return p.second;
|
| }
|
|
|
| +inline bool CodedInputStream::ReadVarintSizeAsInt(int* value) {
|
| + if (GOOGLE_PREDICT_TRUE(buffer_ < buffer_end_)) {
|
| + int v = *buffer_;
|
| + if (v < 0x80) {
|
| + *value = v;
|
| + Advance(1);
|
| + return true;
|
| + }
|
| + }
|
| + *value = ReadVarintSizeAsIntFallback();
|
| + return *value >= 0;
|
| +}
|
| +
|
| // static
|
| inline const uint8* CodedInputStream::ReadLittleEndian32FromArray(
|
| const uint8* buffer,
|
| @@ -1152,7 +1225,7 @@ inline uint8* CodedOutputStream::WriteTagToArray(
|
| return WriteVarint32ToArray(value, target);
|
| }
|
|
|
| -inline int CodedOutputStream::VarintSize32(uint32 value) {
|
| +inline size_t CodedOutputStream::VarintSize32(uint32 value) {
|
| if (value < (1 << 7)) {
|
| return 1;
|
| } else {
|
| @@ -1160,7 +1233,7 @@ inline int CodedOutputStream::VarintSize32(uint32 value) {
|
| }
|
| }
|
|
|
| -inline int CodedOutputStream::VarintSize32SignExtended(int32 value) {
|
| +inline size_t CodedOutputStream::VarintSize32SignExtended(int32 value) {
|
| if (value < 0) {
|
| return 10; // TODO(kenton): Make this a symbolic constant.
|
| } else {
|
|
|