From 60fb63e3704091d0d681181dbab2055f6878f2ea Mon Sep 17 00:00:00 2001 From: Jon Skeet Date: Sat, 20 Jun 2009 20:46:28 +0100 Subject: Initial Silverlight compatibility work --- src/ProtocolBuffers/ByteString.cs | 2 +- src/ProtocolBuffers/CodedInputStream.cs | 4 ++-- src/ProtocolBuffers/FieldSet.cs | 6 +++--- src/ProtocolBuffers/GeneratedMessage.cs | 4 ++-- src/ProtocolBuffers/NameHelpers.cs | 5 +++-- src/ProtocolBuffers/TextFormat.cs | 2 +- src/ProtocolBuffers/TextTokenizer.cs | 14 ++++++++++---- src/ProtocolBuffers/UnknownFieldSet.cs | 4 ++-- 8 files changed, 24 insertions(+), 17 deletions(-) (limited to 'src/ProtocolBuffers') diff --git a/src/ProtocolBuffers/ByteString.cs b/src/ProtocolBuffers/ByteString.cs index 0d67a539..0d027b78 100644 --- a/src/ProtocolBuffers/ByteString.cs +++ b/src/ProtocolBuffers/ByteString.cs @@ -116,7 +116,7 @@ namespace Google.ProtocolBuffers { } public string ToString(Encoding encoding) { - return encoding.GetString(bytes); + return encoding.GetString(bytes, 0, bytes.Length); } public string ToStringUtf8() { diff --git a/src/ProtocolBuffers/CodedInputStream.cs b/src/ProtocolBuffers/CodedInputStream.cs index 132773c9..313bddf3 100644 --- a/src/ProtocolBuffers/CodedInputStream.cs +++ b/src/ProtocolBuffers/CodedInputStream.cs @@ -235,8 +235,8 @@ namespace Google.ProtocolBuffers { bufferPos += size; return result; } - // Slow path: Build a byte array first then copy it. - return Encoding.UTF8.GetString(ReadRawBytes(size)); + // Slow path: Build a byte array first then copy it. + return Encoding.UTF8.GetString(ReadRawBytes(size), 0, size); } /// diff --git a/src/ProtocolBuffers/FieldSet.cs b/src/ProtocolBuffers/FieldSet.cs index 39b2a696..f084afa2 100644 --- a/src/ProtocolBuffers/FieldSet.cs +++ b/src/ProtocolBuffers/FieldSet.cs @@ -62,8 +62,8 @@ namespace Google.ProtocolBuffers { } public static FieldSet CreateInstance() { - // Use SortedList to keep fields in the canonical order - return new FieldSet(new SortedList()); + // Use SortedDictionary to keep fields in the canonical order + return new FieldSet(new SortedDictionary()); } /// @@ -82,7 +82,7 @@ namespace Google.ProtocolBuffers { } if (hasRepeats) { - var tmp = new SortedList(); + var tmp = new SortedDictionary(); foreach (KeyValuePair entry in fields) { IList list = entry.Value as IList; tmp[entry.Key] = list == null ? entry.Value : Lists.AsReadOnly(list); diff --git a/src/ProtocolBuffers/GeneratedMessage.cs b/src/ProtocolBuffers/GeneratedMessage.cs index d8747599..055bc722 100644 --- a/src/ProtocolBuffers/GeneratedMessage.cs +++ b/src/ProtocolBuffers/GeneratedMessage.cs @@ -66,8 +66,8 @@ namespace Google.ProtocolBuffers { internal IDictionary GetMutableFieldMap() { - // Use a SortedList so we'll end up serializing fields in order - var ret = new SortedList(); + // Use a SortedDictionary so we'll end up serializing fields in order + var ret = new SortedDictionary(); MessageDescriptor descriptor = DescriptorForType; foreach (FieldDescriptor field in descriptor.Fields) { IFieldAccessor accessor = InternalFieldAccessors[field]; diff --git a/src/ProtocolBuffers/NameHelpers.cs b/src/ProtocolBuffers/NameHelpers.cs index 8b297f95..cf4931d0 100644 --- a/src/ProtocolBuffers/NameHelpers.cs +++ b/src/ProtocolBuffers/NameHelpers.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text; +using System.Globalization; namespace Google.ProtocolBuffers { /// @@ -31,7 +32,7 @@ namespace Google.ProtocolBuffers { char c = input[i]; if ('a' <= c && c <= 'z') { if (capitaliseNext) { - result.Append(char.ToUpperInvariant(c)); + result.Append(char.ToUpper(c, CultureInfo.InvariantCulture)); } else { result.Append(c); } @@ -40,7 +41,7 @@ namespace Google.ProtocolBuffers { if (i == 0 && !pascal) { // Force first letter to lower-case unless explicitly told to // capitalize it. - result.Append(char.ToLowerInvariant(c)); + result.Append(char.ToLower(c, CultureInfo.InvariantCulture)); } else { // Capital letters after the first are left as-is. result.Append(c); diff --git a/src/ProtocolBuffers/TextFormat.cs b/src/ProtocolBuffers/TextFormat.cs index fc8030f7..ba7b467e 100644 --- a/src/ProtocolBuffers/TextFormat.cs +++ b/src/ProtocolBuffers/TextFormat.cs @@ -537,7 +537,7 @@ namespace Google.ProtocolBuffers { if (field == null) { // Explicitly specify the invariant culture so that this code does not break when // executing in Turkey. - String lowerName = name.ToLowerInvariant(); + String lowerName = name.ToLower(CultureInfo.InvariantCulture); field = type.FindDescriptor(lowerName); // If the case-insensitive match worked but the field is NOT a group, // TODO(jonskeet): What? Java comment ends here! diff --git a/src/ProtocolBuffers/TextTokenizer.cs b/src/ProtocolBuffers/TextTokenizer.cs index 8d639990..d25a5874 100644 --- a/src/ProtocolBuffers/TextTokenizer.cs +++ b/src/ProtocolBuffers/TextTokenizer.cs @@ -69,9 +69,15 @@ namespace Google.ProtocolBuffers { /// private int previousColumn = 0; +#if SILVERLIGHT + private const RegexOptions CompiledRegexWhereAvailable = RegexOptions.None; +#else + private const RegexOptions CompiledRegexWhereAvailable = RegexOptions.Compiled; +#endif + // Note: atomic groups used to mimic possessive quantifiers in Java in both of these regexes private static readonly Regex WhitespaceAndCommentPattern = new Regex("\\G(?>(\\s|(#.*$))+)", - RegexOptions.Compiled | RegexOptions.Multiline); + CompiledRegexWhereAvailable | RegexOptions.Multiline); private static readonly Regex TokenPattern = new Regex( "\\G[a-zA-Z_](?>[0-9a-zA-Z_+-]*)|" + // an identifier "\\G[0-9+-](?>[0-9a-zA-Z_.+-]*)|" + // a number @@ -79,9 +85,9 @@ namespace Google.ProtocolBuffers { "\\G\'(?>([^\"\\\n\\\\]|\\\\.)*)(\'|\\\\?$)", // a single-quoted string RegexOptions.Compiled | RegexOptions.Multiline); - private static readonly Regex DoubleInfinity = new Regex("^-?inf(inity)?$", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static readonly Regex FloatInfinity = new Regex("^-?inf(inity)?f?$", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private static readonly Regex FloatNan = new Regex("^nanf?$", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex DoubleInfinity = new Regex("^-?inf(inity)?$", CompiledRegexWhereAvailable | RegexOptions.IgnoreCase); + private static readonly Regex FloatInfinity = new Regex("^-?inf(inity)?f?$", CompiledRegexWhereAvailable | RegexOptions.IgnoreCase); + private static readonly Regex FloatNan = new Regex("^nanf?$", CompiledRegexWhereAvailable | RegexOptions.IgnoreCase); /** Construct a tokenizer that parses tokens from the given text. */ public TextTokenizer(string text) { diff --git a/src/ProtocolBuffers/UnknownFieldSet.cs b/src/ProtocolBuffers/UnknownFieldSet.cs index 9de09709..f0655103 100644 --- a/src/ProtocolBuffers/UnknownFieldSet.cs +++ b/src/ProtocolBuffers/UnknownFieldSet.cs @@ -240,10 +240,10 @@ namespace Google.ProtocolBuffers { public sealed class Builder { /// - /// Mapping from number to field. Note that by using a SortedList we ensure + /// Mapping from number to field. Note that by using a SortedDictionary we ensure /// that the fields will be serialized in ascending order. /// - private IDictionary fields = new SortedList(); + private IDictionary fields = new SortedDictionary(); // Optimization: We keep around a builder for the last field that was // modified so that we can efficiently add to it multiple times in a -- cgit v1.2.3