From 96ddf01aed1a49d73a7fda50e28c431ffc977e5a Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Fri, 12 Jun 2015 09:53:12 +0100 Subject: Coded*Stream streamlining. Remove ICodedInputStream and ICodedOutputStream, and rewrite CodedInputStream and CodedOutputStream to be specific to the binary format. If we want to support text-based formats, that can be a whole different serialization mechanism. --- .../protobuf/compiler/csharp/csharp_enum_field.cc | 16 +++++----------- src/google/protobuf/compiler/csharp/csharp_message.cc | 17 ++++------------- .../protobuf/compiler/csharp/csharp_message_field.cc | 3 ++- .../protobuf/compiler/csharp/csharp_primitive_field.cc | 16 ++++++---------- .../compiler/csharp/csharp_repeated_enum_field.cc | 4 ++-- .../compiler/csharp/csharp_repeated_message_field.cc | 4 ++-- .../compiler/csharp/csharp_repeated_primitive_field.cc | 6 +++--- 7 files changed, 24 insertions(+), 42 deletions(-) (limited to 'src/google') diff --git a/src/google/protobuf/compiler/csharp/csharp_enum_field.cc b/src/google/protobuf/compiler/csharp/csharp_enum_field.cc index 3494b228..19fd50cf 100644 --- a/src/google/protobuf/compiler/csharp/csharp_enum_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_enum_field.cc @@ -54,17 +54,14 @@ EnumFieldGenerator::~EnumFieldGenerator() { } void EnumFieldGenerator::GenerateParsingCode(io::Printer* printer) { - // TODO(jonskeet): Get rid of the temporary variable when we sanitize CodedInputStream not to use ref. printer->Print(variables_, - "int tmp = 0;\n" - "input.ReadEnum(ref tmp);\n" - "$name$_ = ($type_name$) tmp;"); + "$name$_ = ($type_name$) input.ReadEnum();\n"); } void EnumFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print(variables_, "if ($has_property_check$) {\n" - " output.WriteEnum($number$, fieldNames[$field_ordinal$], (int) $property_name$);\n" + " output.WriteEnum($number$, (int) $property_name$);\n" "}\n"); } @@ -88,18 +85,15 @@ void EnumOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) { // TODO(jonskeet): What about if we read the default value? printer->Print( variables_, - "int enumValue = 0;\n" - "if(input.ReadEnum(ref enumValue)) {\n" - " $oneof_name$_ = enumValue;\n" - " $oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n" - "}\n"); + "$oneof_name$_ = input.ReadEnum();\n" + "$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n"); } void EnumOneofFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" - " output.WriteEnum($number$, fieldNames[$field_ordinal$], (int) $property_name$);\n" + " output.WriteEnum($number$, (int) $property_name$);\n" "}\n"); } diff --git a/src/google/protobuf/compiler/csharp/csharp_message.cc b/src/google/protobuf/compiler/csharp/csharp_message.cc index b5929bcd..aca68fb7 100644 --- a/src/google/protobuf/compiler/csharp/csharp_message.cc +++ b/src/google/protobuf/compiler/csharp/csharp_message.cc @@ -350,9 +350,8 @@ void MessageGenerator::GenerateFrameworkMethods(io::Printer* printer) { void MessageGenerator::GenerateMessageSerializationMethods(io::Printer* printer) { printer->Print( - "public void WriteTo(pb::ICodedOutputStream output) {\n"); + "public void WriteTo(pb::CodedOutputStream output) {\n"); printer->Indent(); - printer->Print("string[] fieldNames = _fieldNames;\n"); // Serialize all the fields for (int i = 0; i < fields_by_number().size(); i++) { @@ -423,21 +422,13 @@ void MessageGenerator::GenerateMergingMethods(io::Printer* printer) { } printer->Outdent(); printer->Print("}\n\n"); - printer->Print("public void MergeFrom(pb::ICodedInputStream input) {\n"); + printer->Print("public void MergeFrom(pb::CodedInputStream input) {\n"); printer->Indent(); printer->Print( "uint tag;\n" - "string fieldName;\n" - "while (input.ReadTag(out tag, out fieldName)) {\n"); + "while (input.ReadTag(out tag)) {\n" + " switch(tag) {\n"); printer->Indent(); - printer->Print( - "if (tag == 0 && fieldName != null) {\n" - " int fieldOrdinal = global::System.Array.BinarySearch(_fieldNames, fieldName, global::System.StringComparer.Ordinal);\n" - " if (fieldOrdinal >= 0) {\n" - " tag = _fieldTags[fieldOrdinal];\n" - " }\n" - "}\n" - "switch(tag) {\n"); printer->Indent(); printer->Print( "case 0:\n" // 0 signals EOF / limit reached diff --git a/src/google/protobuf/compiler/csharp/csharp_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_message_field.cc index 4b7ac88f..804a5ae2 100644 --- a/src/google/protobuf/compiler/csharp/csharp_message_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_message_field.cc @@ -87,6 +87,7 @@ void MessageFieldGenerator::GenerateParsingCode(io::Printer* printer) { "if ($has_not_property_check$) {\n" " $name$_ = new $type_name$();\n" "}\n" + // TODO(jonskeet): Do we really need merging behaviour like this? "input.ReadMessage($name$_);\n"); // No need to support TYPE_GROUP... } @@ -95,7 +96,7 @@ void MessageFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" - " output.WriteMessage($number$, fieldNames[$field_ordinal$], $property_name$);\n" + " output.WriteMessage($number$, $property_name$);\n" "}\n"); } diff --git a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc index f2b66a00..cb7e1b5a 100644 --- a/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_primitive_field.cc @@ -73,7 +73,6 @@ void PrimitiveFieldGenerator::GenerateMembers(io::Printer* printer) { printer->Print( variables_, " set { $name$_ = value; }\n"); - } else { printer->Print( variables_, @@ -93,14 +92,14 @@ void PrimitiveFieldGenerator::GenerateMergingCode(io::Printer* printer) { void PrimitiveFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, - "input.Read$capitalized_type_name$(ref $name$_);\n"); + "$name$_ = input.Read$capitalized_type_name$();\n"); } void PrimitiveFieldGenerator::GenerateSerializationCode(io::Printer* printer) { printer->Print( variables_, "if ($has_property_check$) {\n" - " output.Write$capitalized_type_name$($number$, fieldNames[$field_ordinal$], $property_name$);\n" + " output.Write$capitalized_type_name$($number$, $property_name$);\n" "}\n"); } @@ -169,13 +168,10 @@ void PrimitiveOneofFieldGenerator::WriteToString(io::Printer* printer) { void PrimitiveOneofFieldGenerator::GenerateParsingCode(io::Printer* printer) { // TODO(jonskeet): What if the value we read is the default value for the type? - printer->Print( - variables_, - "$type_name$ value = $default_value$;\n" - "if (input.Read$capitalized_type_name$(ref value)) {\n" - " $oneof_name$_ = value;\n" - " $oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n" - "}\n"); + printer->Print( + variables_, + "$oneof_name$_ = input.Read$capitalized_type_name$()\n;" + "$oneof_name$Case_ = $oneof_property_name$OneofCase.$property_name$;\n"); } } // namespace csharp diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc index 937d675a..15e92ab9 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc @@ -76,7 +76,7 @@ void RepeatedEnumFieldGenerator::GenerateMergingCode(io::Printer* printer) { void RepeatedEnumFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, - "input.ReadEnumArray<$type_name$>(tag, fieldName, $name$_);\n"); + "input.ReadEnumArray<$type_name$>(tag, $name$_);\n"); } void RepeatedEnumFieldGenerator::GenerateSerializationCode(io::Printer* printer) { @@ -84,7 +84,7 @@ void RepeatedEnumFieldGenerator::GenerateSerializationCode(io::Printer* printer) // The Write* call should make that cheap though - no need to generate it every time. printer->Print( variables_, - "output.Write$packed$EnumArray($number$, fieldNames[$field_ordinal$], $name$_);\n"); + "output.Write$packed$EnumArray($number$, $name$_);\n"); } void RepeatedEnumFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc index 963f841e..6228aa67 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc @@ -75,7 +75,7 @@ void RepeatedMessageFieldGenerator::GenerateMergingCode(io::Printer* printer) { void RepeatedMessageFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print( variables_, - "input.ReadMessageArray(tag, fieldName, $name$_, $type_name$.Parser);\n"); + "input.ReadMessageArray(tag, $name$_, $type_name$.Parser);\n"); } void RepeatedMessageFieldGenerator::GenerateSerializationCode(io::Printer* printer) { @@ -83,7 +83,7 @@ void RepeatedMessageFieldGenerator::GenerateSerializationCode(io::Printer* print // The Write* call should make that cheap though - no need to generate it every time. printer->Print( variables_, - "output.WriteMessageArray($number$, fieldNames[$field_ordinal$], $name$_);\n"); + "output.WriteMessageArray($number$, $name$_);\n"); } void RepeatedMessageFieldGenerator::GenerateSerializedSizeCode(io::Printer* printer) { diff --git a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc index 0a91c3c6..f62ea09d 100644 --- a/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc +++ b/src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc @@ -74,7 +74,7 @@ void RepeatedPrimitiveFieldGenerator::GenerateMergingCode(io::Printer* printer) void RepeatedPrimitiveFieldGenerator::GenerateParsingCode(io::Printer* printer) { printer->Print(variables_, - "input.Read$capitalized_type_name$Array(tag, fieldName, $name$_);\n"); + "input.Read$capitalized_type_name$Array(tag, $name$_);\n"); } void RepeatedPrimitiveFieldGenerator::GenerateSerializationCode( @@ -83,10 +83,10 @@ void RepeatedPrimitiveFieldGenerator::GenerateSerializationCode( // The Write* call should make that cheap though - no need to generate it every time. if (descriptor_->is_packed()) { printer->Print(variables_, - "output.WritePacked$capitalized_type_name$Array($number$, fieldNames[$field_ordinal$], $name$_);\n"); + "output.WritePacked$capitalized_type_name$Array($number$, $name$_);\n"); } else { printer->Print(variables_, - "output.Write$capitalized_type_name$Array($number$, fieldNames[$field_ordinal$], $name$_);\n"); + "output.Write$capitalized_type_name$Array($number$, $name$_);\n"); } } -- cgit v1.2.3