re PR libgcj/12350 (StringBuffer.substring handles shared flag incorrected.)
authorRalph Loader <suckfish@ihug.co.nz>
Mon, 22 Sep 2003 08:17:49 +0000 (08:17 +0000)
committerBryce McKinlay <bryce@gcc.gnu.org>
Mon, 22 Sep 2003 08:17:49 +0000 (09:17 +0100)
2003-09-21  Ralph Loader  <suckfish@ihug.co.nz>

        PR java/12350:
        * java/lang/StringBuffer.java (substring): Fix handling of shared
        flag.

2003-09-21  Ralph Loader  <suckfish@ihug.co.nz>

        PR java/12350
        * libjava.lang/PR12350.java: New file.
        * libjava.lang/PR12350.out: New file.

From-SVN: r71651

libjava/ChangeLog
libjava/java/lang/StringBuffer.java
libjava/testsuite/ChangeLog
libjava/testsuite/libjava.lang/PR12350.java [new file with mode: 0644]
libjava/testsuite/libjava.lang/PR12350.out [new file with mode: 0644]

index da57fc06adce95498ff1b03a909646b8e8a35f18..ac57998976ab90438dbd7065fb3235dc89f02796 100644 (file)
@@ -1,3 +1,8 @@
+2003-09-21  Ralph Loader  <suckfish@ihug.co.nz>
+
+       PR java/12350:
+       * java/lang/StringBuffer.java (substring): Fix handling of shared flag.
+
 2003-09-22  Michael Koch  <konqueror@gmx.de>
 
        * jni.cc (_Jv_LookupJNIMethod): Remove workaround that should hide a
index fac7892524e8087a91d14ebdbb9b03348e1bbe45..a7c2590f39ace07e95bf11b0712de27251ff851e 100644 (file)
@@ -564,8 +564,9 @@ public final class StringBuffer implements Serializable, CharSequence
       throw new StringIndexOutOfBoundsException();
     if (len == 0)
       return "";
-    // Share the char[] unless 3/4 empty.
-    shared = (len << 2) >= value.length;
+    // Share unless substring is smaller than 1/4 of the buffer.
+    if ((len << 2) >= value.length)
+      shared = true;
     // Package constructor avoids an array copy.
     return new String(value, beginIndex, len, shared);
   }
index 58226a1c76475b5836b3cc448d481aa0e7a4198e..eccde2a1f9d56b56f2aee4117138ef69adb06e9a 100644 (file)
@@ -1,3 +1,9 @@
+2003-09-21  Ralph Loader  <suckfish@ihug.co.nz>
+
+       PR java/12350
+       * libjava.lang/PR12350.java: New file.
+       * libjava.lang/PR12350.out: New file.
+
 2003-09-17  Ranjit Mathew  <rmathew@hotmail.com>
 
        PR java/9577
diff --git a/libjava/testsuite/libjava.lang/PR12350.java b/libjava/testsuite/libjava.lang/PR12350.java
new file mode 100644 (file)
index 0000000..ded8856
--- /dev/null
@@ -0,0 +1,20 @@
+public class PR12350
+{
+    static public void main (String[] ignored) throws Throwable
+    {
+       StringBuffer b = new StringBuffer ("Good string.  More than 16 chars.");
+
+       // Should cause sharing.
+       String s = b.toString();
+
+       // Take a char by char unshared copy of s.
+       String t = new String (s.toCharArray());
+
+       b.substring (0, 4);     // BUG: Clears shared flag.
+       b.replace (0, 4, "Bad "); // Modifies shared data.
+
+       System.out.println (s);
+       assert s.equals (t);
+    }
+
+}
diff --git a/libjava/testsuite/libjava.lang/PR12350.out b/libjava/testsuite/libjava.lang/PR12350.out
new file mode 100644 (file)
index 0000000..61dc0a6
--- /dev/null
@@ -0,0 +1 @@
+Good string.  More than 16 chars.