edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C535757
File: Initializers.Generated.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;C535757  (server)    8/21/2008 9:17 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Initializers.Generated.cs;bugs-2
@@ -2993,10 +2993,6 @@
                 new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.MatchData, IronRuby.Builtins.RubyArray>(IronRuby.Builtins.MatchDataOps.ToArray),
             });
             
-            module.DefineLibraryMethod("to_s", 0x29, new System.Delegate[] {
-                new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.MatchData, IronRuby.Builtins.MutableString>(IronRuby.Builtins.MatchDataOps.ToString),
-            });
-            
             module.DefineLibraryMethod("values_at", 0x29, new System.Delegate[] {
                 new System.Func<Microsoft.Scripting.Runtime.CodeContext, IronRuby.Builtins.MatchData, System.Object[], IronRuby.Builtins.RubyArray>(IronRuby.Builtins.MatchDataOps.ValuesAt),
             });
@@ -4871,11 +4867,11 @@
             });
             
             module.DefineLibraryMethod("flatten", 0x29, new System.Delegate[] {
-                new System.Func<System.Collections.IList, IronRuby.Builtins.RubyArray>(IronRuby.Builtins.IListOps.Flatten),
+                new System.Func<Microsoft.Scripting.Runtime.CodeContext, System.Collections.IList, System.Collections.IList>(IronRuby.Builtins.IListOps.Flatten),
             });
             
             module.DefineLibraryMethod("flatten!", 0x29, new System.Delegate[] {
-                new System.Func<System.Collections.IList, System.Collections.IList>(IronRuby.Builtins.IListOps.FlattenInPlace),
+                new System.Func<Microsoft.Scripting.Runtime.CodeContext, System.Collections.IList, System.Collections.IList>(IronRuby.Builtins.IListOps.FlattenInPlace),
             });
             
             module.DefineLibraryMethod("hash", 0x29, new System.Delegate[] {
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/LibrarySites.cs;C537338
File: LibrarySites.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/LibrarySites.cs;C537338  (server)    8/21/2008 10:34 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/LibrarySites.cs;bugs-2
@@ -13,15 +13,12 @@
  *
  * ***************************************************************************/
 
+using System;
+using System.Collections;
 using System.Collections.Generic;
-using Microsoft.Scripting;
 using System.Scripting.Actions;
-using System.Linq.Expressions;
+using IronRuby.Runtime.Calls;
 using Microsoft.Scripting.Runtime;
-using Microsoft.Scripting.Actions;
-using IronRuby.Runtime;
-using IronRuby.Runtime.Calls;
-using System;
 
 namespace IronRuby.Builtins {
 
@@ -219,6 +216,11 @@
             return _MatchSite.Target(_MatchSite, context, regex, str);
         }
 
+        private static CallSite<Func<CallSite, CodeContext, IList, IList>> _FlattenSite = CallSite<Func<CallSite, CodeContext, IList, IList>>.Create(
+            InstanceCallAction("flatten", 0));
+        public static IList InvokeFlatten(CodeContext/*!*/ context, IList list) {
+            return _FlattenSite.Target(_FlattenSite, context, list);
+        }
         #region Helpers
 
         public static RubyCallAction InstanceCallAction(string/*!*/ name, RubyCallSignature signature) {
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MatchDataOps.cs;C533798
File: MatchDataOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MatchDataOps.cs;C533798  (server)    8/21/2008 9:29 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MatchDataOps.cs;bugs-2
@@ -160,11 +160,6 @@
             return result;
         }
 
-        [RubyMethod("to_s")]
-        public static MutableString/*!*/ ToString(CodeContext/*!*/ context, MatchData/*!*/ self) {
-            return RubyUtils.FlowTaint(context, self, MatchData.GetGroupValue(self.Match));
-        }
-
         [RubyMethod("select")]
         public static object Select(CodeContext/*!*/ context, MatchData/*!*/ self, BlockParam block) {
             if (block == null) {
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs;C537338
File: IListOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs;C537338  (server)    8/21/2008 7:41 AM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Extensions/IListOps.cs;bugs-2
@@ -623,12 +623,11 @@
         #region delete, delete_at
 
         public static bool Remove(CodeContext/*!*/ context, IList/*!*/ self, object item) {
-            RubyUtils.RequiresNotFrozen(context, self);
-
             int i = 0;
             bool removed = false;
             while (i < self.Count) {
                 if (Protocols.IsEqual(context, self[i], item)) {
+                    RubyUtils.RequiresNotFrozen(context, self);
                     self.RemoveAt(i);
                     removed = true;
                 } else {
@@ -927,47 +926,58 @@
 
         #region flatten, flatten!
 
-        public static bool TryRecursiveFlatten(IList list, IList result, Dictionary<object, bool> seen) {
+        public static bool TryRecursiveFlatten(CodeContext/*!*/ context, IList list, IList result, Dictionary<object, bool> seen) {
             bool flattened = false;
             for (int i = 0; i < list.Count; ++i) {
-                object item = list[i];
+                IList item = list[i] as IList;
+                if (item == null) {
+                    item = Protocols.AsArray(context, list[i]);
+                }
 
-                if (item is IList) {
+                if (item == null) {
+                    result.Add(list[i]);
+                } else {
                     flattened = true;
                     if (!seen.ContainsKey(item)) {
                         seen.Add(item, true);
-                        bool f = TryRecursiveFlatten((IList)item, result, seen);
-                        if (f)
-                            flattened = true;
+
+                        // TODO: should call via a site to do this, but we need a way of flowing the seen dictionary
+                        // across the boundary - maybe use a thread static slot to store the dictionary in the future?
+                        // IList flattenedItem = LibrarySites.InvokeFlatten(context, item);
+                        // if (flattenedItem != null) {
+                        //     AddRange(result, flattenedItem);
+                        // }
+                        TryRecursiveFlatten(context, item, result, seen);
                     } else
                         throw RubyExceptions.CreateArgumentError("tried to flatten recursive array");
-                } else
-                    result.Add(item);
+                }
             }
             return flattened;
         }
 
-        public static bool TryFlattenArray(IList list, out RubyArray/*!*/ result) {
+        public static bool TryFlattenArray(CodeContext/*!*/ context, IList list, out IList/*!*/ result) {
             Dictionary<object, bool> seen = new Dictionary<object, bool>(ReferenceEqualityComparer<object>.Instance);
             seen.Add(list, true);
+            // TODO: create correct subclass of RubyArray rather than RubyArray directly
             result = new RubyArray();
-            return TryRecursiveFlatten(list, result, seen);
+            return TryRecursiveFlatten(context, list, result, seen);
         }
 
         [RubyMethod("flatten")]
-        public static RubyArray/*!*/ Flatten(IList/*!*/ self) {
-            RubyArray result;
-            TryFlattenArray(self, out result);
+        public static IList/*!*/ Flatten(CodeContext/*!*/ context, IList/*!*/ self) {
+            IList result;
+            TryFlattenArray(context, self, out result);
             return result;
         }
 
         [RubyMethod("flatten!")]
-        public static IList FlattenInPlace(IList/*!*/ self) {
-            RubyArray result;
-            if (!TryFlattenArray(self, out result)) {
+        public static IList FlattenInPlace(CodeContext/*!*/ context, IList/*!*/ self) {
+            IList result;
+            if (!TryFlattenArray(context, self, out result)) {
                 return null;
             }
 
+            RubyUtils.RequiresNotFrozen(context, self);
             self.Clear();
             AddRange(self, result);
             return self;
===================================================================
