Refactoring StringBuilder so that it may work outside the java.lang
namespace in CPStringBuilder seems to have caused the code for
indexOf to be broken.  This fixes it.

ChangeLog:

2008-03-17  Andrew John Hughes  <[EMAIL PROTECTED]>

        PR classpath/21869:
        * gnu/java/lang/CPStringBuilder.java:
        (indexOf(String,int)): Use regionMatches from String.
        (lastIndexOf(String,int)): Likewise.
        (regionMatches(int,String)): Removed broken code.
        (substring(int,int)): Rearrange index computation so
        it is only computed if valid.

-- 
Andrew :)

Support Free Java!
Contribute to GNU Classpath and the OpenJDK
http://www.gnu.org/software/classpath
http://openjdk.java.net
PGP Key: 94EFD9D8 (http://subkeys.pgp.net)
Fingerprint = F8EF F1EA 401E 2E60 15FA  7927 142C 2591 94EF D9D8
Index: gnu/java/lang/CPStringBuilder.java
===================================================================
RCS file: /sources/classpath/classpath/gnu/java/lang/CPStringBuilder.java,v
retrieving revision 1.3
diff -u -3 -p -u -r1.3 CPStringBuilder.java
--- gnu/java/lang/CPStringBuilder.java	17 Mar 2008 00:14:35 -0000	1.3
+++ gnu/java/lang/CPStringBuilder.java	17 Mar 2008 02:58:01 -0000
@@ -829,9 +829,11 @@ public final class CPStringBuilder
   {
     if (fromIndex < 0)
       fromIndex = 0;
-    int limit = count - str.length();
-    for ( ; fromIndex <= limit; fromIndex++)
-      if (regionMatches(fromIndex, str))
+    int olength = str.length();
+    int limit = count - olength;
+    String s = VMCPStringBuilder.toString(value, 0, count);
+    for (; fromIndex <= limit; ++fromIndex)
+      if (s.regionMatches(fromIndex, str, 0, olength))
         return fromIndex;
     return -1;
   }
@@ -865,8 +867,10 @@ public final class CPStringBuilder
   public int lastIndexOf(String str, int fromIndex)
   {
     fromIndex = Math.min(fromIndex, count - str.length());
+    String s = VMCPStringBuilder.toString(value, 0, count);
+    int olength = str.length();
     for ( ; fromIndex >= 0; fromIndex--)
-      if (regionMatches(fromIndex, str))
+      if (s.regionMatches(fromIndex, str, 0, olength))
         return fromIndex;
     return -1;
   }
@@ -1013,24 +1017,6 @@ public final class CPStringBuilder
   }
 
   /**
-   * Predicate which determines if a substring of this matches another String
-   * starting at a specified offset for each String and continuing for a
-   * specified length. This is more efficient than creating a String to call
-   * indexOf on.
-   *
-   * @param toffset index to start comparison at for this String
-   * @param other non-null String to compare to region of this
-   * @return true if regions match, false otherwise
-   * @see #indexOf(String, int)
-   * @see #lastIndexOf(String, int)
-   * @see String#regionMatches(boolean, int, String, int, int)
-   */
-  private boolean regionMatches(int toffset, String other)
-  {
-    return new String().regionMatches(toffset, other, 0, other.length());
-  }
-
-  /**
    * Get the length of the <code>String</code> this <code>StringBuilder</code>
    * would create. Not to be confused with the <em>capacity</em> of the
    * <code>StringBuilder</code>.
@@ -1074,9 +1060,9 @@ public final class CPStringBuilder
    */
   public String substring(int beginIndex, int endIndex)
   {
-    int len = endIndex - beginIndex;
     if (beginIndex < 0 || endIndex > count || endIndex < beginIndex)
       throw new StringIndexOutOfBoundsException();
+    int len = endIndex - beginIndex;
     if (len == 0)
       return "";
     return VMCPStringBuilder.toString(value, beginIndex, len);

Attachment: signature.asc
Description: Digital signature

Reply via email to