Index: third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc |
diff --git a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc |
index 332c0264fc9d0547ba1b351c1b2cd2929264f456..ca7bae026304997aabe38954fc8579c5ab1ebf22 100644 |
--- a/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc |
+++ b/third_party/protobuf/src/google/protobuf/compiler/cpp/cpp_message_field.cc |
@@ -161,8 +161,7 @@ void MessageFieldGenerator::GenerateNonInlineAccessorDefinitions( |
" if ($name$_ == NULL) {\n" |
" return NULL;\n" |
" } else {\n" |
- " $type$* temp = new $type$;\n" |
- " temp->MergeFrom(*$name$_);\n" |
+ " $type$* temp = new $type$(*$name$_);\n" |
" $name$_ = NULL;\n" |
" return temp;\n" |
" }\n" |
@@ -346,23 +345,29 @@ GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { |
void MessageFieldGenerator:: |
GenerateInlineAccessorDefinitions(io::Printer* printer, |
bool is_inline) const { |
+ if (dependent_field_) { |
+ // for dependent fields we cannot access its internal_default_instance, |
+ // because the type is incomplete. |
+ // TODO(gerbens) deprecate dependent base class. |
+ map<string, string> variables(variables_); |
+ variables["inline"] = is_inline ? "inline " : ""; |
+ printer->Print(variables, |
+ "$inline$const $type$& $classname$::$name$() const {\n" |
+ " // @@protoc_insertion_point(field_get:$full_name$)\n" |
+ " return $name$_ != NULL ? *$name$_\n" |
+ " : *internal_default_instance()->$name$_;\n" |
+ "}\n"); |
+ return; |
+ } |
+ |
map<string, string> variables(variables_); |
variables["inline"] = is_inline ? "inline " : ""; |
printer->Print(variables, |
"$inline$const $type$& $classname$::$name$() const {\n" |
- " // @@protoc_insertion_point(field_get:$full_name$)\n"); |
- |
- PrintHandlingOptionalStaticInitializers( |
- variables, descriptor_->file(), options_, printer, |
- // With static initializers. |
- " return $name$_ != NULL ? *$name$_ : *default_instance_->$name$_;\n", |
- // Without. |
- " return $name$_ != NULL ? *$name$_ : *default_instance().$name$_;\n"); |
- printer->Print(variables, "}\n"); |
- |
- if (dependent_field_) { |
- return; |
- } |
+ " // @@protoc_insertion_point(field_get:$full_name$)\n" |
+ " return $name$_ != NULL ? *$name$_\n" |
+ " : *$type$::internal_default_instance();\n" |
+ "}\n"); |
if (SupportsArenas(descriptor_)) { |
printer->Print(variables, |
@@ -520,8 +525,8 @@ void MessageFieldGenerator:: |
GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { |
printer->Print(variables_, |
"target = ::google::protobuf::internal::WireFormatLite::\n" |
- " Write$declared_type$NoVirtualToArray(\n" |
- " $number$, *$non_null_ptr_to_name$, target);\n"); |
+ " InternalWrite$declared_type$NoVirtualToArray(\n" |
+ " $number$, *$non_null_ptr_to_name$, false, target);\n"); |
} |
void MessageFieldGenerator:: |
@@ -663,8 +668,8 @@ InternalGenerateInlineAccessorDefinitions(const map<string, string>& variables, |
" if ($this_message$GetArenaNoVirtual() != NULL) {\n" |
// N.B.: safe to use the underlying field pointer here because we are sure |
// that it is non-NULL (because has_$name$() returned true). |
- " $dependent_typename$* temp = new $dependent_typename$;\n" |
- " temp->MergeFrom(*$field_member$);\n" |
+ " $dependent_typename$* temp = " |
+ "new $dependent_typename$(*$field_member$);\n" |
" $field_member$ = NULL;\n" |
" return temp;\n" |
" } else {\n" |
@@ -1033,20 +1038,26 @@ GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { |
printer->Print(variables_, |
"for (unsigned int i = 0, n = this->$name$_size(); i < n; i++) {\n" |
" target = ::google::protobuf::internal::WireFormatLite::\n" |
- " Write$declared_type$NoVirtualToArray(\n" |
- " $number$, this->$name$(i), target);\n" |
+ " InternalWrite$declared_type$NoVirtualToArray(\n" |
+ " $number$, this->$name$(i), false, target);\n" |
"}\n"); |
} |
void RepeatedMessageFieldGenerator:: |
GenerateByteSize(io::Printer* printer) const { |
printer->Print(variables_, |
- "total_size += $tag_size$ * this->$name$_size();\n" |
- "for (int i = 0; i < this->$name$_size(); i++) {\n" |
+ "{\n" |
+ " unsigned int count = this->$name$_size();\n"); |
+ printer->Indent(); |
+ printer->Print(variables_, |
+ "total_size += $tag_size$UL * count;\n" |
+ "for (unsigned int i = 0; i < count; i++) {\n" |
" total_size +=\n" |
" ::google::protobuf::internal::WireFormatLite::$declared_type$SizeNoVirtual(\n" |
" this->$name$(i));\n" |
"}\n"); |
+ printer->Outdent(); |
+ printer->Print("}\n"); |
} |
} // namespace cpp |