Index: third_party/protobuf/src/google/protobuf/compiler/java/java_message_field_lite.cc |
diff --git a/third_party/protobuf/src/google/protobuf/compiler/java/java_message_field_lite.cc b/third_party/protobuf/src/google/protobuf/compiler/java/java_message_field_lite.cc |
index 356520ec6570ad9fd232204bc8320c563098c7a7..142818169dbcf17f07d7fc3df9d0a66e187ff9cb 100644 |
--- a/third_party/protobuf/src/google/protobuf/compiler/java/java_message_field_lite.cc |
+++ b/third_party/protobuf/src/google/protobuf/compiler/java/java_message_field_lite.cc |
@@ -70,8 +70,6 @@ void SetMessageVariables(const FieldDescriptor* descriptor, |
// by the proto compiler |
(*variables)["deprecation"] = descriptor->options().deprecated() |
? "@java.lang.Deprecated " : ""; |
- (*variables)["on_changed"] = |
- HasDescriptorMethods(descriptor->containing_type()) ? "onChanged();" : ""; |
if (SupportFieldPresence(descriptor->file())) { |
// For singular messages and builders, one bit is used for the hasField bit. |
@@ -288,11 +286,9 @@ void ImmutableMessageFieldLiteGenerator:: |
GenerateInitializationCode(io::Printer* printer) const {} |
void ImmutableMessageFieldLiteGenerator:: |
-GenerateMergingCode(io::Printer* printer) const { |
+GenerateVisitCode(io::Printer* printer) const { |
printer->Print(variables_, |
- "if (other.has$capitalized_name$()) {\n" |
- " merge$capitalized_name$(other.get$capitalized_name$());\n" |
- "}\n"); |
+ "$name$_ = visitor.visitMessage($name$_, other.$name$_);\n"); |
} |
void ImmutableMessageFieldLiteGenerator:: |
@@ -302,11 +298,18 @@ GenerateDynamicMethodMakeImmutableCode(io::Printer* printer) const { |
void ImmutableMessageFieldLiteGenerator:: |
GenerateParsingCode(io::Printer* printer) const { |
- printer->Print(variables_, |
- "$type$.Builder subBuilder = null;\n" |
- "if ($is_field_present_message$) {\n" |
- " subBuilder = $name$_.toBuilder();\n" |
- "}\n"); |
+ // TODO(dweis): Update this code to avoid the builder allocation and instead |
+ // only allocate a submessage that isn't made immutable. Rely on the top |
+ // message calling makeImmutable once done to actually traverse the tree and |
+ // finalize state. This will avoid: |
+ // - transitive builder allocations |
+ // - the extra transitive iteration for streamed fields |
+ // - reallocations for copying repeated fields |
+ printer->Print(variables_, |
+ "$type$.Builder subBuilder = null;\n" |
+ "if ($is_field_present_message$) {\n" |
+ " subBuilder = $name$_.toBuilder();\n" |
+ "}\n"); |
if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { |
printer->Print(variables_, |
@@ -506,9 +509,12 @@ GenerateBuilderMembers(io::Printer* printer) const { |
} |
void ImmutableMessageOneofFieldLiteGenerator:: |
-GenerateMergingCode(io::Printer* printer) const { |
+GenerateVisitCode(io::Printer* printer) const { |
printer->Print(variables_, |
- "merge$capitalized_name$(other.get$capitalized_name$());\n"); |
+ "$oneof_name$_ = visitor.visitOneofMessage(\n" |
+ " $has_oneof_case_message$,\n" |
+ " $oneof_name$_,\n" |
+ " other.$oneof_name$_);\n"); |
} |
void ImmutableMessageOneofFieldLiteGenerator:: |
@@ -635,7 +641,8 @@ GenerateMembers(io::Printer* printer) const { |
printer->Print(variables_, |
"private void ensure$capitalized_name$IsMutable() {\n" |
" if (!$is_mutable$) {\n" |
- " $name$_ = newProtobufList($name$_);\n" |
+ " $name$_ =\n" |
+ " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" |
" }\n" |
"}\n" |
"\n"); |
@@ -853,22 +860,9 @@ GenerateInitializationCode(io::Printer* printer) const { |
} |
void RepeatedImmutableMessageFieldLiteGenerator:: |
-GenerateMergingCode(io::Printer* printer) const { |
- // The code below does two optimizations (non-nested builder case): |
- // 1. If the other list is empty, there's nothing to do. This ensures we |
- // don't allocate a new array if we already have an immutable one. |
- // 2. If the other list is non-empty and our current list is empty, we can |
- // reuse the other list which is guaranteed to be immutable. |
- printer->Print(variables_, |
- "if (!other.$name$_.isEmpty()) {\n" |
- " if ($name$_.isEmpty()) {\n" |
- " $name$_ = other.$name$_;\n" |
- " } else {\n" |
- " ensure$capitalized_name$IsMutable();\n" |
- " $name$_.addAll(other.$name$_);\n" |
- " }\n" |
- " $on_changed$\n" |
- "}\n"); |
+GenerateVisitCode(io::Printer* printer) const { |
+ printer->Print(variables_, |
+ "$name$_= visitor.visitList($name$_, other.$name$_);\n"); |
} |
void RepeatedImmutableMessageFieldLiteGenerator:: |
@@ -881,7 +875,8 @@ void RepeatedImmutableMessageFieldLiteGenerator:: |
GenerateParsingCode(io::Printer* printer) const { |
printer->Print(variables_, |
"if (!$is_mutable$) {\n" |
- " $name$_ = newProtobufList();\n" |
+ " $name$_ =\n" |
+ " com.google.protobuf.GeneratedMessageLite.mutableCopy($name$_);\n" |
"}\n"); |
if (GetType(descriptor_) == FieldDescriptor::TYPE_GROUP) { |