aboutsummaryrefslogtreecommitdiff
path: root/src/ProtoGen
diff options
context:
space:
mode:
authorcsharptest <roger@csharptest.net>2011-06-03 21:35:02 -0500
committerrogerk <devnull@localhost>2011-06-03 21:35:02 -0500
commitd2af9e923f4f2d7f7c56a2e74d5a26536aae0369 (patch)
tree786a89b7f356bf8e4d897453d6fe45dab80d2dea /src/ProtoGen
parent9928441649bde7a5e3bb84808821f1a5bef0bba6 (diff)
downloadprotobuf-d2af9e923f4f2d7f7c56a2e74d5a26536aae0369.tar.gz
protobuf-d2af9e923f4f2d7f7c56a2e74d5a26536aae0369.tar.bz2
protobuf-d2af9e923f4f2d7f7c56a2e74d5a26536aae0369.zip
Refactoring of CodedInputStream.Read??? to use boolean return with out param.
Diffstat (limited to 'src/ProtoGen')
-rw-r--r--src/ProtoGen/EnumFieldGenerator.cs25
-rw-r--r--src/ProtoGen/MessageGenerator.cs2
-rw-r--r--src/ProtoGen/PrimitiveFieldGenerator.cs2
-rw-r--r--src/ProtoGen/RepeatedEnumFieldGenerator.cs62
-rw-r--r--src/ProtoGen/RepeatedMessageFieldGenerator.cs23
-rw-r--r--src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs27
6 files changed, 86 insertions, 55 deletions
diff --git a/src/ProtoGen/EnumFieldGenerator.cs b/src/ProtoGen/EnumFieldGenerator.cs
index 651d7db3..3e9e071a 100644
--- a/src/ProtoGen/EnumFieldGenerator.cs
+++ b/src/ProtoGen/EnumFieldGenerator.cs
@@ -95,19 +95,32 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateParsingCode(TextGenerator writer)
{
- // TODO(jonskeet): Make a more efficient way of doing this
- writer.WriteLine("int rawValue = input.ReadEnum();");
- writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName);
+ writer.WriteLine("object unknown;");
+ writer.WriteLine("if(input.ReadEnum(ref result.{0}_, out unknown)) {{", Name);
+ writer.WriteLine(" result.has{0} = true;", PropertyName);
+ writer.WriteLine("} else if(unknown is int) {");
if (!UseLiteRuntime)
{
writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now
writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
writer.WriteLine(" }");
- writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong) rawValue);", Number);
+ writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong)(int)unknown);", Number);
}
- writer.WriteLine("} else {");
- writer.WriteLine(" {0} = ({1}) rawValue;", PropertyName, TypeName);
writer.WriteLine("}");
+
+ // TO DO(jonskeet): Make a more efficient way of doing this
+ //writer.WriteLine("int rawValue = input.ReadEnum();");
+ //writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName);
+ //if (!UseLiteRuntime)
+ //{
+ // writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now
+ // writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
+ // writer.WriteLine(" }");
+ // writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong) rawValue);", Number);
+ //}
+ //writer.WriteLine("} else {");
+ //writer.WriteLine(" {0} = ({1}) rawValue;", PropertyName, TypeName);
+ //writer.WriteLine("}");
}
public void GenerateSerializationCode(TextGenerator writer)
diff --git a/src/ProtoGen/MessageGenerator.cs b/src/ProtoGen/MessageGenerator.cs
index 94008fb0..228dcf88 100644
--- a/src/ProtoGen/MessageGenerator.cs
+++ b/src/ProtoGen/MessageGenerator.cs
@@ -647,7 +647,7 @@ namespace Google.ProtocolBuffers.ProtoGen
writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
writer.WriteLine(" }");
}
- writer.WriteLine(" ParseUnknownField(input, {0}extensionRegistry, tag);",
+ writer.WriteLine(" ParseUnknownField(input, {0}extensionRegistry, tag, field_name);",
UseLiteRuntime ? "" : "unknownFields, ");
writer.WriteLine(" break;");
writer.WriteLine("}");
diff --git a/src/ProtoGen/PrimitiveFieldGenerator.cs b/src/ProtoGen/PrimitiveFieldGenerator.cs
index ad0ab8d4..2e767b91 100644
--- a/src/ProtoGen/PrimitiveFieldGenerator.cs
+++ b/src/ProtoGen/PrimitiveFieldGenerator.cs
@@ -97,7 +97,7 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateParsingCode(TextGenerator writer)
{
- writer.WriteLine("{0} = input.Read{1}();", PropertyName, CapitalizedTypeName);
+ writer.WriteLine("result.has{0} |= input.Read{1}(ref result.{2}_);", PropertyName, CapitalizedTypeName, Name);
}
public void GenerateSerializationCode(TextGenerator writer)
diff --git a/src/ProtoGen/RepeatedEnumFieldGenerator.cs b/src/ProtoGen/RepeatedEnumFieldGenerator.cs
index e3fdd657..27aabf58 100644
--- a/src/ProtoGen/RepeatedEnumFieldGenerator.cs
+++ b/src/ProtoGen/RepeatedEnumFieldGenerator.cs
@@ -112,36 +112,50 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateParsingCode(TextGenerator writer)
{
- // If packed, set up the while loop
- if (Descriptor.IsPacked)
- {
- writer.WriteLine("int length = input.ReadInt32();");
- writer.WriteLine("int oldLimit = input.PushLimit(length);");
- writer.WriteLine("while (!input.ReachedLimit) {");
- writer.Indent();
- }
-
- // Read and store the enum
- // TODO(jonskeet): Make a more efficient way of doing this
- writer.WriteLine("int rawValue = input.ReadEnum();");
- writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName);
+ writer.WriteLine("scg::ICollection<object> unknownItems;");
+ writer.WriteLine("input.ReadEnumArray<{0}>(tag, field_name, result.{1}_, out unknownItems);", TypeName, Name);
if (!UseLiteRuntime)
{
- writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now
+ writer.WriteLine("if (unknownItems != null) {");
+ writer.WriteLine(" if (unknownFields == null) {");
writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
writer.WriteLine(" }");
- writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong) rawValue);", Number);
- }
- writer.WriteLine("} else {");
- writer.WriteLine(" Add{0}(({1}) rawValue);", PropertyName, TypeName);
- writer.WriteLine("}");
-
- if (Descriptor.IsPacked)
- {
- writer.Outdent();
+ writer.WriteLine(" foreach (object rawValue in unknownItems)");
+ writer.WriteLine(" if (rawValue is int)");
+ writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong)(int)rawValue);", Number);
writer.WriteLine("}");
- writer.WriteLine("input.PopLimit(oldLimit);");
}
+
+ //// If packed, set up the while loop
+ //if (Descriptor.IsPacked)
+ //{
+ // writer.WriteLine("int length = input.ReadInt32();");
+ // writer.WriteLine("int oldLimit = input.PushLimit(length);");
+ // writer.WriteLine("while (!input.ReachedLimit) {");
+ // writer.Indent();
+ //}
+
+ //// Read and store the enum
+ //// TO DO(jonskeet): Make a more efficient way of doing this
+ //writer.WriteLine("int rawValue = input.ReadEnum();");
+ //writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName);
+ //if (!UseLiteRuntime)
+ //{
+ // writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now
+ // writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
+ // writer.WriteLine(" }");
+ // writer.WriteLine(" unknownFields.MergeVarintField({0}, (ulong) rawValue);", Number);
+ //}
+ //writer.WriteLine("} else {");
+ //writer.WriteLine(" Add{0}(({1}) rawValue);", PropertyName, TypeName);
+ //writer.WriteLine("}");
+
+ //if (Descriptor.IsPacked)
+ //{
+ // writer.Outdent();
+ // writer.WriteLine("}");
+ // writer.WriteLine("input.PopLimit(oldLimit);");
+ //}
}
public void GenerateSerializationCode(TextGenerator writer)
diff --git a/src/ProtoGen/RepeatedMessageFieldGenerator.cs b/src/ProtoGen/RepeatedMessageFieldGenerator.cs
index 84e92e06..23f06a18 100644
--- a/src/ProtoGen/RepeatedMessageFieldGenerator.cs
+++ b/src/ProtoGen/RepeatedMessageFieldGenerator.cs
@@ -34,6 +34,7 @@
#endregion
+using System;
using Google.ProtocolBuffers.Descriptors;
namespace Google.ProtocolBuffers.ProtoGen
@@ -121,16 +122,18 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateParsingCode(TextGenerator writer)
{
- writer.WriteLine("{0}.Builder subBuilder = {0}.CreateBuilder();", TypeName);
- if (Descriptor.FieldType == FieldType.Group)
- {
- writer.WriteLine("input.ReadGroup({0}, subBuilder, extensionRegistry);", Number);
- }
- else
- {
- writer.WriteLine("input.ReadMessage(subBuilder, extensionRegistry);");
- }
- writer.WriteLine("Add{0}(subBuilder.BuildPartial());", PropertyName);
+ writer.WriteLine("input.Read{0}Array(tag, field_name, result.{1}_, {2}.DefaultInstance, extensionRegistry);", MessageOrGroup, Name, TypeName);
+
+ //writer.WriteLine("{0}.Builder subBuilder = {0}.CreateBuilder();", TypeName);
+ //if (Descriptor.FieldType == FieldType.Group)
+ //{
+ // writer.WriteLine("input.ReadGroup({0}, subBuilder, extensionRegistry);", Number);
+ //}
+ //else
+ //{
+ // writer.WriteLine("input.ReadMessage(subBuilder, extensionRegistry);");
+ //}
+ //writer.WriteLine("Add{0}(subBuilder.BuildPartial());", PropertyName);
}
public void GenerateSerializationCode(TextGenerator writer)
diff --git a/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs b/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
index 64b95e1a..d6536281 100644
--- a/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
+++ b/src/ProtoGen/RepeatedPrimitiveFieldGenerator.cs
@@ -121,19 +121,20 @@ namespace Google.ProtocolBuffers.ProtoGen
public void GenerateParsingCode(TextGenerator writer)
{
- if (Descriptor.IsPacked)
- {
- writer.WriteLine("int length = input.ReadInt32();");
- writer.WriteLine("int limit = input.PushLimit(length);");
- writer.WriteLine("while (!input.ReachedLimit) {");
- writer.WriteLine(" Add{0}(input.Read{1}());", PropertyName, CapitalizedTypeName);
- writer.WriteLine("}");
- writer.WriteLine("input.PopLimit(limit);");
- }
- else
- {
- writer.WriteLine("Add{0}(input.Read{1}());", PropertyName, CapitalizedTypeName);
- }
+ writer.WriteLine("input.ReadPrimitiveArray(pbd::FieldType.{1}, tag, field_name, result.{0}_);", Name, Descriptor.FieldType);
+ //if (Descriptor.IsPacked)
+ //{
+ // writer.WriteLine("int length = input.ReadInt32();");
+ // writer.WriteLine("int limit = input.PushLimit(length);");
+ // writer.WriteLine("while (!input.ReachedLimit) {");
+ // writer.WriteLine(" Add{0}(input.Read{1}());", PropertyName, CapitalizedTypeName);
+ // writer.WriteLine("}");
+ // writer.WriteLine("input.PopLimit(limit);");
+ //}
+ //else
+ //{
+ // writer.WriteLine("Add{0}(input.Read{1}());", PropertyName, CapitalizedTypeName);
+ //}
}
public void GenerateSerializationCode(TextGenerator writer)