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