| 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 { | 
|  |