From 8c96f21515e6a9dd1961d923c4858df4a647afbc Mon Sep 17 00:00:00 2001 From: dsavvinov Date: Mon, 8 Aug 2016 18:02:53 +0300 Subject: [PATCH] Protobuf: changed all arrays in generated code into primitive arrays --- .../google/protobuf/compiler/kotlin/protoc | Bin 114448 -> 110224 bytes .../kotlin/src/kotlin_class_generator.cc | 2 +- .../kotlin/src/kotlin_field_generator.cc | 261 ++++++------------ .../kotlin/src/kotlin_field_generator.h | 14 +- .../protobuf/compiler/kotlin/test/route.proto | 8 +- 5 files changed, 94 insertions(+), 191 deletions(-) diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc b/proto/compiler/google/src/google/protobuf/compiler/kotlin/protoc index 9eddc2bcaea60bf353d715cc9200ae0d9ac74cd8..9c5a779135413c039617af3b98eadb22c95fa4d6 100755 GIT binary patch delta 36268 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
xm?3x)4WTE*4FFic(SY5v2iL+kCwn} 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 == FieldDescriptor::LABEL_REPEATED) { - printer->Print(vars, "$fieldName$.addAll(other.$fieldName$)\n"); + printer->Print(vars, "$fieldName$ = $fieldName$.plus((other.$fieldName$))\n"); } // Bytes type is handled separately 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 7f32470b660..cb5e1ebf947 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 @@ -17,7 +17,7 @@ namespace kotlin { string FieldGenerator::getInitValue() const { if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - return "mutableListOf()"; + return getFullType() + "(0)"; } if (getProtoType() == FieldDescriptor::TYPE_MESSAGE) { return getBuilderFullType() + "().build()"; @@ -58,12 +58,13 @@ FieldGenerator::FieldGenerator(FieldDescriptor const * descriptor, ClassGenerato , protoLabel(descriptor->label()) { } -void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool isRead, bool noTag) const { +void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool isRead, bool noTag, bool isField) const { map vars; vars["fieldNumber"] = std::to_string(getFieldNumber()); - vars["builderType"] = getUnderlyingTypeGenerator().getFullType(); + vars["underlyingType"] = getUnderlyingTypeGenerator().getFullType(); vars["initValue"] = getUnderlyingTypeGenerator().getInitValue(); vars["fieldName"] = simpleName; + vars["arrayType"] = getFullType(); bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && descriptor->type() != FieldDescriptor::TYPE_MESSAGE && @@ -74,10 +75,12 @@ void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool i if (!noTag) { printer->Print(vars, "val tag = input.readTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); } - printer->Print(vars, "val expectedSize = input.readInt32NoTag()\n"); - printer->Print("var readSize = 0\n"); - printer->Print(vars, "while(readSize != expectedSize) {\n"); - printer->Indent(); + printer->Print(vars, "val expectedByteSize = input.readInt32NoTag()\n"); + + /* Now we want to compute element size of array. For this, we are estimating byte size of a single element, + * and then divide byte size of whole array by byte size of single element. + */ + printer->Print(vars, "var singleElemSize = 0\n"); /* hack: copy current FieldGenerator and change label to OPTIONAL. Also change name to name of iterator in for-loop. @@ -89,40 +92,44 @@ void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool i (then writing CodedOutputStream.writeMessage will be possible). */ FieldGenerator singleFieldGen = getUnderlyingTypeGenerator(); + singleFieldGen.simpleName = "singleElemSize"; + singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ true, /* isField = */ false); - /* 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"); + printer->Print(vars, "val arraySize = expectedByteSize / singleElemSize\n"); + + // Allocate new array of estimated size + printer->Print(vars, "val newArray = $arrayType$(arraySize)\n"); + + printer->Print("var i = 0\n"); + printer->Print(vars, "while(i < arraySize) {\n"); + printer->Indent(); + + printer->Print(vars, "var tmp: $underlyingType$ = $initValue$\n"); singleFieldGen.simpleName = "tmp"; singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; - singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ true); - singleFieldGen.generateSizeEstimationCode(printer, /* varName = */ - "readSize"); // add size of current element to total size //TODO: think is it's ok that we estimate size with tag here + singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ true, /* isField = */ false); - printer->Print(vars, "$fieldName$.add(tmp)\n"); + printer->Print(vars, "$fieldName$[i] = tmp\n"); + printer->Print("i += 1\n"); printer->Outdent(); printer->Print("}\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) - */ + * 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) + */ // tag printer->Print(vars, "output.writeTag($fieldNumber$, WireType.LENGTH_DELIMITED)\n"); // length printer->Print(vars, "var arrayByteSize = 0\n"); - generateSizeEstimationCode(printer, "arrayByteSize", /* noTag = */ true); + generateSizeEstimationCode(printer, "arrayByteSize", /* noTag = */ true, /* isField = */ false); printer->Print(vars, "output.writeInt32NoTag(arrayByteSize)\n"); // all elements @@ -134,75 +141,14 @@ void FieldGenerator::generateSerializationForPacked(io::Printer *printer, bool i singleFieldGen.simpleName = "item"; singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; - singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ isPrimitive); + singleFieldGen.generateSerializationCode(printer, isRead, /* noTag = */ isPrimitive, /* isField = */ false); printer->Outdent(); // for-loop printer->Print("}\n"); } } -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) - */ - - // 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"); - } -} - -void FieldGenerator::generateSerializationForEnums(io::Printer * printer, bool isRead, bool noTag) const { +void FieldGenerator::generateSerializationForEnums(io::Printer * printer, bool isRead, bool noTag, bool isField) const { map vars; vars["converter"] = getEnumFromIntConverter(); @@ -229,7 +175,7 @@ void FieldGenerator::generateSerializationForEnums(io::Printer * printer, bool i } } -void FieldGenerator::generateSerializationForMessages(io::Printer * printer, bool isRead, bool noTag) const { +void FieldGenerator::generateSerializationForMessages(io::Printer * printer, bool isRead, bool noTag, bool isField) const { map vars; vars["fieldNumber"] = std::to_string(getFieldNumber()); vars["dollar"] = "$"; @@ -274,7 +220,7 @@ void FieldGenerator::generateSerializationForMessages(io::Printer * printer, boo } } -void FieldGenerator::generateSerializationForPrimitives(io::Printer * printer, bool isRead, bool noTag) const { +void FieldGenerator::generateSerializationForPrimitives(io::Printer * printer, bool isRead, bool noTag, bool isField) const { map vars; vars["fieldName"] = simpleName; vars["suffix"] = getKotlinFunctionSuffix(); @@ -297,7 +243,7 @@ void FieldGenerator::generateSerializationForPrimitives(io::Printer * printer, b } } -void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead, bool noTag) const { +void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead, bool noTag, bool isField) const { map vars; vars["fieldName"] = simpleName; vars["initValue"] = getInitValue(); @@ -307,60 +253,50 @@ void FieldGenerator::generateSerializationCode(io::Printer *printer, bool isRead * Note that it should be first check because of Google's FieldDescriptor structure */ if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { // we shouldn't write fields with default values when writing - if (!isRead) { + if (!isRead && isField) { printer->Print(vars, "if ($fieldName$.size > 0) {\n"); printer->Indent(); } bool isPrimitive = descriptor->type() != FieldDescriptor::TYPE_BYTES && descriptor->type() != FieldDescriptor::TYPE_MESSAGE && - descriptor->type() != FieldDescriptor::TYPE_STRING && - descriptor->type() != FieldDescriptor::TYPE_ENUM; + descriptor->type() != FieldDescriptor::TYPE_STRING; if (isPrimitive) { - generateSerializationForPacked(printer, isRead, noTag); + generateSerializationForPacked(printer, isRead, noTag, isField); } else { - generateSerializationForRepeated(printer, isRead, noTag); + throw UnreachableStateException("Arrays of non-primitive types are not supported"); } } - /* Then check is current field is enum. We have to handle it separately too, because - * we have to pass enums as Int's to CodedStreams as per protobuf-format */ - else if (descriptor->type() == FieldDescriptor::TYPE_ENUM) { - // we shouldn't write fields with default values when writing - if (!isRead) { - printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); - printer->Indent(); - } - - generateSerializationForEnums(printer, isRead, noTag); - } - - /* Then check for nested messages. Here we re-use writeTo method, that should be defined in - * that message. - * Note that readFrom/writeTo methods write message as it's top-level message, i.e. without - * any tags. Therefore, we have to prepend tags and size manually. */ - else if (descriptor->type() == FieldDescriptor::TYPE_MESSAGE) { - // we shouldn't write fields with default values when writing - if (!isRead) { - printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); - printer->Indent(); - } - - generateSerializationForMessages(printer, isRead, noTag); - } - /* Finally, serialize trivial cases */ else { - // we shouldn't write fields with default values when writing - if (!isRead) { + // we shouldn't write fair fields with default values + if (!isRead && isField) { printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); printer->Indent(); } - generateSerializationForPrimitives(printer, isRead, noTag); + /* Then check is current field is enum. We have to handle it separately too, because + * we have to pass enums as Int's to CodedStreams as per protobuf-format */ + if (descriptor->type() == FieldDescriptor::TYPE_ENUM) { + generateSerializationForEnums(printer, isRead, noTag, isField); + } + + /* Then check for nested messages. Here we re-use writeTo method, that should be defined in + * that message. + * Note that readFrom/writeTo methods write message as it's top-level message, i.e. without + * any tags. Therefore, we have to prepend tags and size manually. */ + else if (descriptor->type() == FieldDescriptor::TYPE_MESSAGE) { + generateSerializationForMessages(printer, isRead, noTag, isField); + } + + /* Finally, serialize trivial cases */ + else { + generateSerializationForPrimitives(printer, isRead, noTag, isField); + } } - if (!isRead) { + if (!isRead && isField) { printer->Outdent(); printer->Print("}\n"); } @@ -392,45 +328,20 @@ void FieldGenerator::generateRepeatedMethods(io::Printer * printer, bool isBuild // generate indexed setter for builders if (isBuilder) { - printer->Print(vars, "fun set$elementType$(index: Int, $arg$: $elementType$): $builderName$ {\n"); + printer->Print(vars, "fun set$fieldName$ByIndex(index: Int, $arg$: $elementType$): $builderName$ {\n"); printer->Indent(); printer->Print(vars, "$fieldName$[index] = $arg$\n"); printer->Print(vars, "return this\n"); printer->Outdent(); printer->Print("}\n"); } - - if (isBuilder) { - // generate single-add for builders - printer->Print(vars, "fun add$elementType$($arg$: $elementType$): $builderName$ {\n"); - printer->Indent(); - printer->Print(vars, "$fieldName$.add($arg$)\n" - "return this\n"); - printer->Outdent(); - printer->Print(vars, "}\n"); - - // generate addAll for builders - printer->Print(vars, "fun addAll$elementType$($arg$: Iterable<$elementType$>): $builderName$ {\n"); - printer->Indent(); - printer->Print(vars, "for (item in $arg$) {\n"); - printer->Indent(); - printer->Print(vars, "$fieldName$.add(item)\n"); - - printer->Outdent(); // for-loop - printer->Print("}\n"); - - printer->Print("return this\n"); - - printer->Outdent(); // function body - printer->Print("}\n"); - } } string FieldGenerator::getKotlinFunctionSuffix() const { return name_resolving::protobufTypeToKotlinFunctionSuffix(descriptor->type()); } -void FieldGenerator::generateSizeEstimationCode(io::Printer *printer, string varName, bool noTag) const { +void FieldGenerator::generateSizeEstimationCode(io::Printer *printer, string varName, bool noTag, bool isField) const { map vars; vars["varName"] = varName; vars["fieldName"] = simpleName; @@ -459,7 +370,7 @@ void FieldGenerator::generateSizeEstimationCode(io::Printer *printer, string var FieldGenerator singleFieldGen = FieldGenerator(descriptor, enclosingClass, nameResolver); singleFieldGen.protoLabel = FieldDescriptor::LABEL_OPTIONAL; singleFieldGen.simpleName = "item"; - singleFieldGen.generateSizeEstimationCode(printer, "arraySize", noTag); + singleFieldGen.generateSizeEstimationCode(printer, "arraySize", noTag, /* isField = */ false); printer->Outdent(); // for-loop printer->Print("}\n"); @@ -477,42 +388,38 @@ void FieldGenerator::generateSizeEstimationCode(io::Printer *printer, string var return; } + // If we are generating code for fair field (not for dummy), then we should check for default value + // Note that we can't lift that check up, because repeated fields should be treated separately + if (isField) { + printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); + printer->Indent(); + } + // Then, call getSize recursively for nested messages // TODO: currently suboptimal repeatative calls getSize() are being made. We can optimize it later via caching calls to getSize() if (getProtoType() == FieldDescriptor::TYPE_MESSAGE) { - printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); - printer->Indent(); vars["maybeNoTag"] = noTag ? "NoTag" : ""; vars["maybeFieldNumber"] = noTag ? "" : std::to_string(getFieldNumber()); printer->Print(vars, "$varName$ += $fieldName$.getSize$maybeNoTag$($maybeFieldNumber$)" - "\n"); - printer->Outdent(); // if-clause - printer->Print("}\n"); - return; + "\n"); } + // Next, process enums as they should be casted to ints manually - if (getProtoType() == FieldDescriptor::TYPE_ENUM) { - printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); - printer->Indent(); - + else if (getProtoType() == FieldDescriptor::TYPE_ENUM) { printer->Print(vars, "$varName$ += WireFormat.getEnumSize($fieldNumber$, $fieldName$.ord)\n"); - - printer->Outdent(); // if-clause - printer->Print("}\n"); - return; } // Finally, get size of all primitive types trivially via call to WireFormat in runtime - vars["kotlinSuffix"] = getKotlinFunctionSuffix(); - printer->Print(vars, "if ($fieldName$ != $initValue$) {\n"); - printer->Indent(); + else { + vars["kotlinSuffix"] = getKotlinFunctionSuffix(); + printer->Print(vars, "$varName$ += WireFormat.get$kotlinSuffix$Size($fieldNumber$, $fieldName$)\n"); + } - printer->Print(vars, "$varName$ += WireFormat.get$kotlinSuffix$Size($fieldNumber$, $fieldName$)\n"); - - printer->Outdent(); // if-clause - printer->Print("}\n"); - return; + if (isField) { + printer->Outdent(); // if-clause + printer->Print("}\n"); + } } FieldDescriptor::Label FieldGenerator::getProtoLabel() const { @@ -543,7 +450,7 @@ string FieldGenerator::getSimpleType() const { string FieldGenerator::getFullType() const { if (getProtoLabel() == FieldDescriptor::LABEL_REPEATED) { - return "MutableList <" + getUnderlyingTypeGenerator().getFullType() + ">"; + return getUnderlyingTypeGenerator().getFullType() + "Array"; } if (getProtoType() == FieldDescriptor::TYPE_MESSAGE || getProtoType() == FieldDescriptor::TYPE_ENUM) { 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 c635145612c..5f19f8ef045 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,11 +27,11 @@ 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; - void generateSerializationForPrimitives (io::Printer * printer, bool isRead, bool noTag) const; + void generateSerializationForPacked (io::Printer * printer, bool isRead, bool noTag, bool isField) const; + void generateSerializationForRepeated (io::Printer * printer, bool isRead, bool noTag, bool isField) const; + void generateSerializationForEnums (io::Printer * printer, bool isRead, bool noTag, bool isField) const; + void generateSerializationForMessages (io::Printer * printer, bool isRead, bool noTag, bool isField) const; + void generateSerializationForPrimitives (io::Printer * printer, bool isRead, bool noTag, bool isField) const; public: ClassGenerator const * enclosingClass; // class, in which that field is defined NameResolver * nameResolver; @@ -84,8 +84,8 @@ public: string getWireType() const; void generateCode(io::Printer * printer, bool isBuilder) const; - void generateSerializationCode(io::Printer * printer, bool isRead = false, bool noTag = false) const; - void generateSizeEstimationCode(io::Printer * printer, string varName, bool noTag = false) const; + void generateSerializationCode (io::Printer * printer, bool isRead = false, bool noTag = false, bool isField = true) const; + void generateSizeEstimationCode(io::Printer * printer, string varName, bool noTag = false, bool isField = true) const; FieldGenerator(FieldDescriptor const * descriptor, ClassGenerator const * enclosingClass, NameResolver * nameResolver); }; diff --git a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/route.proto b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/route.proto index 7875fa2ce36..1236948c311 100644 --- a/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/route.proto +++ b/proto/compiler/google/src/google/protobuf/compiler/kotlin/test/route.proto @@ -5,12 +5,8 @@ option java_package = "proto.car"; option java_outer_classname = "Route"; message RouteRequest { - repeated WayPoint way_points = 1; - - message WayPoint { - int32 distance = 2; - int32 angle_delta = 3; - } + repeated int32 dinstances = 1; + repeated int32 angle_deltas = 2; } message RouteResponse {