aboutsummaryrefslogtreecommitdiff
path: root/csharp/ProtocolBuffers
diff options
context:
space:
mode:
authorJon Skeet <skeet@pobox.com>2008-08-14 20:35:18 +0100
committerJon Skeet <skeet@pobox.com>2008-08-14 20:35:18 +0100
commit00b0af0890e5425bd4414ca6f71bbe83d53f9448 (patch)
tree3610effc005b2385846fe2bebe7ed9ee2df9d231 /csharp/ProtocolBuffers
parent4f435a506e95cc97397e72d8844a107562056fa1 (diff)
downloadprotobuf-00b0af0890e5425bd4414ca6f71bbe83d53f9448.tar.gz
protobuf-00b0af0890e5425bd4414ca6f71bbe83d53f9448.tar.bz2
protobuf-00b0af0890e5425bd4414ca6f71bbe83d53f9448.zip
Fix default instance behaviour for repeated types
Diffstat (limited to 'csharp/ProtocolBuffers')
-rw-r--r--csharp/ProtocolBuffers/Descriptors/FieldDescriptor.cs8
-rw-r--r--csharp/ProtocolBuffers/FieldSet.cs27
2 files changed, 18 insertions, 17 deletions
diff --git a/csharp/ProtocolBuffers/Descriptors/FieldDescriptor.cs b/csharp/ProtocolBuffers/Descriptors/FieldDescriptor.cs
index 650d9973..38e6adfa 100644
--- a/csharp/ProtocolBuffers/Descriptors/FieldDescriptor.cs
+++ b/csharp/ProtocolBuffers/Descriptors/FieldDescriptor.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Reflection;
using Google.ProtocolBuffers.Collections;
using Google.ProtocolBuffers.DescriptorProtos;
+using System.Collections.ObjectModel;
namespace Google.ProtocolBuffers.Descriptors {
public class FieldDescriptor : IndexedDescriptorBase<FieldDescriptorProto, FieldOptions>, IComparable<FieldDescriptor> {
@@ -124,8 +125,8 @@ namespace Google.ProtocolBuffers.Descriptors {
/// The field's default value. Valid for all types except messages
/// and groups. For all other types, the object returned is of the
/// same class that would be returned by IMessage[this].
- /// For repeated fields this will always be an empty list. For message fields it will
- /// always be null. For singular values, it will depend on the descriptor.
+ /// For repeated fields this will always be an empty immutable list compatible with IList[object].
+ /// For message fields it will always be null. For singular values, it will depend on the descriptor.
/// </value>
public object DefaultValue {
get {
@@ -383,8 +384,7 @@ namespace Google.ProtocolBuffers.Descriptors {
} else {
// Determine the default default for this field.
if (IsRepeated) {
- // FIXME(jonskeet): Find out the correct list type and use that instead.
- defaultValue = new List<object>();
+ defaultValue = Lists<object>.Empty;
} else {
switch (MappedType) {
case MappedType.Enum:
diff --git a/csharp/ProtocolBuffers/FieldSet.cs b/csharp/ProtocolBuffers/FieldSet.cs
index 40b8ae1c..10330762 100644
--- a/csharp/ProtocolBuffers/FieldSet.cs
+++ b/csharp/ProtocolBuffers/FieldSet.cs
@@ -17,6 +17,8 @@ namespace Google.ProtocolBuffers {
/// FieldSet class, FieldSet just has a MakeImmutable() method. This is safe so long as
/// all callers are careful not to let a mutable FieldSet escape into the open. This would
/// be impossible to guarantee if this were a public class, of course.
+ ///
+ /// All repeated fields are stored as IList[object] even
/// </summary>
internal class FieldSet {
@@ -131,7 +133,7 @@ namespace Google.ProtocolBuffers {
int fieldNumber = WireFormat.GetTagFieldNumber(tag);
FieldDescriptor field;
- IMessage defaultInstance = null;
+ IMessage defaultFieldInstance = null;
if (type.IsExtensionNumber(fieldNumber)) {
ExtensionInfo extension = extensionRegistry[type, fieldNumber];
@@ -139,7 +141,7 @@ namespace Google.ProtocolBuffers {
field = null;
} else {
field = extension.Descriptor;
- defaultInstance = extension.DefaultInstance;
+ defaultFieldInstance = extension.DefaultInstance;
}
} else {
field = type.FindFieldByNumber(fieldNumber);
@@ -155,8 +157,8 @@ namespace Google.ProtocolBuffers {
case FieldType.Group:
case FieldType.Message: {
IBuilder subBuilder;
- if (defaultInstance != null) {
- subBuilder = defaultInstance.CreateBuilderForType();
+ if (defaultFieldInstance != null) {
+ subBuilder = defaultFieldInstance.CreateBuilderForType();
} else {
subBuilder = builder.CreateBuilderForField(field);
}
@@ -308,7 +310,8 @@ namespace Google.ProtocolBuffers {
/// <list>
/// <item>For singular message values, null is returned.</item>
/// <item>For singular non-message values, the default value of the field is returned.</item>
- /// <item>For repeated values, an empty immutable list is returned.</item>
+ /// <item>For repeated values, an empty immutable list is returned. This will be compatible
+ /// with IList[object], regardless of the type of the repeated item.</item>
/// </list>
/// This method returns null if the field is a singular message type
/// and is not set; in this case it is up to the caller to fetch the
@@ -361,7 +364,7 @@ namespace Google.ProtocolBuffers {
throw new ArgumentException("Indexer specifying field and index can only be called on repeated fields.");
}
- return ((List<object>)this[field])[index];
+ return ((IList<object>) this[field])[index];
}
set {
if (!field.IsRepeated) {
@@ -372,15 +375,13 @@ namespace Google.ProtocolBuffers {
if (!fields.TryGetValue(field, out list)) {
throw new ArgumentOutOfRangeException();
}
- ((List<object>) list)[index] = value;
+ ((IList<object>) list)[index] = value;
}
}
/// <summary>
/// See <see cref="IBuilder.AddRepeatedField" />
/// </summary>
- /// <param name="field"></param>
- /// <param name="value"></param>
internal void AddRepeatedField(FieldDescriptor field, object value) {
if (!field.IsRepeated) {
throw new ArgumentException("AddRepeatedField can only be called on repeated fields.");
@@ -391,7 +392,7 @@ namespace Google.ProtocolBuffers {
list = new List<object>();
fields[field] = list;
}
- ((List<object>) list).Add(value);
+ ((IList<object>) list).Add(value);
}
/// <summary>
@@ -454,7 +455,7 @@ namespace Google.ProtocolBuffers {
throw new ArgumentException("GetRepeatedFieldCount() can only be called on repeated fields.");
}
- return ((List<object>) this[field]).Count;
+ return ((IList<object>) this[field]).Count;
}
/// <summary>
@@ -480,8 +481,8 @@ namespace Google.ProtocolBuffers {
existingValue = new List<object>();
fields[field] = existingValue;
}
- List<object> list = (List<object>)existingValue;
- foreach (object otherValue in (IEnumerable)entry.Value) {
+ IList<object> list = (IList<object>) existingValue;
+ foreach (object otherValue in (IEnumerable) entry.Value) {
list.Add(otherValue);
}
} else if (field.MappedType == MappedType.Message && existingValue != null) {