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 914496577bbd02a1a4fa6f83992b4ef781dcaca4..332c0264fc9d0547ba1b351c1b2cd2929264f456 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 |
@@ -45,7 +45,7 @@ namespace cpp { |
namespace { |
void SetMessageVariables(const FieldDescriptor* descriptor, |
- std::map<string, string>* variables, |
+ map<string, string>* variables, |
const Options& options) { |
SetCommonFieldVariables(descriptor, variables, options); |
(*variables)["type"] = FieldMessageTypeName(descriptor); |
@@ -161,7 +161,8 @@ void MessageFieldGenerator::GenerateNonInlineAccessorDefinitions( |
" if ($name$_ == NULL) {\n" |
" return NULL;\n" |
" } else {\n" |
- " $type$* temp = new $type$(*$name$_);\n" |
+ " $type$* temp = new $type$;\n" |
+ " temp->MergeFrom(*$name$_);\n" |
" $name$_ = NULL;\n" |
" return temp;\n" |
" }\n" |
@@ -218,7 +219,7 @@ GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { |
return; |
} |
- std::map<string, string> variables(variables_); |
+ map<string, string> variables(variables_); |
// For the CRTP base class, all mutation methods are dependent, and so |
// they must be in the header. |
variables["dependent_classname"] = |
@@ -345,29 +346,23 @@ 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. |
- std::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; |
- } |
- |
- std::map<string, string> variables(variables_); |
+ 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" |
- " : *$type$::internal_default_instance();\n" |
- "}\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; |
+ } |
if (SupportsArenas(descriptor_)) { |
printer->Print(variables, |
@@ -469,7 +464,7 @@ GenerateInlineAccessorDefinitions(io::Printer* printer, |
void MessageFieldGenerator:: |
GenerateClearingCode(io::Printer* printer) const { |
- std::map<string, string> variables(variables_); |
+ map<string, string> variables(variables_); |
variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : ""; |
if (!HasFieldPresence(descriptor_->file())) { |
// If we don't have has-bits, message presence is indicated only by ptr != |
@@ -486,26 +481,6 @@ GenerateClearingCode(io::Printer* printer) const { |
} |
void MessageFieldGenerator:: |
-GenerateMessageClearingCode(io::Printer* printer) const { |
- std::map<string, string> variables(variables_); |
- variables["type"] = FieldMessageTypeName(descriptor_); |
- |
- if (!HasFieldPresence(descriptor_->file())) { |
- // If we don't have has-bits, message presence is indicated only by ptr != |
- // NULL. Thus on clear, we need to delete the object. |
- printer->Print(variables_, |
- "if (GetArenaNoVirtual() == NULL && $name$_ != NULL) {\n" |
- " delete $name$_;\n" |
- "}\n" |
- "$name$_ = NULL;\n"); |
- } else { |
- printer->Print(variables_, |
- "GOOGLE_DCHECK($name$_ != NULL);\n" |
- "$name$_->$type$::Clear();\n"); |
- } |
-} |
- |
-void MessageFieldGenerator:: |
GenerateMergingCode(io::Printer* printer) const { |
printer->Print(variables_, |
"mutable_$name$()->$type$::MergeFrom(from.$name$());\n"); |
@@ -517,51 +492,11 @@ GenerateSwappingCode(io::Printer* printer) const { |
} |
void MessageFieldGenerator:: |
-GenerateDestructorCode(io::Printer* printer) const { |
- // In google3 a default instance will never get deleted so we don't need to |
- // worry about that but in opensource protobuf default instances are deleted |
- // in shutdown process and we need to take special care when handling them. |
- printer->Print(variables_, |
- "if (this != internal_default_instance()) {\n" |
- " delete $name$_;\n" |
- "}\n"); |
-} |
- |
-void MessageFieldGenerator:: |
GenerateConstructorCode(io::Printer* printer) const { |
printer->Print(variables_, "$name$_ = NULL;\n"); |
} |
void MessageFieldGenerator:: |
-GenerateCopyConstructorCode(io::Printer* printer) const { |
- // For non-Arena enabled messages, everything always goes on the heap. |
- // |
- // For Arena enabled messages, the logic is a bit more convoluted. |
- // |
- // In the copy constructor, we call InternalMetadataWithArena::MergeFrom, |
- // which does *not* copy the Arena pointer. In the generated MergeFrom |
- // (see MessageFieldGenerator::GenerateMergingCode), we: |
- // -> copy the has bits (but this is done in bulk by a memcpy in the copy |
- // constructor) |
- // -> check whether the destination field pointer is NULL (it will be, since |
- // we're initializing it and would have called SharedCtor) and if so: |
- // -> call _slow_mutable_$name$(), which calls either |
- // ::google::protobuf::Arena::CreateMessage<>(GetArenaNoVirtual()), or |
- // ::google::protobuf::Arena::Create<>(GetArenaNoVirtual()) |
- // |
- // At this point, GetArenaNoVirtual returns NULL since the Arena pointer |
- // wasn't copied, so both of these methods allocate the submessage on the |
- // heap. |
- |
- printer->Print(variables_, |
- "if (from.has_$name$()) {\n" |
- " $name$_ = new $type$(*from.$name$_);\n" |
- "} else {\n" |
- " $name$_ = NULL;\n" |
- "}\n"); |
-} |
- |
-void MessageFieldGenerator:: |
GenerateMergeFromCodedStream(io::Printer* printer) const { |
if (descriptor_->type() == FieldDescriptor::TYPE_MESSAGE) { |
printer->Print(variables_, |
@@ -585,8 +520,8 @@ void MessageFieldGenerator:: |
GenerateSerializeWithCachedSizesToArray(io::Printer* printer) const { |
printer->Print(variables_, |
"target = ::google::protobuf::internal::WireFormatLite::\n" |
- " InternalWrite$declared_type$NoVirtualToArray(\n" |
- " $number$, *$non_null_ptr_to_name$, false, target);\n"); |
+ " Write$declared_type$NoVirtualToArray(\n" |
+ " $number$, *$non_null_ptr_to_name$, target);\n"); |
} |
void MessageFieldGenerator:: |
@@ -641,7 +576,7 @@ GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { |
if (!dependent_base_) { |
return; |
} |
- std::map<string, string> variables(variables_); |
+ map<string, string> variables(variables_); |
variables["inline"] = "inline "; |
variables["dependent_classname"] = |
DependentBaseClassTemplateName(descriptor_->containing_type()) + "<T>"; |
@@ -661,7 +596,7 @@ GenerateInlineAccessorDefinitions(io::Printer* printer, |
if (dependent_base_) { |
return; |
} |
- std::map<string, string> variables(variables_); |
+ map<string, string> variables(variables_); |
variables["inline"] = is_inline ? "inline " : ""; |
variables["dependent_classname"] = variables["classname"]; |
variables["this_message"] = ""; |
@@ -675,15 +610,16 @@ GenerateInlineAccessorDefinitions(io::Printer* printer, |
void MessageOneofFieldGenerator:: |
GenerateNonInlineAccessorDefinitions(io::Printer* printer) const { |
- std::map<string, string> variables(variables_); |
+ map<string, string> variables(variables_); |
variables["field_member"] = |
variables["oneof_prefix"] + variables["name"] + "_"; |
//printer->Print(variables, |
} |
-void MessageOneofFieldGenerator::InternalGenerateInlineAccessorDefinitions( |
- const std::map<string, string>& variables, io::Printer* printer) const { |
+void MessageOneofFieldGenerator:: |
+InternalGenerateInlineAccessorDefinitions(const map<string, string>& variables, |
+ io::Printer* printer) const { |
printer->Print(variables, |
"$tmpl$" |
"$inline$ " |
@@ -727,8 +663,8 @@ void MessageOneofFieldGenerator::InternalGenerateInlineAccessorDefinitions( |
" 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$(*$field_member$);\n" |
+ " $dependent_typename$* temp = new $dependent_typename$;\n" |
+ " temp->MergeFrom(*$field_member$);\n" |
" $field_member$ = NULL;\n" |
" return temp;\n" |
" } else {\n" |
@@ -853,7 +789,7 @@ void MessageOneofFieldGenerator::InternalGenerateInlineAccessorDefinitions( |
void MessageOneofFieldGenerator:: |
GenerateClearingCode(io::Printer* printer) const { |
- std::map<string, string> variables(variables_); |
+ map<string, string> variables(variables_); |
variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : ""; |
if (SupportsArenas(descriptor_)) { |
printer->Print(variables, |
@@ -867,22 +803,11 @@ GenerateClearingCode(io::Printer* printer) const { |
} |
void MessageOneofFieldGenerator:: |
-GenerateMessageClearingCode(io::Printer* printer) const { |
- GenerateClearingCode(printer); |
-} |
- |
-void MessageOneofFieldGenerator:: |
GenerateSwappingCode(io::Printer* printer) const { |
// Don't print any swapping code. Swapping the union will swap this field. |
} |
void MessageOneofFieldGenerator:: |
-GenerateDestructorCode(io::Printer* printer) const { |
- // We inherit from MessageFieldGenerator, so we need to override the default |
- // behavior. |
-} |
- |
-void MessageOneofFieldGenerator:: |
GenerateConstructorCode(io::Printer* printer) const { |
// Don't print any constructor code. The field is in a union. We allocate |
// space only when this field is used. |
@@ -954,7 +879,7 @@ GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { |
if (!dependent_field_) { |
return; |
} |
- std::map<string, string> variables(variables_); |
+ map<string, string> variables(variables_); |
// For the CRTP base class, all mutation methods are dependent, and so |
// they must be in the header. |
variables["dependent_classname"] = |
@@ -985,6 +910,7 @@ GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { |
" return $this_message$$name$_.Add();\n" |
"}\n"); |
+ |
if (dependent_getter_) { |
printer->Print(variables, |
"template <class T>\n" |
@@ -1008,7 +934,7 @@ GenerateDependentInlineAccessorDefinitions(io::Printer* printer) const { |
void RepeatedMessageFieldGenerator:: |
GenerateInlineAccessorDefinitions(io::Printer* printer, |
bool is_inline) const { |
- std::map<string, string> variables(variables_); |
+ map<string, string> variables(variables_); |
variables["inline"] = is_inline ? "inline " : ""; |
if (!dependent_getter_) { |
@@ -1058,7 +984,7 @@ GenerateInlineAccessorDefinitions(io::Printer* printer, |
void RepeatedMessageFieldGenerator:: |
GenerateClearingCode(io::Printer* printer) const { |
- std::map<string, string> variables(variables_); |
+ map<string, string> variables(variables_); |
variables["this_message"] = dependent_field_ ? DependentBaseDownCast() : ""; |
printer->Print(variables, "$this_message$$name$_.Clear();\n"); |
} |
@@ -1107,26 +1033,20 @@ 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" |
- " InternalWrite$declared_type$NoVirtualToArray(\n" |
- " $number$, this->$name$(i), false, target);\n" |
+ " Write$declared_type$NoVirtualToArray(\n" |
+ " $number$, this->$name$(i), target);\n" |
"}\n"); |
} |
void RepeatedMessageFieldGenerator:: |
GenerateByteSize(io::Printer* printer) const { |
printer->Print(variables_, |
- "{\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 += $tag_size$ * this->$name$_size();\n" |
+ "for (int i = 0; i < this->$name$_size(); 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 |