Index: third_party/protobuf/src/google/protobuf/generated_message_reflection.cc |
=================================================================== |
--- third_party/protobuf/src/google/protobuf/generated_message_reflection.cc (revision 216642) |
+++ third_party/protobuf/src/google/protobuf/generated_message_reflection.cc (working copy) |
@@ -33,9 +33,9 @@ |
// Sanjay Ghemawat, Jeff Dean, and others. |
#include <algorithm> |
+#include <google/protobuf/descriptor.pb.h> |
#include <google/protobuf/generated_message_reflection.h> |
#include <google/protobuf/descriptor.h> |
-#include <google/protobuf/descriptor.pb.h> |
#include <google/protobuf/repeated_field.h> |
#include <google/protobuf/extension_set.h> |
#include <google/protobuf/generated_message_util.h> |
@@ -309,7 +309,7 @@ |
"descriptor."; |
GOOGLE_CHECK_EQ(message2->GetReflection(), this) |
<< "Second argument to Swap() (of type \"" |
- << message1->GetDescriptor()->full_name() |
+ << message2->GetDescriptor()->full_name() |
<< "\") is not compatible with this reflection object (which is for type \"" |
<< descriptor_->full_name() |
<< "\"). Note that the exact same class is required; not just the same " |
@@ -368,8 +368,11 @@ |
SWAP_VALUES(DOUBLE, double); |
SWAP_VALUES(BOOL , bool ); |
SWAP_VALUES(ENUM , int ); |
- SWAP_VALUES(MESSAGE, Message*); |
#undef SWAP_VALUES |
+ case FieldDescriptor::CPPTYPE_MESSAGE: |
+ std::swap(*MutableRaw<Message*>(message1, field), |
+ *MutableRaw<Message*>(message2, field)); |
+ break; |
case FieldDescriptor::CPPTYPE_STRING: |
switch (field->options().ctype()) { |
@@ -576,6 +579,20 @@ |
} |
} |
+Message* GeneratedMessageReflection::ReleaseLast( |
+ Message* message, |
+ const FieldDescriptor* field) const { |
+ USAGE_CHECK_ALL(ReleaseLast, REPEATED, MESSAGE); |
+ |
+ if (field->is_extension()) { |
+ return static_cast<Message*>( |
+ MutableExtensionSet(message)->ReleaseLast(field->number())); |
+ } else { |
+ return MutableRaw<RepeatedPtrFieldBase>(message, field) |
+ ->ReleaseLast<GenericTypeHandler<Message> >(); |
+ } |
+} |
+ |
void GeneratedMessageReflection::SwapElements( |
Message* message, |
const FieldDescriptor* field, |
@@ -877,7 +894,9 @@ |
} |
const EnumValueDescriptor* result = |
field->enum_type()->FindValueByNumber(value); |
- GOOGLE_CHECK(result != NULL); |
+ GOOGLE_CHECK(result != NULL) << "Value " << value << " is not valid for field " |
+ << field->full_name() << " of type " |
+ << field->enum_type()->full_name() << "."; |
return result; |
} |
@@ -907,7 +926,9 @@ |
} |
const EnumValueDescriptor* result = |
field->enum_type()->FindValueByNumber(value); |
- GOOGLE_CHECK(result != NULL); |
+ GOOGLE_CHECK(result != NULL) << "Value " << value << " is not valid for field " |
+ << field->full_name() << " of type " |
+ << field->enum_type()->full_name() << "."; |
return result; |
} |
@@ -948,13 +969,15 @@ |
MessageFactory* factory) const { |
USAGE_CHECK_ALL(GetMessage, SINGULAR, MESSAGE); |
+ if (factory == NULL) factory = message_factory_; |
+ |
if (field->is_extension()) { |
return static_cast<const Message&>( |
GetExtensionSet(message).GetMessage( |
- field->number(), field->message_type(), |
- factory == NULL ? message_factory_ : factory)); |
+ field->number(), field->message_type(), factory)); |
} else { |
- const Message* result = GetRaw<const Message*>(message, field); |
+ const Message* result; |
+ result = GetRaw<const Message*>(message, field); |
if (result == NULL) { |
result = DefaultRaw<const Message*>(field); |
} |
@@ -967,20 +990,43 @@ |
MessageFactory* factory) const { |
USAGE_CHECK_ALL(MutableMessage, SINGULAR, MESSAGE); |
+ if (factory == NULL) factory = message_factory_; |
+ |
if (field->is_extension()) { |
return static_cast<Message*>( |
- MutableExtensionSet(message)->MutableMessage(field, |
- factory == NULL ? message_factory_ : factory)); |
+ MutableExtensionSet(message)->MutableMessage(field, factory)); |
} else { |
- Message** result = MutableField<Message*>(message, field); |
- if (*result == NULL) { |
+ Message* result; |
+ Message** result_holder = MutableField<Message*>(message, field); |
+ if (*result_holder == NULL) { |
const Message* default_message = DefaultRaw<const Message*>(field); |
- *result = default_message->New(); |
+ *result_holder = default_message->New(); |
} |
- return *result; |
+ result = *result_holder; |
+ return result; |
} |
} |
+Message* GeneratedMessageReflection::ReleaseMessage( |
+ Message* message, |
+ const FieldDescriptor* field, |
+ MessageFactory* factory) const { |
+ USAGE_CHECK_ALL(ReleaseMessage, SINGULAR, MESSAGE); |
+ |
+ if (factory == NULL) factory = message_factory_; |
+ |
+ if (field->is_extension()) { |
+ return static_cast<Message*>( |
+ MutableExtensionSet(message)->ReleaseMessage(field, factory)); |
+ } else { |
+ ClearBit(message, field); |
+ Message** result = MutableRaw<Message*>(message, field); |
+ Message* ret = *result; |
+ *result = NULL; |
+ return ret; |
+ } |
+} |
+ |
const Message& GeneratedMessageReflection::GetRepeatedMessage( |
const Message& message, const FieldDescriptor* field, int index) const { |
USAGE_CHECK_ALL(GetRepeatedMessage, REPEATED, MESSAGE); |
@@ -1022,7 +1068,7 @@ |
// We can't use AddField<Message>() because RepeatedPtrFieldBase doesn't |
// know how to allocate one. |
RepeatedPtrFieldBase* repeated = |
- MutableRaw<RepeatedPtrFieldBase>(message, field); |
+ MutableRaw<RepeatedPtrFieldBase>(message, field); |
Message* result = repeated->AddFromCleared<GenericTypeHandler<Message> >(); |
if (result == NULL) { |
// We must allocate a new object. |
@@ -1039,8 +1085,27 @@ |
} |
} |
-// ------------------------------------------------------------------- |
+void* GeneratedMessageReflection::MutableRawRepeatedField( |
+ Message* message, const FieldDescriptor* field, |
+ FieldDescriptor::CppType cpptype, |
+ int ctype, const Descriptor* desc) const { |
+ USAGE_CHECK_REPEATED("MutableRawRepeatedField"); |
+ if (field->cpp_type() != cpptype) |
+ ReportReflectionUsageTypeError(descriptor_, |
+ field, "MutableRawRepeatedField", cpptype); |
+ if (ctype >= 0) |
+ GOOGLE_CHECK_EQ(field->options().ctype(), ctype) << "subtype mismatch"; |
+ if (desc != NULL) |
+ GOOGLE_CHECK_EQ(field->message_type(), desc) << "wrong submessage type"; |
+ if (field->is_extension()) |
+ return MutableExtensionSet(message)->MutableRawRepeatedField( |
+ field->number()); |
+ else |
+ return reinterpret_cast<uint8*>(message) + offsets_[field->index()]; |
+} |
+// ----------------------------------------------------------------------------- |
+ |
const FieldDescriptor* GeneratedMessageReflection::FindKnownExtensionByName( |
const string& name) const { |
if (extensions_offset_ == -1) return NULL; |