aboutsummaryrefslogtreecommitdiff
path: root/src/google
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2015-06-12 09:53:12 +0100
committerJon Skeet <skeet@pobox.com>2015-06-12 09:53:12 +0100
commit96ddf01aed1a49d73a7fda50e28c431ffc977e5a (patch)
tree4f603245ff514486481f126ca8d81deeff572534 /src/google
parent39aaf21d5194fdc07c296847def8e7795279e041 (diff)
downloadprotobuf-96ddf01aed1a49d73a7fda50e28c431ffc977e5a.tar.gz
protobuf-96ddf01aed1a49d73a7fda50e28c431ffc977e5a.tar.bz2
protobuf-96ddf01aed1a49d73a7fda50e28c431ffc977e5a.zip
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.
Diffstat (limited to 'src/google')
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_enum_field.cc16
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_message.cc17
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_message_field.cc3
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_primitive_field.cc16
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc4
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc4
-rw-r--r--src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc6
7 files changed, 24 insertions, 42 deletions
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");
}
}