edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C445173
File: Initializers.Generated.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C445173  (server)    5/20/2008 10:45 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;RubySHA
@@ -5560,6 +5560,15 @@
             #if !SILVERLIGHT
             Ruby.Builtins.RubyClass def6 = DefineClass("Digest::SHA1", typeof(Ruby.StandardLibrary.Digest.Digest.SHA1), def2, null, null, Ruby.Builtins.RubyModule.EmptyArray, null);
             #endif
+            #if !SILVERLIGHT
+            Ruby.Builtins.RubyClass def7 = DefineClass("Digest::SHA256", typeof(Ruby.StandardLibrary.Digest.Digest.SHA256), def2, null, null, Ruby.Builtins.RubyModule.EmptyArray, null);
+            #endif
+            #if !SILVERLIGHT
+            Ruby.Builtins.RubyClass def8 = DefineClass("Digest::SHA384", typeof(Ruby.StandardLibrary.Digest.Digest.SHA384), def2, null, null, Ruby.Builtins.RubyModule.EmptyArray, null);
+            #endif
+            #if !SILVERLIGHT
+            Ruby.Builtins.RubyClass def9 = DefineClass("Digest::SHA512", typeof(Ruby.StandardLibrary.Digest.Digest.SHA512), def2, null, null, Ruby.Builtins.RubyModule.EmptyArray, null);
+            #endif
             def1.SetConstant("Instance", def4);
             def1.SetConstant("Class", def3);
             def1.SetConstant("Base", def2);
@@ -5569,6 +5578,15 @@
             #if !SILVERLIGHT
             def1.SetConstant("SHA1", def6);
             #endif
+            #if !SILVERLIGHT
+            def1.SetConstant("SHA256", def7);
+            #endif
+            #if !SILVERLIGHT
+            def1.SetConstant("SHA384", def8);
+            #endif
+            #if !SILVERLIGHT
+            def1.SetConstant("SHA512", def9);
+            #endif
         }
         
         private void LoadDigest_Class(Ruby.Builtins.RubyModule/*!*/ module) {
@@ -5607,10 +5625,14 @@
             
             module.DefineLibraryMethod("digest", 0x11, new System.Delegate[] {
                 new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, Ruby.Builtins.RubyClass, Ruby.Builtins.MutableString, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Class.Digest),
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, Ruby.Builtins.RubyClass, System.Object, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Class.Digest),
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, Ruby.Builtins.RubyClass, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Class.Digest),
             });
             
             module.DefineLibraryMethod("hexdigest", 0x11, new System.Delegate[] {
                 new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, Ruby.Builtins.RubyClass, Ruby.Builtins.MutableString, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Class.HexDigest),
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, Ruby.Builtins.RubyClass, System.Object, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Class.HexDigest),
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, Ruby.Builtins.RubyClass, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Class.HexDigest),
             });
             
         }
@@ -5618,13 +5640,25 @@
         private void LoadDigest__Instance_Instance(Ruby.Builtins.RubyModule/*!*/ module) {
             
             module.DefineLibraryMethod("digest", 0x9, new System.Delegate[] {
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, System.Object, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Instance.Digest),
                 new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, System.Object, Ruby.Builtins.MutableString, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Instance.Digest),
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, System.Object, System.Object, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Instance.Digest),
             });
             
+            module.DefineLibraryMethod("digest!", 0x9, new System.Delegate[] {
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, System.Object, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Instance.DigestNew),
+            });
+            
             module.DefineLibraryMethod("hexdigest", 0x9, new System.Delegate[] {
-                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, Ruby.StandardLibrary.Digest.Digest.Base, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Instance.HexDigest),
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, System.Object, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Instance.HexDigest),
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, System.Object, Ruby.Builtins.MutableString, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Instance.HexDigest),
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, System.Object, System.Object, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Instance.HexDigest),
             });
             
+            module.DefineLibraryMethod("hexdigest!", 0x9, new System.Delegate[] {
+                new Microsoft.Scripting.Utils.Function<Microsoft.Scripting.Runtime.CodeContext, System.Object, Ruby.Builtins.MutableString>(Ruby.StandardLibrary.Digest.Digest.Instance.HexDigestNew),
+            });
+            
         }
         
     }
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Digest/Digest.cs;C443395
File: Digest.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Digest/Digest.cs;C443395  (server)    5/21/2008 6:40 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Digest/Digest.cs;RubySHA
@@ -14,6 +14,7 @@
  * ***************************************************************************/
 
 using System;
+using System.Runtime.InteropServices;
 using System.Security.Cryptography;
 
 using Microsoft.Scripting.Ast;
@@ -55,21 +56,40 @@
                 : base(System.Security.Cryptography.MD5.Create()) {
             }
         }
-#endif
 
-#if !SILVERLIGHT
         [RubyClass("SHA1", BuildConfig = "!SILVERLIGHT")]
         public class SHA1 : Base {
             public SHA1()
                 : base(System.Security.Cryptography.SHA1.Create()) {
             }
         }
+
+        [RubyClass("SHA256", BuildConfig = "!SILVERLIGHT")]
+        public class SHA256 : Base {
+            public SHA256()
+                : base(System.Security.Cryptography.SHA256.Create()) {
+            }
+        }
+
+        [RubyClass("SHA384", BuildConfig = "!SILVERLIGHT")]
+        public class SHA384 : Base {
+            public SHA384()
+                : base(System.Security.Cryptography.SHA384.Create()) {
+            }
+        }
+
+        [RubyClass("SHA512", BuildConfig = "!SILVERLIGHT")]
+        public class SHA512 : Base {
+            public SHA512()
+                : base(System.Security.Cryptography.SHA512.Create()) {
+            }
+        }
 #endif
 
         [RubyClass("Base")]
         public class Base : Class, IDuplicable {
             private readonly HashAlgorithm/*!*/ _algorithm;
-            private  MutableString/*!*/ _buffer;
+            private MutableString/*!*/ _buffer;
 
             protected Base(HashAlgorithm/*!*/ algorithm) {
                 Assert.NotNull(algorithm);
@@ -108,22 +128,42 @@
         public class Class {
 
             [RubyMethod("digest", RubyMethodAttributes.PublicSingleton)]
-            public static MutableString Digest(CodeContext/*!*/ context, RubyClass/*!*/ self, MutableString str) {
+            public static MutableString Digest(CodeContext/*!*/ context, RubyClass/*!*/ self, [NotNull]MutableString/*!*/ str) {
                 // TODO: new?
                 object obj = RubySites.Allocate(context, self);
                 // TODO: check obj
                 return DigestSite.Invoke(context, obj, str);
             }
 
+            [RubyMethod("digest", RubyMethodAttributes.PublicSingleton)]
+            public static MutableString Digest(CodeContext/*!*/ context, RubyClass/*!*/ self, object str) {
+                return Digest(context, self, Protocols.CastToString(context, str));
+            }
+
+            [RubyMethod("digest", RubyMethodAttributes.PublicSingleton)]
+            public static MutableString Digest(CodeContext/*!*/ context, RubyClass/*!*/ self) {
+                throw RubyExceptions.CreateArgumentError("no data given");
+            }
+
             [RubyMethod("hexdigest", RubyMethodAttributes.PublicSingleton)]
-            public static MutableString/*!*/ HexDigest(CodeContext/*!*/ context, RubyClass/*!*/ self, MutableString str) {
+            public static MutableString/*!*/ HexDigest(CodeContext/*!*/ context, RubyClass/*!*/ self, [NotNull]MutableString/*!*/ str) {
                 MutableString result = DigestSite.Invoke(context, self, str);
                 // TODO: check result != null
                 return HexEncode(result);
             }
 
-#region Helpers
+            [RubyMethod("hexdigest", RubyMethodAttributes.PublicSingleton)]
+            public static MutableString HexDigest(CodeContext/*!*/ context, RubyClass/*!*/ self, object str) {
+                return HexDigest(context, self, Protocols.CastToString(context, str));
+            }
 
+            [RubyMethod("hexdigest", RubyMethodAttributes.PublicSingleton)]
+            public static MutableString HexDigest(CodeContext/*!*/ context, RubyClass/*!*/ self) {
+                throw RubyExceptions.CreateArgumentError("no data given");
+            }
+
+            #region Helpers
+
             internal static MutableString/*!*/ Bytes2Hex(byte[]/*!*/ bytes) {
                 return MutableString.Create(System.BitConverter.ToString(bytes).Replace("-", "").ToLower());
             }
@@ -134,7 +174,7 @@
 
             #endregion
 
-#region DynamicSites
+            #region DynamicSites
 
             private static DynamicSite<object, MutableString, MutableString> DigestSite = DynamicSite<object, MutableString, MutableString>.Create(
                 RubySites.InstanceCallAction("digest", ArgumentKind.Simple)
@@ -145,9 +185,15 @@
 
         [RubyModule("Instance")]
         public class Instance {
+
             [RubyMethod("digest")]
-            public static MutableString Digest(CodeContext/*!*/ context, object self, MutableString str) {
-                Reset.Invoke(context, self);
+            public static MutableString Digest(CodeContext/*!*/ context, object self) {
+                object clone = RubyUtils.DeepCopy(context, self);
+                return Finish.Invoke(context, clone);
+            }
+
+            [RubyMethod("digest")]
+            public static MutableString Digest(CodeContext/*!*/ context, object self, [NotNull]MutableString/*!*/ str) {
                 Update.Invoke(context, self, str);
                 MutableString value = Finish.Invoke(context, self);
                 Reset.Invoke(context, self);
@@ -155,16 +201,40 @@
                 return value;
             }
 
+            [RubyMethod("digest")]
+            public static MutableString Digest(CodeContext/*!*/ context, object self, object str) {
+                return Digest(context, self, Protocols.CastToString(context, str));
+            }
+
+            [RubyMethod("digest!")]
+            public static MutableString DigestNew(CodeContext/*!*/ context, object self) {
+                MutableString value = Finish.Invoke(context, self);
+                Reset.Invoke(context, self);
+                return value;
+            }
+
             [RubyMethod("hexdigest")]
-            public static MutableString HexDigest(CodeContext/*!*/ context, Base self) {
-                object clone = Kernel.Clone(context, self);
-                MutableString str = Finish.Invoke(context, clone);
-                Reset.Invoke(context, clone);
-                return Class.HexEncode(str);
+            public static MutableString HexDigest(CodeContext/*!*/ context, object self) {
+                return Class.HexEncode(Digest(context, self));
             }
 
-#region DynamicSites
+            [RubyMethod("hexdigest")]
+            public static MutableString HexDigest(CodeContext/*!*/ context, object self, [NotNull]MutableString/*!*/ str) {
+                return Class.HexEncode(Digest(context, self, str));
+            }
 
+            [RubyMethod("hexdigest")]
+            public static MutableString HexDigest(CodeContext/*!*/ context, object self, object str) {
+                return Class.HexEncode(Digest(context, self, str));
+            }
+
+            [RubyMethod("hexdigest!")]
+            public static MutableString HexDigestNew(CodeContext/*!*/ context, object self) {
+                return Class.HexEncode(DigestNew(context, self));
+            }
+
+            #region DynamicSites
+
             private static DynamicSite<object, object> Reset = DynamicSite<object, object>.Create(
                 RubySites.InstanceCallAction("reset")
             );
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyUtils.cs;C443395
File: RubyUtils.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyUtils.cs;C443395  (server)    5/21/2008 9:25 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Runtime/RubyUtils.cs;RubySHA
@@ -169,6 +169,54 @@
             return true;
         }
 
+        public static object DeepCopy(CodeContext/*!*/ context, object obj) {
+            Dictionary<object, bool> infinite = RubyUtils.TryPushInfinite(obj);
+            if (infinite == null) {
+                return RubyExceptions.CreateArgumentError("unable to deep copy recursive structure");
+            }
+            try {
+                RubyExecutionContext ec = RubyUtils.GetExecutionContext(context);
+
+                if (RubyUtils.IsRubyValueType(obj)) {
+                    return obj;
+                }
+
+                object copy;
+
+                // TODO: special case class objects:
+                RubyClass classObject = obj as RubyClass;
+                if (classObject != null) {
+                    copy = classObject.Duplicate();
+                } else {
+                    copy = RubySites.Allocate(context, ec.GetClassOf(obj));
+                }
+
+                SymbolId[] names = ec.GetInstanceVariableNames(obj);
+                RubyInstanceData newVars = (names.Length > 0) ? ec.GetInstanceData(copy) : null;
+                foreach (SymbolId name in names) {
+                    object value;
+                    if (!ec.TryGetInstanceVariable(obj, name, out value)) {
+                        value = null;
+                    } else {
+                        value = DeepCopy(context, value);
+                    }
+                    newVars.SetInstanceVariable(name, value);
+                }
+
+                if (classObject == null) {
+                    // do any special copying needed for library types
+                    // TODO: we still need to implement copy semantics for .NET types in general
+                    IDuplicable duplicable = copy as IDuplicable;
+                    if (duplicable != null) {
+                        duplicable.InitializeFrom(obj);
+                    }
+                }
+                return copy;
+            } finally {
+                infinite.Remove(obj);
+            }
+        }
+
         public static int GetFixnumId(int number) {
             return number * 2 + 1;
         }
===================================================================
