Index: third_party/protobuf/src/google/protobuf/message.cc |
diff --git a/third_party/protobuf/src/google/protobuf/message.cc b/third_party/protobuf/src/google/protobuf/message.cc |
index ab7efa990b143cc027fcc5acfc3c0f41624ec2b4..032748bdaa8b3e4674892de5840c5bcc6eca331c 100644 |
--- a/third_party/protobuf/src/google/protobuf/message.cc |
+++ b/third_party/protobuf/src/google/protobuf/message.cc |
@@ -1,6 +1,6 @@ |
// Protocol Buffers - Google's data interchange format |
// Copyright 2008 Google Inc. All rights reserved. |
-// http://code.google.com/p/protobuf/ |
+// https://developers.google.com/protocol-buffers/ |
// |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
@@ -32,23 +32,28 @@ |
// Based on original Protocol Buffers design by |
// Sanjay Ghemawat, Jeff Dean, and others. |
-#include <istream> |
+#include <iostream> |
#include <stack> |
#include <google/protobuf/stubs/hash.h> |
#include <google/protobuf/message.h> |
+#include <google/protobuf/stubs/logging.h> |
#include <google/protobuf/stubs/common.h> |
+#include <google/protobuf/stubs/mutex.h> |
#include <google/protobuf/stubs/once.h> |
+#include <google/protobuf/reflection_internal.h> |
#include <google/protobuf/io/coded_stream.h> |
#include <google/protobuf/io/zero_copy_stream_impl.h> |
#include <google/protobuf/descriptor.pb.h> |
+#include <google/protobuf/map_field.h> |
#include <google/protobuf/descriptor.h> |
#include <google/protobuf/generated_message_util.h> |
#include <google/protobuf/reflection_ops.h> |
#include <google/protobuf/wire_format.h> |
#include <google/protobuf/stubs/strutil.h> |
-#include <google/protobuf/stubs/map-util.h> |
+#include <google/protobuf/stubs/map_util.h> |
+#include <google/protobuf/stubs/singleton.h> |
#include <google/protobuf/stubs/stl_util.h> |
namespace google { |
@@ -75,7 +80,7 @@ void Message::CheckTypeAndMergeFrom(const MessageLite& other) { |
void Message::CopyFrom(const Message& from) { |
const Descriptor* descriptor = GetDescriptor(); |
GOOGLE_CHECK_EQ(from.GetDescriptor(), descriptor) |
- << ": Tried to copy from a message with a different type." |
+ << ": Tried to copy from a message with a different type. " |
"to: " << descriptor->full_name() << ", " |
"from:" << from.GetDescriptor()->full_name(); |
ReflectionOps::Copy(from, this); |
@@ -100,7 +105,7 @@ void Message::FindInitializationErrors(vector<string>* errors) const { |
string Message::InitializationErrorString() const { |
vector<string> errors; |
FindInitializationErrors(&errors); |
- return JoinStrings(errors, ", "); |
+ return Join(errors, ", "); |
} |
void Message::CheckInitialized() const { |
@@ -149,7 +154,7 @@ int Message::ByteSize() const { |
return size; |
} |
-void Message::SetCachedSize(int size) const { |
+void Message::SetCachedSize(int /* size */) const { |
GOOGLE_LOG(FATAL) << "Message class \"" << GetDescriptor()->full_name() |
<< "\" implements neither SetCachedSize() nor ByteSize(). " |
"Must implement one or the other."; |
@@ -222,6 +227,54 @@ void* Reflection::MutableRawRepeatedString( |
} |
+// Default EnumValue API implementations. Real reflection implementations should |
+// override these. However, there are several legacy implementations that do |
+// not, and cannot easily be changed at the same time as the Reflection API, so |
+// we provide these for now. |
+// TODO: Remove these once all Reflection implementations are updated. |
+int Reflection::GetEnumValue(const Message& message, |
+ const FieldDescriptor* field) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API."; |
+ return 0; |
+} |
+void Reflection::SetEnumValue(Message* message, |
+ const FieldDescriptor* field, |
+ int value) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API."; |
+} |
+int Reflection::GetRepeatedEnumValue( |
+ const Message& message, |
+ const FieldDescriptor* field, int index) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API."; |
+ return 0; |
+} |
+void Reflection::SetRepeatedEnumValue(Message* message, |
+ const FieldDescriptor* field, int index, |
+ int value) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API."; |
+} |
+void Reflection::AddEnumValue(Message* message, |
+ const FieldDescriptor* field, |
+ int value) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented EnumValue API."; |
+} |
+ |
+MapIterator Reflection::MapBegin( |
+ Message* message, |
+ const FieldDescriptor* field) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented Map Reflection API."; |
+ MapIterator iter(message, field); |
+ return iter; |
+} |
+ |
+MapIterator Reflection::MapEnd( |
+ Message* message, |
+ const FieldDescriptor* field) const { |
+ GOOGLE_LOG(FATAL) << "Unimplemented Map Reflection API."; |
+ MapIterator iter(message, field); |
+ return iter; |
+} |
+ |
// ============================================================================= |
// MessageFactory |
@@ -354,5 +407,111 @@ void MessageFactory::InternalRegisterGeneratedMessage( |
} |
+MessageFactory* Reflection::GetMessageFactory() const { |
+ GOOGLE_LOG(FATAL) << "Not implemented."; |
+ return NULL; |
+} |
+ |
+void* Reflection::RepeatedFieldData( |
+ Message* message, const FieldDescriptor* field, |
+ FieldDescriptor::CppType cpp_type, |
+ const Descriptor* message_type) const { |
+ GOOGLE_LOG(FATAL) << "Not implemented."; |
+ return NULL; |
+} |
+ |
+namespace internal { |
+RepeatedFieldAccessor::~RepeatedFieldAccessor() { |
+} |
+} // namespace internal |
+ |
+const internal::RepeatedFieldAccessor* Reflection::RepeatedFieldAccessor( |
+ const FieldDescriptor* field) const { |
+ GOOGLE_CHECK(field->is_repeated()); |
+ switch (field->cpp_type()) { |
+#define HANDLE_PRIMITIVE_TYPE(TYPE, type) \ |
+ case FieldDescriptor::CPPTYPE_ ## TYPE: \ |
+ return internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<type> >::get(); |
+ HANDLE_PRIMITIVE_TYPE(INT32, int32) |
+ HANDLE_PRIMITIVE_TYPE(UINT32, uint32) |
+ HANDLE_PRIMITIVE_TYPE(INT64, int64) |
+ HANDLE_PRIMITIVE_TYPE(UINT64, uint64) |
+ HANDLE_PRIMITIVE_TYPE(FLOAT, float) |
+ HANDLE_PRIMITIVE_TYPE(DOUBLE, double) |
+ HANDLE_PRIMITIVE_TYPE(BOOL, bool) |
+ HANDLE_PRIMITIVE_TYPE(ENUM, int32) |
+#undef HANDLE_PRIMITIVE_TYPE |
+ case FieldDescriptor::CPPTYPE_STRING: |
+ switch (field->options().ctype()) { |
+ default: |
+ case FieldOptions::STRING: |
+ return internal::Singleton<internal::RepeatedPtrFieldStringAccessor>::get(); |
+ } |
+ break; |
+ case FieldDescriptor::CPPTYPE_MESSAGE: |
+ if (field->is_map()) { |
+ return internal::Singleton<internal::MapFieldAccessor>::get(); |
+ } else { |
+ return internal::Singleton<internal::RepeatedPtrFieldMessageAccessor>::get(); |
+ } |
+ } |
+ GOOGLE_LOG(FATAL) << "Should not reach here."; |
+ return NULL; |
+} |
+ |
+namespace internal { |
+namespace { |
+void ShutdownRepeatedFieldAccessor() { |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<int32> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<uint32> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<int64> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<uint64> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<float> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<double> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedFieldPrimitiveAccessor<bool> >::ShutDown(); |
+ internal::Singleton<internal::RepeatedPtrFieldStringAccessor>::ShutDown(); |
+ internal::Singleton<internal::RepeatedPtrFieldMessageAccessor>::ShutDown(); |
+ internal::Singleton<internal::MapFieldAccessor>::ShutDown(); |
+} |
+ |
+struct ShutdownRepeatedFieldRegister { |
+ ShutdownRepeatedFieldRegister() { |
+ OnShutdown(&ShutdownRepeatedFieldAccessor); |
+ } |
+} shutdown_; |
+ |
+} // namespace |
+} // namespace internal |
+ |
+namespace internal { |
+template<> |
+#if defined(_MSC_VER) && (_MSC_VER >= 1900) |
+// Note: force noinline to workaround MSVC 2015 compiler bug, issue #240 |
+GOOGLE_ATTRIBUTE_NOINLINE |
+#endif |
+Message* GenericTypeHandler<Message>::NewFromPrototype( |
+ const Message* prototype, google::protobuf::Arena* arena) { |
+ return prototype->New(arena); |
+} |
+template<> |
+#if defined(_MSC_VER) && (_MSC_VER >= 1900) |
+// Note: force noinline to workaround MSVC 2015 compiler bug, issue #240 |
+GOOGLE_ATTRIBUTE_NOINLINE |
+#endif |
+google::protobuf::Arena* GenericTypeHandler<Message>::GetArena( |
+ Message* value) { |
+ return value->GetArena(); |
+} |
+template<> |
+#if defined(_MSC_VER) && (_MSC_VER >= 1900) |
+// Note: force noinline to workaround MSVC 2015 compiler bug, issue #240 |
+GOOGLE_ATTRIBUTE_NOINLINE |
+#endif |
+void* GenericTypeHandler<Message>::GetMaybeArenaPointer( |
+ Message* value) { |
+ return value->GetMaybeArenaPointer(); |
+} |
+} // namespace internal |
+ |
} // namespace protobuf |
} // namespace google |