From 88962108fc1e1e59c4d3f4765cae3f28c03a7745 Mon Sep 17 00:00:00 2001 From: Ralph Loader Date: Mon, 22 Sep 2003 08:17:49 +0000 Subject: [PATCH] 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 --- libjava/ChangeLog | 5 +++++ libjava/java/lang/StringBuffer.java | 5 +++-- libjava/testsuite/ChangeLog | 6 ++++++ libjava/testsuite/libjava.lang/PR12350.java | 20 ++++++++++++++++++++ libjava/testsuite/libjava.lang/PR12350.out | 1 + 5 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 libjava/testsuite/libjava.lang/PR12350.java create mode 100644 libjava/testsuite/libjava.lang/PR12350.out 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. -- 2.30.2