Prechádzať zdrojové kódy

Merge pull request #2121 from mazurkin/issue-2108

issue-2108 [protoc/Java] Excessive copying on buildPartial()
Feng Xiao 7 rokov pred
rodič
commit
8af87de949

+ 6 - 2
src/google/protobuf/compiler/java/java_enum_field.cc

@@ -305,11 +305,15 @@ GenerateBuildingCode(io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     printer->Print(variables_,
       "if ($get_has_field_bit_from_local$) {\n"
+      "  result.$name$_ = $name$_;\n"
       "  $set_has_field_bit_to_local$;\n"
+      "} else {\n"
+      "  result.$name$_ = $default_number$;\n"
       "}\n");
+  } else {
+    printer->Print(variables_,
+      "result.$name$_ = $name$_;\n");
   }
-  printer->Print(variables_,
-    "result.$name$_ = $name$_;\n");
 }
 
 void ImmutableEnumFieldGenerator::

+ 1 - 4
src/google/protobuf/compiler/java/java_lazy_message_field.cc

@@ -233,12 +233,9 @@ void ImmutableLazyMessageFieldGenerator::
 GenerateBuildingCode(io::Printer* printer) const {
   printer->Print(variables_,
       "if ($get_has_field_bit_from_local$) {\n"
+      "  result.$name$_.set($name$_);\n"
       "  $set_has_field_bit_to_local$;\n"
       "}\n");
-
-  printer->Print(variables_,
-      "result.$name$_.set(\n"
-      "    $name$_);\n");
 }
 
 void ImmutableLazyMessageFieldGenerator::

+ 14 - 9
src/google/protobuf/compiler/java/java_message_field.cc

@@ -255,7 +255,7 @@ GenerateBuilderMembers(io::Printer* printer) const {
   bool support_field_presence = SupportFieldPresence(descriptor_->file());
 
   printer->Print(variables_,
-    "private $type$ $name$_ = null;\n");
+    "private $type$ $name$_;\n");
 
   printer->Print(variables_,
       // If this builder is non-null, it is used and the other fields are
@@ -444,15 +444,20 @@ void ImmutableMessageFieldGenerator::
 GenerateBuildingCode(io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     printer->Print(variables_,
-        "if ($get_has_field_bit_from_local$) {\n"
-        "  $set_has_field_bit_to_local$;\n"
-        "}\n");
+      "if ($get_has_field_bit_from_local$) {\n");
+    printer->Indent();
+    PrintNestedBuilderCondition(printer,
+      "result.$name$_ = $name$_;\n",
+      "result.$name$_ = $name$Builder_.build();\n");
+    printer->Outdent();
+    printer->Print(variables_,
+      "  $set_has_field_bit_to_local$;\n"
+      "}\n");
+  } else {
+    PrintNestedBuilderCondition(printer,
+      "result.$name$_ = $name$_;\n",
+      "result.$name$_ = $name$Builder_.build();\n");
   }
-
-  PrintNestedBuilderCondition(printer,
-    "result.$name$_ = $name$_;\n",
-
-    "result.$name$_ = $name$Builder_.build();\n");
 }
 
 void ImmutableMessageFieldGenerator::

+ 17 - 5
src/google/protobuf/compiler/java/java_primitive_field.cc

@@ -264,7 +264,9 @@ GenerateFieldBuilderInitializationCode(io::Printer* printer)  const {
 
 void ImmutablePrimitiveFieldGenerator::
 GenerateInitializationCode(io::Printer* printer) const {
-  printer->Print(variables_, "$name$_ = $default$;\n");
+  if (!IsDefaultValueJavaDefault(descriptor_)) {
+    printer->Print(variables_, "$name$_ = $default$;\n");
+  }
 }
 
 void ImmutablePrimitiveFieldGenerator::
@@ -294,11 +296,21 @@ GenerateBuildingCode(io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     printer->Print(variables_,
       "if ($get_has_field_bit_from_local$) {\n"
-      "  $set_has_field_bit_to_local$;\n"
-      "}\n");
+      "  result.$name$_ = $name$_;\n"
+      "  $set_has_field_bit_to_local$;\n");
+    if (IsDefaultValueJavaDefault(descriptor_)) {
+      printer->Print(variables_,
+        "}\n");
+    } else {
+      printer->Print(variables_,
+        "} else {\n"
+        "  result.$name$_ = $default$;\n"
+        "}\n");
+    }
+  } else {
+    printer->Print(variables_,
+      "result.$name$_ = $name$_;\n");
   }
-  printer->Print(variables_,
-    "result.$name$_ = $name$_;\n");
 }
 
 void ImmutablePrimitiveFieldGenerator::

+ 6 - 2
src/google/protobuf/compiler/java/java_string_field.cc

@@ -405,11 +405,15 @@ GenerateBuildingCode(io::Printer* printer) const {
   if (SupportFieldPresence(descriptor_->file())) {
     printer->Print(variables_,
       "if ($get_has_field_bit_from_local$) {\n"
+      "  result.$name$_ = $name$_;\n"
       "  $set_has_field_bit_to_local$;\n"
+      "} else {\n"
+      "  result.$name$_ = $default$;\n"
       "}\n");
+  } else {
+    printer->Print(variables_,
+      "result.$name$_ = $name$_;\n");
   }
-  printer->Print(variables_,
-    "result.$name$_ = $name$_;\n");
 }
 
 void ImmutableStringFieldGenerator::