aboutsummaryrefslogtreecommitdiff
path: root/src/google
diff options
context:
space:
mode:
authorjasonh+personal@google.com <jasonh+personal@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-12-01 18:05:21 +0000
committerjasonh+personal@google.com <jasonh+personal@google.com@630680e5-0e50-0410-840e-4b1c322b438d>2009-12-01 18:05:21 +0000
commit9951233e9a5c23ad285b0286e7e896bfd46f8397 (patch)
tree08ea80c9fb0fe98c5011143f5123cab37e9cd364 /src/google
parent6493368285ce77792f6076954d4311a9a457a826 (diff)
downloadprotobuf-9951233e9a5c23ad285b0286e7e896bfd46f8397.tar.gz
protobuf-9951233e9a5c23ad285b0286e7e896bfd46f8397.tar.bz2
protobuf-9951233e9a5c23ad285b0286e7e896bfd46f8397.zip
Fix Issue 136: the memoized serialized size for packed fields may not
be properly set. writeTo() may be invoked without a call to getSerializedSize(), so the generated serialization methods would write a length of 0 for non-empty packed fields. Just call getSerializedSize() at the beginning of writeTo(): although this means that we may compute the byte size needlessly when there are no packed fields, in practice, getSerializedSize() will already have been called - all of the writeTo() wrappers in AbstractMessageLite invoke it. Tested: new unittest case in WireFormatTest.java now passes
Diffstat (limited to 'src/google')
-rw-r--r--src/google/protobuf/compiler/java/java_message.cc8
-rw-r--r--src/google/protobuf/compiler/java/java_primitive_field.cc2
2 files changed, 9 insertions, 1 deletions
diff --git a/src/google/protobuf/compiler/java/java_message.cc b/src/google/protobuf/compiler/java/java_message.cc
index 332a118f..99b57c95 100644
--- a/src/google/protobuf/compiler/java/java_message.cc
+++ b/src/google/protobuf/compiler/java/java_message.cc
@@ -394,6 +394,14 @@ GenerateMessageSerializationMethods(io::Printer* printer) {
"public void writeTo(com.google.protobuf.CodedOutputStream output)\n"
" throws java.io.IOException {\n");
printer->Indent();
+ // writeTo(CodedOutputStream output) might be invoked without
+ // getSerializedSize() ever being called, but we need the memoized
+ // sizes in case this message has packed fields. Rather than emit checks for
+ // each packed field, just call getSerializedSize() up front for all messages.
+ // In most cases, getSerializedSize() will have already been called anyway by
+ // one of the wrapper writeTo() methods, making this call cheap.
+ printer->Print(
+ "getSerializedSize();\n");
if (descriptor_->extension_range_count() > 0) {
if (descriptor_->options().message_set_wire_format()) {
diff --git a/src/google/protobuf/compiler/java/java_primitive_field.cc b/src/google/protobuf/compiler/java/java_primitive_field.cc
index 327c2053..1fbca5a2 100644
--- a/src/google/protobuf/compiler/java/java_primitive_field.cc
+++ b/src/google/protobuf/compiler/java/java_primitive_field.cc
@@ -298,7 +298,7 @@ GenerateMembers(io::Printer* printer) const {
if (descriptor_->options().packed() &&
HasGeneratedMethods(descriptor_->containing_type())) {
printer->Print(variables_,
- "private int $name$MemoizedSerializedSize;\n");
+ "private int $name$MemoizedSerializedSize = -1;\n");
}
}