aboutsummaryrefslogtreecommitdiff
path: root/src/google/protobuf/compiler/java/java_message_field.cc
diff options
context:
space:
mode:
authorNickolay Mazurkin <mazurkin@gmail.com>2016-09-18 10:38:18 +0300
committerNickolay Mazurkin <mazurkin@gmail.com>2016-09-18 15:48:08 +0300
commitaba6f7ef6703d72eda3d063dc2e6566d84f080a5 (patch)
tree7f49320e07120b3931b8ee59470495001b6e1a61 /src/google/protobuf/compiler/java/java_message_field.cc
parentc44ca26fe89ed8a81d3ee475a2ccc1797141dbce (diff)
downloadprotobuf-aba6f7ef6703d72eda3d063dc2e6566d84f080a5.tar.gz
protobuf-aba6f7ef6703d72eda3d063dc2e6566d84f080a5.tar.bz2
protobuf-aba6f7ef6703d72eda3d063dc2e6566d84f080a5.zip
[issue-2108] [protoc/java] Excessive copying on buildPartial()
Diffstat (limited to 'src/google/protobuf/compiler/java/java_message_field.cc')
-rw-r--r--src/google/protobuf/compiler/java/java_message_field.cc23
1 files changed, 14 insertions, 9 deletions
diff --git a/src/google/protobuf/compiler/java/java_message_field.cc b/src/google/protobuf/compiler/java/java_message_field.cc
index c9865dda..70b5f629 100644
--- a/src/google/protobuf/compiler/java/java_message_field.cc
+++ b/src/google/protobuf/compiler/java/java_message_field.cc
@@ -251,7 +251,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
@@ -434,15 +434,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::