edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/Errno.cs;C435539
File: Errno.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/Errno.cs;C435539  (server)    5/24/2008 7:27 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/Errno.cs;RegexGroupValues
@@ -141,5 +141,20 @@
                 : base(info, context) { }
 #endif
         }
+
+        [RubyClass("EPIPE"), Serializable]
+        public class PipeError : ExternalException {
+            private const string/*!*/ M = "Broken pipe";
+
+            public PipeError() : this(null, null) { }
+            public PipeError(string message) : this(message, null) { }
+            public PipeError(string message, Exception inner) : base(MakeMessage(message, M), inner) { }
+            public PipeError(MutableString message) : base(MakeMessage(ref message, M)) { ExceptionOps.InitializeException(this, message); }
+
+#if !SILVERLIGHT
+            protected PipeError(System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
+                : base(info, context) { }
+#endif
+        }
     }
 }
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MatchDataOps.cs;C448465
File: MatchDataOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MatchDataOps.cs;C448465  (server)    5/24/2008 6:23 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MatchDataOps.cs;RegexGroupValues
@@ -38,7 +38,7 @@
         [RubyMethod("[]")]
         public static MutableString GetGroup(MatchData/*!*/ self, int i) {
             i = IListOps.NormalizeIndex(self.Groups.Count, i);
-            return (i >= 0 && i < self.Groups.Count) ? MutableString.Create(self.Groups[i].Value) : null;
+            return (i >= 0 && i < self.Groups.Count) ? MatchData.GetGroupValue(self.Groups[i]) : null;
         }
 
         [RubyMethod("[]")]
@@ -54,9 +54,7 @@
 
             RubyArray result = new RubyArray();
             for (int i = 0; i < length; i++) {
-                Group group = self.Groups[start + i];
-                MutableString value = group.Success ? MutableString.Create(group.Value) : null;
-                result.Add(Kernel.FlowTaint(context, self, value));
+                result.Add(Kernel.FlowTaint(context, self, MatchData.GetGroupValue(self.Groups[start + i])));
             }
 
             return result;
@@ -136,8 +134,9 @@
         private static RubyArray/*!*/ ReturnMatchingGroups(CodeContext/*!*/ context, MatchData/*!*/ self, int group) {
             AssertValidGroup(self, group);
             RubyArray result = new RubyArray(self.Groups.Count - group);
-            for (int i = group; i < self.Groups.Count; ++i)
-                result.Add(Kernel.FlowTaint(context, self, MutableString.Create(self.Groups[i].Value)));
+            for (int i = group; i < self.Groups.Count; i++) {
+                result.Add(Kernel.FlowTaint(context, self, MatchData.GetGroupValue(self.Groups[i])));
+            }
             return result;
         }
 
@@ -160,7 +159,7 @@
 
         [RubyMethod("to_s")]
         public static MutableString/*!*/ ToString(CodeContext/*!*/ context, MatchData/*!*/ self) {
-            return Kernel.FlowTaint(context, self, MutableString.Create(self.Match.Value));
+            return Kernel.FlowTaint(context, self, MatchData.GetGroupValue(self.Match));
         }
 
         private static readonly DynamicSite<BlockParam, MutableString, bool>/*!*/ _MatchDataSelectSite =
@@ -171,8 +170,8 @@
             if (block == null) throw RubyExceptions.CreateLocalJumpError("no block given");
 
             RubyArray result = new RubyArray();
-            for (int i = 0; i < self.Groups.Count; ++i) {
-                MutableString value = Kernel.FlowTaint(context, self, MutableString.Create(self.Groups[i].Value));
+            for (int i = 0; i < self.Groups.Count; i++) {
+                MutableString value = Kernel.FlowTaint(context, self, MatchData.GetGroupValue(self.Groups[i]));
                 if (_MatchDataSelectSite.Invoke(context, block, value))
                     result.Add(value);
             }
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MutableStringOps.cs;C448465
File: MutableStringOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MutableStringOps.cs;C448465  (server)    5/24/2008 2:28 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/MutableStringOps.cs;RegexGroupValues
@@ -580,7 +580,7 @@
             if (occurrance < 0 || occurrance > match.Groups.Count)
                 return null;
 
-            return String.IsNullOrEmpty(match.Groups[occurrance].Value) ? null : match.Groups[occurrance];
+            return match.Groups[occurrance].Success ? match.Groups[occurrance] : null;
         }
 
         [RubyMethod("slice!")]
@@ -795,7 +795,7 @@
             }
 
             Group group = MatchRegexp(context, self, regex, occurrance);
-            return group == null ? null : Kernel.FlowTaint(context, self, regex, CreateSubClass(context, self, MutableString.Create(group.Value)));
+            return group == null ? null : Kernel.FlowTaint(context, self, regex, CreateSubClass(context, self, MatchData.GetGroupValue(group)));
         }
 
         [RubyMethod("[]")]
@@ -2310,7 +2310,7 @@
                     } else {
                         RubyArray m = new RubyArray(match.Groups.Count - 1);
                         for (int i = 1; i < match.Groups.Count; i++) {
-                            m.Add(Kernel.FlowTaint(context, self, regex, MutableString.Create(match.Groups[i].Value)));
+                            m.Add(Kernel.FlowTaint(context, self, regex, MatchData.GetGroupValue(match.Groups[i])));
                         }
                         result.Add(m);
                     }
@@ -2344,13 +2344,15 @@
             } else {
                 foreach (Match match in matches) {
                     if (match.Groups.Count == 1) {
-                        if (block.BlockJumped(ScanStringSharedSite.Invoke(context, block, Kernel.FlowTaint(context, self, regex, MutableString.Create(match.Value))))) {
+                        if (block.BlockJumped(ScanStringSharedSite.Invoke(context, block, 
+                            Kernel.FlowTaint(context, self, regex, MatchData.GetGroupValue(match))
+                        ))) {
                             return self;
                         }
                     } else {
                         RubyArray args = new RubyArray(match.Groups.Count - 1);
                         for (int i = 1; i < match.Groups.Count; i++) {
-                            args.Add(Kernel.FlowTaint(context, self, regex, MutableString.Create(match.Groups[i].Value)));
+                            args.Add(Kernel.FlowTaint(context, self, regex, MatchData.GetGroupValue(match.Groups[i])));
                         }
                         if (block.BlockJumped(ScanRegexSharedSite.Invoke(context, block, args))) {
                             return self;
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/RubyRegexOps.cs;C444052
File: RubyRegexOps.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/RubyRegexOps.cs;C444052  (server)    5/24/2008 7:13 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Libraries.LCA_RESTRICTED/Builtins/RubyRegexOps.cs;RegexGroupValues
@@ -367,7 +367,7 @@
 
         [RubyMethod("last_match", RubyMethodAttributes.PublicSingleton)]
         public static MutableString/*!*/ LastMatch(CodeContext/*!*/ context, object/*!*/ self, int group) {
-            return MutableString.Create(RubyUtils.GetScope(context).CurrentMatch.Groups[group].Value);
+            return MatchData.GetGroupValue(RubyUtils.GetScope(context).CurrentMatch.Groups[group]);
         }
 
         [RubyMethod("last_match", RubyMethodAttributes.PublicSingleton)]
===================================================================
edit: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/MatchData.cs;C436237
File: MatchData.cs
===================================================================
--- $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/MatchData.cs;C436237  (server)    5/24/2008 7:07 PM
+++ Shelved Change: $/Dev10/feature/vs_langs01/Merlin/Main/Languages/Ruby/Ruby/Builtins/MatchData.cs;RegexGroupValues
@@ -49,5 +49,9 @@
         }
 
         #endregion
+
+        public static MutableString GetGroupValue(Group/*!*/ group) {
+            return group.Success ? MutableString.Create(group.Value) : null;
+        }
     }
 }
===================================================================
