| Index: third_party/protobuf/src/google/protobuf/generated_message_util.h
|
| diff --git a/third_party/protobuf/src/google/protobuf/generated_message_util.h b/third_party/protobuf/src/google/protobuf/generated_message_util.h
|
| index 36f18da940b3831808941118c5156a2353d7a0bc..4b03222f922241c9f2717e189aba6088b3451cee 100644
|
| --- a/third_party/protobuf/src/google/protobuf/generated_message_util.h
|
| +++ b/third_party/protobuf/src/google/protobuf/generated_message_util.h
|
| @@ -41,8 +41,17 @@
|
| #include <assert.h>
|
| #include <string>
|
|
|
| -#include <google/protobuf/stubs/once.h>
|
| #include <google/protobuf/stubs/common.h>
|
| +#include <google/protobuf/stubs/once.h>
|
| +#include <google/protobuf/has_bits.h>
|
| +
|
| +#ifndef PROTOBUF_FINAL
|
| +#if __cplusplus >= 201103L
|
| +#define PROTOBUF_FINAL final
|
| +#else
|
| +#define PROTOBUF_FINAL
|
| +#endif
|
| +#endif // !PROTOBUF_FINAL
|
|
|
| namespace google {
|
|
|
| @@ -63,30 +72,69 @@ namespace internal {
|
| #undef DEPRECATED_PROTOBUF_FIELD
|
| #define PROTOBUF_DEPRECATED
|
|
|
| -#define PROTOBUF_DEPRECATED_ATTR
|
| +#define GOOGLE_PROTOBUF_DEPRECATED_ATTR
|
|
|
|
|
| // Constants for special floating point values.
|
| LIBPROTOBUF_EXPORT double Infinity();
|
| LIBPROTOBUF_EXPORT double NaN();
|
|
|
| +// This type is used to define a global variable, without it's constructor
|
| +// and destructor run on start and end of the program lifetime. This circumvents
|
| +// the initial construction order fiasco, while keeping the address of the
|
| +// empty string a compile time constant.
|
| +template <typename T>
|
| +class ExplicitlyConstructed {
|
| + public:
|
| + void DefaultConstruct() {
|
| + new (&union_) T();
|
| + init_ = true;
|
| + }
|
| +
|
| + bool IsInitialized() { return init_; }
|
| + void Shutdown() {
|
| + if (init_) {
|
| + init_ = false;
|
| + get_mutable()->~T();
|
| + }
|
| + }
|
| +
|
| +#if __cplusplus >= 201103L
|
| + constexpr
|
| +#endif
|
| + const T&
|
| + get() const {
|
| + return reinterpret_cast<const T&>(union_);
|
| + }
|
| + T* get_mutable() { return reinterpret_cast<T*>(&union_); }
|
| +
|
| + private:
|
| + // Prefer c++14 aligned_storage, but for compatibility this will do.
|
| + union AlignedUnion {
|
| + char space[sizeof(T)];
|
| + int64 align_to_int64;
|
| + void* align_to_ptr;
|
| + } union_;
|
| + bool init_; // false by linker
|
| +};
|
| +
|
| // TODO(jieluo): Change to template. We have tried to use template,
|
| // but it causes net/rpc/python:rpcutil_test fail (the empty string will
|
| // init twice). It may related to swig. Change to template after we
|
| // found the solution.
|
|
|
| -// Default empty string object. Don't use the pointer directly. Instead, call
|
| +// Default empty string object. Don't use this directly. Instead, call
|
| // GetEmptyString() to get the reference.
|
| -LIBPROTOBUF_EXPORT extern const ::std::string* empty_string_;
|
| +LIBPROTOBUF_EXPORT extern ExplicitlyConstructed< ::std::string> fixed_address_empty_string;
|
| LIBPROTOBUF_EXPORT extern ProtobufOnceType empty_string_once_init_;
|
| LIBPROTOBUF_EXPORT void InitEmptyString();
|
|
|
|
|
| LIBPROTOBUF_EXPORT inline const ::std::string& GetEmptyStringAlreadyInited() {
|
| - assert(empty_string_ != NULL);
|
| - return *empty_string_;
|
| + return fixed_address_empty_string.get();
|
| }
|
|
|
| +
|
| LIBPROTOBUF_EXPORT const ::std::string& GetEmptyString();
|
|
|
| LIBPROTOBUF_EXPORT int StringSpaceUsedExcludingSelf(const string& str);
|
| @@ -104,14 +152,25 @@ template <class Type> bool AllAreInitialized(const Type& t) {
|
| return true;
|
| }
|
|
|
| -class ArenaString;
|
| +LIBPROTOBUF_EXPORT void InitProtobufDefaults();
|
|
|
| -// Read a length (varint32), followed by a string, from *input. Return a
|
| -// pointer to a copy of the string that resides in *arena. Requires both
|
| -// args to be non-NULL. If something goes wrong while reading the data
|
| -// then NULL is returned (e.g., input does not start with a valid varint).
|
| -ArenaString* ReadArenaString(::google::protobuf::io::CodedInputStream* input,
|
| - ::google::protobuf::Arena* arena);
|
| +// We compute sizes as size_t but cache them as int. This function converts a
|
| +// computed size to a cached size. Since we don't proceed with serialization if
|
| +// the total size was > INT_MAX, it is not important what this function returns
|
| +// for inputs > INT_MAX.
|
| +inline int ToCachedSize(size_t size) {
|
| + return static_cast<int>(size);
|
| +}
|
| +
|
| +// We mainly calculate sizes in terms of size_t, but some functions that compute
|
| +// sizes return "int". These int sizes are expected to always be positive.
|
| +// This function is more efficient than casting an int to size_t directly on
|
| +// 64-bit platforms because it avoids making the compiler emit a sign extending
|
| +// instruction, which we don't want and don't want to pay for.
|
| +inline size_t FromIntSize(int size) {
|
| + // Convert to unsigned before widening so sign extension is not necessary.
|
| + return static_cast<unsigned int>(size);
|
| +}
|
|
|
| } // namespace internal
|
| } // namespace protobuf
|
|
|