Resurrect r84839
authorRobert Jordan <robertj@gmx.net>
Sat, 25 Aug 2007 06:25:01 +0000 (06:25 -0000)
committerRobert Jordan <robertj@gmx.net>
Sat, 25 Aug 2007 06:25:01 +0000 (06:25 -0000)
svn path=/trunk/mcs/; revision=84841

mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ChangeLog
mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/CodeGenerator.cs
mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectReader.cs
mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs
mcs/class/corlib/System/ChangeLog
mcs/class/corlib/System/DateTime.cs

index 3bd2692af8a0aa8fff669294e1a71020127d5046..511db79f9b52128587b98a6d6bcd2a395072fa00 100644 (file)
@@ -1,3 +1,8 @@
+2007-08-25  Robert Jordan  <robertj@gmx.net>
+
+       * ObjectReader.cs, ObjectWriter.cs, CodeGenerator.cs:
+       Use DateTime.From/ToBinary. Fixes #82400.
+
 2007-08-25  Alan McGovern  <amcgovern@novell.com>
 
        * ObjectReader.cs, ObjectWriter.cs, CodeGenerator.cs:
index 92c956733d3e40e9ef40e4d53f7362f45beb445f..5afaab35b0be8b028fd771dfbb5e9af12a901b4f 100644 (file)
@@ -341,7 +341,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        break;
                                        
                                case TypeCode.DateTime: 
-                                       gen.EmitCall (OpCodes.Call, typeof(DateTime).GetProperty("Ticks").GetGetMethod(), null);
+                                       gen.EmitCall (OpCodes.Call, typeof(DateTime).GetMethod("ToBinary", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance), null);
                                        EmitWrite (gen, typeof(long));
                                        break;
                                        
index cacefd448b8500fb6d354c75a7931dc786455b3a..7dff79fe92d4af45f70f1834c5b7cf4f1f1df505 100644 (file)
@@ -399,15 +399,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                case TypeCode.DateTime: {
                                        DateTime[] arr = new DateTime [length];
                                        for (int n = 0; n < length; n++) {
-                                               ulong nr = reader.ReadUInt64 ();
-                                               const ulong mask = (1ul << 62) - 1;
-                                               long ticks = (long) (nr & mask);
-#if NET_2_0
-                                               DateTimeKind kind = (DateTimeKind) (nr >> 62);
-                                               arr [n] = new DateTime (ticks, kind);
-#else
-                                               arr [n] = new DateTime (ticks);
-#endif
+                                               arr [n] = DateTime.FromBinary (reader.ReadInt64 ());
                                        }
                                        val = arr;
                                        break;
@@ -883,7 +875,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        return reader.ReadChar();
 
                                case TypeCode.DateTime: 
-                                       return new DateTime (reader.ReadInt64());
+                                       return DateTime.FromBinary (reader.ReadInt64());
 
                                case TypeCode.Decimal:
                                        return Decimal.Parse (reader.ReadString(), CultureInfo.InvariantCulture);
index d1450e3c364cbaa437fc09f2930100a11ef1a806..d2abb2ca65d5f5430670cc2a0b1ab473e8cd9fb2 100644 (file)
@@ -559,13 +559,8 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        break;
 
                                case TypeCode.DateTime: 
-                                       foreach (DateTime item in (DateTime[]) array) {
-                                               ulong val = (ulong) item.Ticks;
-#if NET_2_0
-                                               val |= ((ulong) item.Kind) << 62;
-#endif
-                                               writer.Write (val);
-                                       }
+                                       foreach (DateTime item in (DateTime[]) array)
+                                               writer.Write (item.ToBinary ());
                                        break;
 
                                case TypeCode.Decimal:
@@ -849,7 +844,7 @@ namespace System.Runtime.Serialization.Formatters.Binary
                                        break;
 
                                case TypeCode.DateTime: 
-                                       writer.Write ( ((DateTime)value).Ticks);
+                                       writer.Write ( ((DateTime)value).ToBinary ());
                                        break;
 
                                case TypeCode.Decimal:
index 8057b377fd105b8b248bed81a9fc67effb33df55..8d58893a99d2f7929877a89e0ac98948d73c7af4 100644 (file)
@@ -1,3 +1,7 @@
+2007-08-25  Robert Jordan  <robertj@gmx.net>
+
+       * DateTime.cs: Implement internal To/FromBinary for the 1.1 profile.
+
 2007-08-25  Alan McGovern  <amcgovern@novell.com>
 
        * DateTime.cs: Reverted DateTime changes.
index 64af96c27daa788dfbe0600a9c49d0940f1bc42e..df75e38335ad354c9fa0b9b1a73b146224457692 100644 (file)
@@ -698,7 +698,7 @@ namespace System
                        case 0:
                                return new DateTime (dateData, DateTimeKind.Unspecified);
                        default:
-                               return new DateTime (((dateData << 2) >> 2), DateTimeKind.Local);
+                               return new DateTime (dateData & 0x3fffffffffffffff, DateTimeKind.Local);
                        }
                }
 
@@ -706,6 +706,18 @@ namespace System
                {
                        return new DateTime (value.Ticks, kind);
                }
+
+#else
+
+               internal long ToBinary ()
+               {
+                       return Ticks;
+               }
+
+               internal static DateTime FromBinary (long dateData)
+               {
+                       return new DateTime (dateData & 0x3fffffffffffffff);
+               }
 #endif
 
                public static int DaysInMonth (int year, int month)