Author: zoltan
Date: 2008-02-10 12:32:04 -0500 (Sun, 10 Feb 2008)
New Revision: 95389

Modified:
   trunk/mcs/class/System/System.Text.RegularExpressions/BaseMachine.cs
   trunk/mcs/class/System/System.Text.RegularExpressions/ChangeLog
   trunk/mcs/class/System/System.Text.RegularExpressions/Regex.cs
Log:
2008-02-10  Zoltan Varga  <[EMAIL PROTECTED]>

        * BaseMachine.cs Regex.cs: Make LTRReplace and RTLReplace instance 
methods to 
        avoid creating two machines for each Regex.Replace () call.


Modified: trunk/mcs/class/System/System.Text.RegularExpressions/BaseMachine.cs
===================================================================
--- trunk/mcs/class/System/System.Text.RegularExpressions/BaseMachine.cs        
2008-02-10 17:27:31 UTC (rev 95388)
+++ trunk/mcs/class/System/System.Text.RegularExpressions/BaseMachine.cs        
2008-02-10 17:32:04 UTC (rev 95389)
@@ -1,168 +1,168 @@
-//
-// BaseMachine.jvm.cs
-//
-// Author:
-// author:     Dan Lewis ([EMAIL PROTECTED])
-//             (c) 2002
-// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
-//
-
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be
-// included in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
-// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
-// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
-// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
-// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//
-
-using System;
-using System.Collections;
-using System.Collections.Specialized;
-
-namespace System.Text.RegularExpressions
-{
-       abstract class BaseMachine : IMachine
-       {
-               internal delegate void MatchAppendEvaluator (Match match, 
StringBuilder sb);
-
-               public virtual string Replace (Regex regex, string input, 
string replacement, int count, int startat)
-               {
-                       ReplacementEvaluator ev = new ReplacementEvaluator 
(regex, replacement);
-                       if (regex.RightToLeft)
-                               return RTLReplace (regex, input, new 
MatchEvaluator (ev.Evaluate), count, startat);
-                       else
-                               return LTRReplace (regex, input, new 
MatchAppendEvaluator (ev.EvaluateAppend), count, startat);
-               }
-
-               virtual public string [] Split (Regex regex, string input, int 
count, int startat)
-               {
-                       ArrayList splits = new ArrayList ();
-                       if (count == 0)
-                               count = Int32.MaxValue;
-
-                       int ptr = startat;
-                       Match m = null;
-                       while (--count > 0) {
-                               if (m != null)
-                                       m = m.NextMatch ();
-                               else
-                                       m = regex.Match (input, ptr);
-
-                               if (!m.Success)
-                                       break;
-
-                               if (regex.RightToLeft)
-                                       splits.Add (input.Substring (m.Index + 
m.Length, ptr - m.Index - m.Length));
-                               else
-                                       splits.Add (input.Substring (ptr, 
m.Index - ptr));
-
-                               int gcount = m.Groups.Count;
-                               for (int gindex = 1; gindex < gcount; gindex++) 
{
-                                       Group grp = m.Groups [gindex];
-                                       splits.Add (input.Substring (grp.Index, 
grp.Length));
-                               }
-
-                               if (regex.RightToLeft)
-                                       ptr = m.Index;
-                               else
-                                       ptr = m.Index + m.Length;
-
-                       }
-
-                       if (regex.RightToLeft && ptr >= 0)
-                               splits.Add (input.Substring (0, ptr));
-                       if (!regex.RightToLeft && ptr <= input.Length)
-                               splits.Add (input.Substring (ptr));
-
-                       return (string []) splits.ToArray (typeof (string));
-               }
-
-               virtual public Match Scan (Regex regex, string text, int start, 
int end)
-               {
-                       throw new NotImplementedException ("Scan method must be 
implemented in derived classes");
-               }
-
-               virtual public string Result (string replacement, Match match)
-               {
-                       return ReplacementEvaluator.Evaluate (replacement, 
match);
-               }
-
-               internal static string LTRReplace (Regex regex, string input, 
MatchAppendEvaluator evaluator, int count, int startat)
-               {
-                       Match m = regex.Match (input, startat);
-                       if (!m.Success)
-                               return input;
-
-                       StringBuilder result = new StringBuilder ();
-                       int ptr = startat;
-                       int counter = count;
-
-                       result.Append (input, 0, ptr);
-
-                       do {
-                               if (count != -1)
-                                       if (counter-- <= 0)
-                                               break;
-                               if (m.Index < ptr)
-                                       throw new SystemException ("how");
-                               result.Append (input, ptr, m.Index - ptr);
-                               evaluator (m, result);
-
-                               ptr = m.Index + m.Length;
-                               m = m.NextMatch ();
-                       } while (m.Success);
-
-                       result.Append (input, ptr, input.Length - ptr);
-
-                       return result.ToString ();
-               }
-
-               internal static string RTLReplace (Regex regex, string input, 
MatchEvaluator evaluator, int count, int startat)
-               {
-                       Match m = regex.Match (input, startat);
-                       if (!m.Success)
-                               return input;
-
-                       int ptr = startat;
-                       int counter = count;
-                       StringCollection pieces = new StringCollection ();
-                       pieces.Add (input.Substring (ptr));
-
-                       do {
-                               if (count != -1)
-                                       if (counter-- <= 0)
-                                               break;
-                               if (m.Index + m.Length > ptr)
-                                       throw new SystemException ("how");
-                               pieces.Add (input.Substring (m.Index + 
m.Length, ptr - m.Index - m.Length));
-                               pieces.Add (evaluator (m));
-
-                               ptr = m.Index;
-                               m = m.NextMatch ();
-                       } while (m.Success);
-
-                       StringBuilder result = new StringBuilder ();
-
-                       result.Append (input, 0, ptr);
-                       for (int i = pieces.Count; i > 0; )
-                               result.Append (pieces [--i]);
-
-                       pieces.Clear ();
-
-                       return result.ToString ();
-               }
-       }
-}
+//
+// BaseMachine.cs
+//
+// Author:
+// author:     Dan Lewis ([EMAIL PROTECTED])
+//             (c) 2002
+// Copyright (C) 2005 Novell, Inc (http://www.novell.com)
+//
+
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+using System;
+using System.Collections;
+using System.Collections.Specialized;
+
+namespace System.Text.RegularExpressions
+{
+       abstract class BaseMachine : IMachine
+       {
+               internal delegate void MatchAppendEvaluator (Match match, 
StringBuilder sb);
+
+               public virtual string Replace (Regex regex, string input, 
string replacement, int count, int startat)
+               {
+                       ReplacementEvaluator ev = new ReplacementEvaluator 
(regex, replacement);
+                       if (regex.RightToLeft)
+                               return RTLReplace (regex, input, new 
MatchEvaluator (ev.Evaluate), count, startat);
+                       else
+                               return LTRReplace (regex, input, new 
MatchAppendEvaluator (ev.EvaluateAppend), count, startat);
+               }
+
+               virtual public string [] Split (Regex regex, string input, int 
count, int startat)
+               {
+                       ArrayList splits = new ArrayList ();
+                       if (count == 0)
+                               count = Int32.MaxValue;
+
+                       int ptr = startat;
+                       Match m = null;
+                       while (--count > 0) {
+                               if (m != null)
+                                       m = m.NextMatch ();
+                               else
+                                       m = regex.Match (input, ptr);
+
+                               if (!m.Success)
+                                       break;
+
+                               if (regex.RightToLeft)
+                                       splits.Add (input.Substring (m.Index + 
m.Length, ptr - m.Index - m.Length));
+                               else
+                                       splits.Add (input.Substring (ptr, 
m.Index - ptr));
+
+                               int gcount = m.Groups.Count;
+                               for (int gindex = 1; gindex < gcount; gindex++) 
{
+                                       Group grp = m.Groups [gindex];
+                                       splits.Add (input.Substring (grp.Index, 
grp.Length));
+                               }
+
+                               if (regex.RightToLeft)
+                                       ptr = m.Index;
+                               else
+                                       ptr = m.Index + m.Length;
+
+                       }
+
+                       if (regex.RightToLeft && ptr >= 0)
+                               splits.Add (input.Substring (0, ptr));
+                       if (!regex.RightToLeft && ptr <= input.Length)
+                               splits.Add (input.Substring (ptr));
+
+                       return (string []) splits.ToArray (typeof (string));
+               }
+
+               virtual public Match Scan (Regex regex, string text, int start, 
int end)
+               {
+                       throw new NotImplementedException ("Scan method must be 
implemented in derived classes");
+               }
+
+               virtual public string Result (string replacement, Match match)
+               {
+                       return ReplacementEvaluator.Evaluate (replacement, 
match);
+               }
+
+               internal string LTRReplace (Regex regex, string input, 
MatchAppendEvaluator evaluator, int count, int startat)
+               {
+                       Match m = Scan (regex, input, startat, input.Length);
+                       if (!m.Success)
+                               return input;
+
+                       StringBuilder result = new StringBuilder ();
+                       int ptr = startat;
+                       int counter = count;
+
+                       result.Append (input, 0, ptr);
+
+                       do {
+                               if (count != -1)
+                                       if (counter-- <= 0)
+                                               break;
+                               if (m.Index < ptr)
+                                       throw new SystemException ("how");
+                               result.Append (input, ptr, m.Index - ptr);
+                               evaluator (m, result);
+
+                               ptr = m.Index + m.Length;
+                               m = m.NextMatch ();
+                       } while (m.Success);
+
+                       result.Append (input, ptr, input.Length - ptr);
+
+                       return result.ToString ();
+               }
+
+               internal string RTLReplace (Regex regex, string input, 
MatchEvaluator evaluator, int count, int startat)
+               {
+                       Match m = Scan (regex, input, startat, input.Length);
+                       if (!m.Success)
+                               return input;
+
+                       int ptr = startat;
+                       int counter = count;
+                       StringCollection pieces = new StringCollection ();
+                       pieces.Add (input.Substring (ptr));
+
+                       do {
+                               if (count != -1)
+                                       if (counter-- <= 0)
+                                               break;
+                               if (m.Index + m.Length > ptr)
+                                       throw new SystemException ("how");
+                               pieces.Add (input.Substring (m.Index + 
m.Length, ptr - m.Index - m.Length));
+                               pieces.Add (evaluator (m));
+
+                               ptr = m.Index;
+                               m = m.NextMatch ();
+                       } while (m.Success);
+
+                       StringBuilder result = new StringBuilder ();
+
+                       result.Append (input, 0, ptr);
+                       for (int i = pieces.Count; i > 0; )
+                               result.Append (pieces [--i]);
+
+                       pieces.Clear ();
+
+                       return result.ToString ();
+               }
+       }
+}

Modified: trunk/mcs/class/System/System.Text.RegularExpressions/ChangeLog
===================================================================
--- trunk/mcs/class/System/System.Text.RegularExpressions/ChangeLog     
2008-02-10 17:27:31 UTC (rev 95388)
+++ trunk/mcs/class/System/System.Text.RegularExpressions/ChangeLog     
2008-02-10 17:32:04 UTC (rev 95389)
@@ -1,5 +1,8 @@
 2008-02-10  Zoltan Varga  <[EMAIL PROTECTED]>
 
+       * BaseMachine.cs Regex.cs: Make LTRReplace and RTLReplace instance 
methods to 
+       avoid creating two machines for each Regex.Replace () call.
+
        * interpreter.cs (Eval): Remove a needless string allocation.
 
 2007-12-04  Arina Itkes <[EMAIL PROTECTED]>

Modified: trunk/mcs/class/System/System.Text.RegularExpressions/Regex.cs
===================================================================
--- trunk/mcs/class/System/System.Text.RegularExpressions/Regex.cs      
2008-02-10 17:27:31 UTC (rev 95388)
+++ trunk/mcs/class/System/System.Text.RegularExpressions/Regex.cs      
2008-02-10 17:32:04 UTC (rev 95389)
@@ -373,15 +373,17 @@
 
                public string Replace (string input, MatchEvaluator evaluator, 
int count, int startat)
                {
+                       BaseMachine m = (BaseMachine)CreateMachine ();
+
                        if (RightToLeft)
-                               return BaseMachine.RTLReplace (this, input, 
evaluator, count, startat);
+                               return m.RTLReplace (this, input, evaluator, 
count, startat);
 
                        // NOTE: If this is a cause of a lot of allocations, we 
can convert it to
                        //       use a ThreadStatic allocation mitigator
                        Adapter a = new Adapter (evaluator);
 
-                       return BaseMachine.LTRReplace (this, input, new 
BaseMachine.MatchAppendEvaluator (a.Evaluate),
-                                                      count, startat);
+                       return m.LTRReplace (this, input, new 
BaseMachine.MatchAppendEvaluator (a.Evaluate),
+                                                                count, 
startat);
                }
 
                public string Replace (string input, string replacement)

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to