From 2520afd3aa851e7c8268851be67468288fcc9915 Mon Sep 17 00:00:00 2001 From: dsavvinov Date: Thu, 21 Jul 2016 14:27:12 +0300 Subject: [PATCH] Protobuf: fixed a bug in serialization/deserialization of repeated fields (now non-packed fields serialized properly) --- .../google/protobuf/compiler/kotlin/protoc | Bin 105880 -> 106016 bytes .../kotlin/src/kotlin_class_generator.cc | 21 +++- .../kotlin/src/kotlin_field_generator.cc | 115 ++++++++++++++---- .../kotlin/src/kotlin_field_generator.h | 1 + proto/compiler/src/WireFormat.kt | 4 + 5 files changed, 116 insertions(+), 25 deletions(-) diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc index 387885f463a6e28448498c9e739119ac8dcbafde..8ec5a61708e4593995890b5fe453eabd2bf4dc50 100755 GIT binary patch delta 22869 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 JxLR!de*lu5Y}Nn( delta 19628 zcmb7s30M?I^Zv{%R|EkCby1N87UUN2L{S$3U2rjY--_`z7)it%0}2|~6-8S!9+;3s z6E&KcU_4L}uXx1IXkv^}^I<#((MXK(j{AFSW_AUW@Bcjic^#~zuCA``>0K$= z=d^mSQ&EVpde!o;9Oeg>|u(frJK%o!Lf(|6UJ0nc;&4=(OIIIjFDD(8bD zHPq-7JYP7nlPwPJC%jwEt^`liJV&dk`u#hg5T`YDIx25&8CNj zQjf5?e3Z*$12^>WxF`?50(sEXDLN#$D*HhlBY?58aM_5`=iy$w;JdT5LF92>XuX|X zih5Ji)oNfVttM;U0NvB-2TdC2(&+WVZ`)X8Om|_{PBty3qs;YnjKUQVyGQ2wZ|tFZ zW31@dd`r4s#rDT&OAoc4!^>@kw(Eu5?X0qGxB5C51(p=^5ovoWi)t67xq_h&Xtz>` z-NNp)>m~TRviSB(HM!{cKkcqx*8 zc)6j4flIO&I>b~+Z4wnZ4lzk`H6*v0u6T*5%ejBY@xa%2rjHu>l$ zhSIa$XYnpPm%x=j#%TK(WBHe3Uy|a>`{u7E_5!`9I+HY`FC*aF)c+L$*IO%c>8hN8 zKMoeWzC4+lPmqZZ+G5VN0sJWX=;BRugOBclLs`>ZhB^bν@6BGiK(x&5T2ow*P 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 Dun;Ns diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc index b9071957f43..a110cf50e73 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_class_generator.cc @@ -324,7 +324,7 @@ void ClassGenerator::generateParseMethods(io::Printer *printer) const { printer->Indent(); // read while we won't exceed expected amount of bytes - printer->Print("while(getSize() < expectedSize) {\n"); + printer->Print("while(getSizeNoTag() < expectedSize) {\n"); printer->Indent(); printer->Print("parseFieldFrom(input)\n"); @@ -335,7 +335,7 @@ void ClassGenerator::generateParseMethods(io::Printer *printer) const { // check if we have read more than expected vars["dollar"] = "$"; printer->Print(vars, - "if (getSize() > expectedSize) { " + "if (getSizeNoTag() > expectedSize) { " "throw InvalidProtocolBufferException(\"Error: expected size of message $dollar$expectedSize, but have read at least $dollar${getSize()}\") " "}\n"); @@ -359,12 +359,27 @@ void ClassGenerator::generateParseMethods(io::Printer *printer) const { } void ClassGenerator::generateGetSizeMethod(io::Printer *printer) const { + // getSize(): Int printer->Print("fun getSize(): Int {\n"); printer->Indent(); printer->Print("var size = 0\n"); for (int i = 0; i < properties.size(); ++i) { - properties[i]->generateSizeEstimationCode(printer, "size"); + properties[i]->generateSizeEstimationCode(printer, "size", /* noTag = */ false); + } + + printer->Print("return size\n"); + printer->Outdent(); + printer->Print("}\n"); + + + // getSizeNoTag(): Int + printer->Print("fun getSizeNoTag(): Int {\n"); + printer->Indent(); + + printer->Print("var size = 0\n"); + for (int i = 0; i < properties.size(); ++i) { + properties[i]->generateSizeEstimationCode(printer, "size", /* noTag = */ true); } printer->Print("return size\n"); diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc index 04a875e58c0..2ffe7bd90ee 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.cc @@ -58,12 +58,18 @@ FieldGenerator::FieldGenerator(FieldDescriptor const * descriptor, ClassGenerato , protoLabel(descriptor->label()) { } -void FieldGenerator::generateSerializationForRepeated(io::Printer * printer, bool isRead, bool noTag) const { +void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool isRead, bool noTag) const { map vars; vars["fieldNumber"] = std::to_string(getFieldNumber()); vars["builderType"] = getUnderlyingTypeGenerator().getFullType(); vars["initValue"] = getUnderlyingTypeGenerator().getInitValue(); vars["fieldName"] = simpleName; + + bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && + descriptor->type() != FieldDescriptor::TYPE_MESSAGE && + descriptor->type() != FieldDescriptor::TYPE_STRING && + descriptor->type() != FieldDescriptor::TYPE_ENUM; + if (isRead) { if (!noTag) { printer->Print(vars, "val tag = input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); @@ -94,15 +100,9 @@ void FieldGenerator::generateSerializationForRepeated(io::Printer * printer, boo singleFieldGen.simpleName = "tmp"; singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; - // Note that primitive types are packed by default in proto3, i.e. they are should be written without tag - bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && - descriptor->type() != FieldDescriptor::TYPE_MESSAGE && - descriptor->type() != FieldDescriptor::TYPE_STRING && - descriptor->type() != FieldDescriptor::TYPE_ENUM; - - singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ isPrimitive); + singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ true); singleFieldGen.generateSizeEstimationCode(printer, /* varName = */ - "readSize"); // add size of current element to total size + "readSize"); // add size of current element to total size //TODO: think is it's ok that we estimate size with tag here printer->Print(vars, "$fieldName$.add(tmp)\n"); @@ -137,12 +137,6 @@ void FieldGenerator::generateSerializationForRepeated(io::Printer * printer, boo singleFieldGen.simpleName = "item"; singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; - // TODO: maybe refactor this in name_resolving or separate method at least - bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && - descriptor->type() != FieldDescriptor::TYPE_MESSAGE && - descriptor->type() != FieldDescriptor::TYPE_STRING && - descriptor->type() != FieldDescriptor::TYPE_ENUM; - singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ isPrimitive); printer->Outdent(); // for-loop @@ -153,6 +147,72 @@ void FieldGenerator::generateSerializationForRepeated(io::Printer * printer, boo } } +void FieldGenerator::generateSerializationForRepeated(io::Printer *printer, bool isRead, bool noTag) const { + map vars; + vars["fieldNumber"] = std::to_string(getFieldNumber()); + vars["builderType"] = getUnderlyingTypeGenerator().getFullType(); + vars["initValue"] = getUnderlyingTypeGenerator().getInitValue(); + vars["fieldName"] = simpleName; + + if (isRead) { + printer->Print("var readSize = 0\n"); + /* hack: copy current FieldGenerator and change label to OPTIONAL. Also change name to + name of iterator in for-loop. + This will allow to re-use this function for generating serialization code for elements of array. + More importantly, this will care about nested types too. + Efficiently, it inlines serialization code for all underlying types. + This hack isn't necessary from the architectural point of view and could be safely + removed as soon as target code will support inheritance and interfaces. + (then writing CodedOutputStream.writeMessage will be possible). + */ + FieldGenerator singleFieldGen = getUnderlyingTypeGenerator(); + + /* Another dirty hack here: create tmp variable of a given type and read it from input stream + then add that tmp var into list. + This is made because simple recursive call will generate code that tries to array[i].mergeFrom(). + This is incorrect because array has old size, while 'i' iterates over new size, which can lead + to ArrayOutOfIndex errors. + */ + printer->Print(vars, "var tmp: $builderType$ = $initValue$\n"); + singleFieldGen.simpleName = "tmp"; + singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; + + singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ true); + singleFieldGen.generateSizeEstimationCode(printer, /* varName = */ + "readSize", /* noTag = */ true); // add size of current element to total size. Note that + + printer->Print(vars, "$fieldName$.add(tmp)\n"); + } + else { + /** + * Protobuf format: + * - Check if size of array is > 0, because empty repeated fields shouldn't appear in message + * - Write tag explicitly + * - Write length as int32 (note that tag shouldn't be added) + * - Write all repeated elements via recursive call (for primitive types without tags) + */ + printer->Print(vars, "if ($fieldName$.size > 0) {\n"); + printer->Indent(); + + // all elements + printer->Print(vars, "for (item in $fieldName$) {\n"); + printer->Indent(); + + // hack: see above + FieldGenerator singleFieldGen = FieldGenerator(descriptor, enclosingClass, nameResolver); + singleFieldGen.simpleName = "item"; + singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; + + singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ true); + + printer->Outdent(); // for-loop + printer->Print("}\n"); + + printer->Outdent(); // if-clause + printer->Print("}\n"); + } +} + void FieldGenerator::generateSerializationForEnums(io::Printer * printer, bool isRead, bool noTag) const { map vars; vars["converter"] = getEnumFromIntConverter(); @@ -205,7 +265,7 @@ void FieldGenerator::generateSerializationForMessages(io::Printer * printer, boo "$fieldName$.mergeFromWithSize(input, expectedSize)\n"); // check that actual size equal to expected size - printer->Print(vars, "if (expectedSize != $fieldName$.getSize()) { " + printer->Print(vars, "if (expectedSize != $fieldName$.getSizeNoTag()) { " "throw InvalidProtocolBufferException (" "\"Expected size $dollar${expectedSize} got $dollar${$fieldName$.getSize()}" "\") }\n"); @@ -252,7 +312,16 @@ void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead /* Try to generate syntax for serialization of repeated fields. * Note that it should be first check because of Google's FieldDescriptor structure */ if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - generateSerializationForRepeated(printer, isRead, noTag); + bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && + descriptor->type() != FieldDescriptor::TYPE_MESSAGE && + descriptor->type() != FieldDescriptor::TYPE_STRING && + descriptor->type() != FieldDescriptor::TYPE_ENUM; + if (isPrimitive) { + generateSerializationForPacked(printer, isRead, noTag); + } + else { + generateSerializationForRepeated(printer, isRead, noTag); + } return; } @@ -392,11 +461,13 @@ void FieldGenerator::generateSizeEstimationCode(io::Printer *printer, string var if (getProtoType() == FieldDescriptor::TYPE_MESSAGE) { // don't forget about tag and length annotation printer->Print(vars, "$varName$ += $fieldName$.getSize()" - " + " - "WireFormat.getTagSize($fieldNumber$, WireType.LENGTH_DELIMITED)" - " + " - "WireFormat.getVarint32Size($fieldName$.getSize())\n" - ); + "\n"); + if (!noTag) { + printer->Print(vars, "$varName$ += " + "WireFormat.getTagSize($fieldNumber$, WireType.LENGTH_DELIMITED)" + " + " + "WireFormat.getVarint32Size($fieldName$.getSize())\n"); + } return; } diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h index 1af1117a7b7..6c483789d45 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/src/kotlin_field_generator.h @@ -27,6 +27,7 @@ private: void generateSetter(io::Printer * printer) const; void generateRepeatedMethods(io::Printer * printer, bool isBuilder) const; + void generateSerializationForPacked (io::Printer * printer, bool isRead, bool noTag) const; void generateSerializationForRepeated (io::Printer * printer, bool isRead, bool noTag) const; void generateSerializationForEnums (io::Printer * printer, bool isRead, bool noTag) const; void generateSerializationForMessages (io::Printer * printer, bool isRead, bool noTag) const; diff --git a/proto/compiler/src/WireFormat.kt b/proto/compiler/src/WireFormat.kt index 1caabc33a9c..f81259f7496 100644 --- a/proto/compiler/src/WireFormat.kt +++ b/proto/compiler/src/WireFormat.kt @@ -104,11 +104,15 @@ object WireFormat { } fun getStringSize(fieldNumber: Int, value: String): Int { + if (value.length == 0) + return 0 val encodedStringSize = value.toByteArray(Charsets.UTF_8).size //TODO: not sure if it's the best way to do it return encodedStringSize + getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) + getVarint32Size(encodedStringSize) } fun getBytesSize(fieldNumber: Int, value: ByteArray): Int { + if (value.size == 0) + return 0 return value.size + getTagSize(fieldNumber, WireType.LENGTH_DELIMITED) + getVarint32Size(value.size) } } \ No newline at end of file