Commit 7de1aef8 authored by Jon Skeet's avatar Jon Skeet

Avoid creating UnknownFieldSets unless we really have to.

parent 75f4268e
...@@ -246,19 +246,27 @@ namespace Google.ProtocolBuffers.Examples.AddressBook { ...@@ -246,19 +246,27 @@ namespace Google.ProtocolBuffers.Examples.AddressBook {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
case 10: { case 10: {
...@@ -268,6 +276,9 @@ namespace Google.ProtocolBuffers.Examples.AddressBook { ...@@ -268,6 +276,9 @@ namespace Google.ProtocolBuffers.Examples.AddressBook {
case 16: { case 16: {
int rawValue = input.ReadEnum(); int rawValue = input.ReadEnum();
if (!global::System.Enum.IsDefined(typeof(global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType), rawValue)) { if (!global::System.Enum.IsDefined(typeof(global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType), rawValue)) {
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
unknownFields.MergeVarintField(2, (ulong) rawValue); unknownFields.MergeVarintField(2, (ulong) rawValue);
} else { } else {
Type = (global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType) rawValue; Type = (global::Google.ProtocolBuffers.Examples.AddressBook.Person.Types.PhoneType) rawValue;
...@@ -510,19 +521,27 @@ namespace Google.ProtocolBuffers.Examples.AddressBook { ...@@ -510,19 +521,27 @@ namespace Google.ProtocolBuffers.Examples.AddressBook {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
case 10: { case 10: {
...@@ -799,19 +818,27 @@ namespace Google.ProtocolBuffers.Examples.AddressBook { ...@@ -799,19 +818,27 @@ namespace Google.ProtocolBuffers.Examples.AddressBook {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
case 10: { case 10: {
......
...@@ -54,6 +54,9 @@ namespace Google.ProtocolBuffers.ProtoGen { ...@@ -54,6 +54,9 @@ namespace Google.ProtocolBuffers.ProtoGen {
// TODO(jonskeet): Make a more efficient way of doing this // TODO(jonskeet): Make a more efficient way of doing this
writer.WriteLine("int rawValue = input.ReadEnum();"); writer.WriteLine("int rawValue = input.ReadEnum();");
writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName); writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName);
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) rawValue);", Number);
writer.WriteLine("} else {"); writer.WriteLine("} else {");
writer.WriteLine(" {0} = ({1}) rawValue;", PropertyName, TypeName); writer.WriteLine(" {0} = ({1}) rawValue;", PropertyName, TypeName);
......
...@@ -374,21 +374,29 @@ namespace Google.ProtocolBuffers.ProtoGen { ...@@ -374,21 +374,29 @@ namespace Google.ProtocolBuffers.ProtoGen {
writer.WriteLine(); writer.WriteLine();
writer.WriteLine("public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {"); writer.WriteLine("public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {");
writer.Indent(); writer.Indent();
writer.WriteLine("pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);"); writer.WriteLine("pb::UnknownFieldSet.Builder unknownFields = null;");
writer.WriteLine("while (true) {"); writer.WriteLine("while (true) {");
writer.Indent(); writer.Indent();
writer.WriteLine("uint tag = input.ReadTag();"); writer.WriteLine("uint tag = input.ReadTag();");
writer.WriteLine("switch (tag) {"); writer.WriteLine("switch (tag) {");
writer.Indent(); writer.Indent();
writer.WriteLine("case 0: {"); // 0 signals EOF / limit reached writer.WriteLine("case 0: {"); // 0 signals EOF / limit reached
writer.WriteLine(" if (unknownFields != null) {");
writer.WriteLine(" this.UnknownFields = unknownFields.Build();"); writer.WriteLine(" this.UnknownFields = unknownFields.Build();");
writer.WriteLine(" }");
writer.WriteLine(" return this;"); writer.WriteLine(" return this;");
writer.WriteLine("}"); writer.WriteLine("}");
writer.WriteLine("default: {"); writer.WriteLine("default: {");
writer.WriteLine(" if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) {"); writer.WriteLine(" if (pb::WireFormat.IsEndGroupTag(tag)) {");
writer.WriteLine(" if (unknownFields != null) {");
writer.WriteLine(" this.UnknownFields = unknownFields.Build();"); writer.WriteLine(" this.UnknownFields = unknownFields.Build();");
writer.WriteLine(" }");
writer.WriteLine(" return this;"); // it's an endgroup tag writer.WriteLine(" return this;"); // it's an endgroup tag
writer.WriteLine(" }"); writer.WriteLine(" }");
writer.WriteLine(" if (unknownFields == null) {"); // First unknown field - create builder now
writer.WriteLine(" unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);");
writer.WriteLine(" }");
writer.WriteLine(" ParseUnknownField(input, unknownFields, extensionRegistry, tag);");
writer.WriteLine(" break;"); writer.WriteLine(" break;");
writer.WriteLine("}"); writer.WriteLine("}");
foreach (FieldDescriptor field in sortedFields) { foreach (FieldDescriptor field in sortedFields) {
......
...@@ -79,6 +79,9 @@ namespace Google.ProtocolBuffers.ProtoGen { ...@@ -79,6 +79,9 @@ namespace Google.ProtocolBuffers.ProtoGen {
// TODO(jonskeet): Make a more efficient way of doing this // TODO(jonskeet): Make a more efficient way of doing this
writer.WriteLine("int rawValue = input.ReadEnum();"); writer.WriteLine("int rawValue = input.ReadEnum();");
writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName); writer.WriteLine("if (!global::System.Enum.IsDefined(typeof({0}), rawValue)) {{", TypeName);
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) rawValue);", Number);
writer.WriteLine("} else {"); writer.WriteLine("} else {");
writer.WriteLine(" Add{0}(({1}) rawValue);", PropertyName, TypeName); writer.WriteLine(" Add{0}(({1}) rawValue);", PropertyName, TypeName);
......
...@@ -214,19 +214,27 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -214,19 +214,27 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
case 10: { case 10: {
......
...@@ -193,19 +193,27 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -193,19 +193,27 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
case 8: { case 8: {
......
...@@ -205,19 +205,27 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -205,19 +205,27 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
} }
...@@ -376,19 +384,27 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -376,19 +384,27 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
case 10: { case 10: {
...@@ -594,19 +610,27 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -594,19 +610,27 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
case 120: { case 120: {
...@@ -789,19 +813,27 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -789,19 +813,27 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
case 202: { case 202: {
...@@ -1027,19 +1059,27 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -1027,19 +1059,27 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
case 16: { case 16: {
...@@ -1227,19 +1267,27 @@ namespace Google.ProtocolBuffers.TestProtos { ...@@ -1227,19 +1267,27 @@ namespace Google.ProtocolBuffers.TestProtos {
} }
public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) { public override Builder MergeFrom(pb::CodedInputStream input, pb::ExtensionRegistry extensionRegistry) {
pb::UnknownFieldSet.Builder unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields); pb::UnknownFieldSet.Builder unknownFields = null;
while (true) { while (true) {
uint tag = input.ReadTag(); uint tag = input.ReadTag();
switch (tag) { switch (tag) {
case 0: { case 0: {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
default: { default: {
if (!ParseUnknownField(input, unknownFields, extensionRegistry, tag)) { if (pb::WireFormat.IsEndGroupTag(tag)) {
if (unknownFields != null) {
this.UnknownFields = unknownFields.Build(); this.UnknownFields = unknownFields.Build();
}
return this; return this;
} }
if (unknownFields == null) {
unknownFields = pb::UnknownFieldSet.CreateBuilder(this.UnknownFields);
}
ParseUnknownField(input, unknownFields, extensionRegistry, tag);
break; break;
} }
case 11: { case 11: {
......
...@@ -158,10 +158,12 @@ namespace Google.ProtocolBuffers { ...@@ -158,10 +158,12 @@ namespace Google.ProtocolBuffers {
} }
public override TBuilder MergeUnknownFields(UnknownFieldSet unknownFields) { public override TBuilder MergeUnknownFields(UnknownFieldSet unknownFields) {
if (unknownFields != UnknownFieldSet.DefaultInstance) {
TMessage result = MessageBeingBuilt; TMessage result = MessageBeingBuilt;
result.SetUnknownFields(UnknownFieldSet.CreateBuilder(result.UnknownFields) result.SetUnknownFields(UnknownFieldSet.CreateBuilder(result.UnknownFields)
.MergeFrom(unknownFields) .MergeFrom(unknownFields)
.Build()); .Build());
}
return ThisBuilder; return ThisBuilder;
} }
......
...@@ -91,6 +91,10 @@ namespace Google.ProtocolBuffers { ...@@ -91,6 +91,10 @@ namespace Google.ProtocolBuffers {
return (WireType) (tag & TagTypeMask); return (WireType) (tag & TagTypeMask);
} }
public static bool IsEndGroupTag(uint tag) {
return (WireType)(tag & TagTypeMask) == WireType.EndGroup;
}
/// <summary> /// <summary>
/// Given a tag value, determines the field number (the upper 29 bits). /// Given a tag value, determines the field number (the upper 29 bits).
/// </summary> /// </summary>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment