aboutsummaryrefslogtreecommitdiff
path: root/libjava
diff options
context:
space:
mode:
Diffstat (limited to 'libjava')
-rw-r--r--libjava/ChangeLog5
-rw-r--r--libjava/java/lang/StringBuffer.java5
-rw-r--r--libjava/testsuite/ChangeLog6
-rw-r--r--libjava/testsuite/libjava.lang/PR12350.java20
-rw-r--r--libjava/testsuite/libjava.lang/PR12350.out1
5 files changed, 35 insertions, 2 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog
index da57fc0..ac57998 100644
--- a/libjava/ChangeLog
+++ b/libjava/ChangeLog
@@ -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
diff --git a/libjava/java/lang/StringBuffer.java b/libjava/java/lang/StringBuffer.java
index fac7892..a7c2590 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 58226a1..eccde2a 100644
--- a/libjava/testsuite/ChangeLog
+++ b/libjava/testsuite/ChangeLog
@@ -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
index 0000000..ded8856
--- /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 0000000..61dc0a6
--- /dev/null
+++ b/libjava/testsuite/libjava.lang/PR12350.out
@@ -0,0 +1 @@
+Good string. More than 16 chars.