From: Ralph Loader Date: Mon, 22 Sep 2003 08:17:49 +0000 (+0000) Subject: re PR libgcj/12350 (StringBuffer.substring handles shared flag incorrected.) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=88962108fc1e1e59c4d3f4765cae3f28c03a7745;p=gcc.git re PR libgcj/12350 (StringBuffer.substring handles shared flag incorrected.) 2003-09-21 Ralph Loader PR java/12350: * java/lang/StringBuffer.java (substring): Fix handling of shared flag. 2003-09-21 Ralph Loader PR java/12350 * libjava.lang/PR12350.java: New file. * libjava.lang/PR12350.out: New file. From-SVN: r71651 --- diff --git a/libjava/ChangeLog b/libjava/ChangeLog index da57fc06adc..ac57998976a 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -1,3 +1,8 @@ +2003-09-21 Ralph Loader + + PR java/12350: + * java/lang/StringBuffer.java (substring): Fix handling of shared flag. + 2003-09-22 Michael Koch * jni.cc (_Jv_LookupJNIMethod): Remove workaround that should hide a diff --git a/libjava/java/lang/StringBuffer.java b/libjava/java/lang/StringBuffer.java index fac7892524e..a7c2590f39a 100644 --- a/libjava/java/lang/StringBuffer.java +++ b/libjava/java/lang/StringBuffer.java @@ -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); } diff --git a/libjava/testsuite/ChangeLog b/libjava/testsuite/ChangeLog index 58226a1c764..eccde2a1f9d 100644 --- a/libjava/testsuite/ChangeLog +++ b/libjava/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2003-09-21 Ralph Loader + + PR java/12350 + * libjava.lang/PR12350.java: New file. + * libjava.lang/PR12350.out: New file. + 2003-09-17 Ranjit Mathew PR java/9577 diff --git a/libjava/testsuite/libjava.lang/PR12350.java b/libjava/testsuite/libjava.lang/PR12350.java new file mode 100644 index 00000000000..ded8856cf92 --- /dev/null +++ b/libjava/testsuite/libjava.lang/PR12350.java @@ -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 index 00000000000..61dc0a6373f --- /dev/null +++ b/libjava/testsuite/libjava.lang/PR12350.out @@ -0,0 +1 @@ +Good string. More than 16 chars.