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