This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[patch] pr 12350, java.lang.StringBuffer.substring.
- From: Ralph Loader <suckfish at ihug dot co dot nz>
- To: java-patches at gcc dot gnu dot org
- Date: Sun, 21 Sep 2003 21:06:47 +1200
- Subject: [patch] pr 12350, java.lang.StringBuffer.substring.
Hi,
java.lang.StringBuffer.substring is manipulating the shared flag on the
StringBuffer object incorrectly, PR java/12350.
The following patch fixes the bug and adds a test case. It passes the
libjava/testsuite on i686-pc-linux-gnu.
Ralph.
Index: libjava/ChangeLog
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/ChangeLog,v
retrieving revision 1.2164
diff -u -r1.2164 ChangeLog
--- libjava/ChangeLog 20 Sep 2003 21:30:38 -0000 1.2164
+++ libjava/ChangeLog 21 Sep 2003 09:00:36 -0000
@@ -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-20 Tom Tromey <tromey@redhat.com>
* java/awt/Component.java: Indentation cleanup from Classpath.
Index: libjava/java/lang/StringBuffer.java
===================================================================
RCS file: /cvsroot/gcc/gcc/libjava/java/lang/StringBuffer.java,v
retrieving revision 1.15
diff -u -r1.15 StringBuffer.java
--- libjava/java/lang/StringBuffer.java 24 Mar 2003 00:50:18 -0000 1.15
+++ libjava/java/lang/StringBuffer.java 21 Sep 2003 09:00:42 -0000
@@ -565,7 +565,9 @@
if (len == 0)
return "";
// Share the char[] unless 3/4 empty.
- shared = (len << 2) >= value.length;
+ boolean shared = (len << 2) >= value.length;
+ if (shared)
+ this.shared = true;
// Package constructor avoids an array copy.
return new String(value, beginIndex, len, shared);
}
--- /dev/null 2003-09-16 01:40:47.000000000 +1200
+++ libjava/testsuite/libjava.lang/PR12350.java 2003-09-21 20:57:09.617077564 +1200
@@ -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);
+ }
+
+}
--- /dev/null 2003-09-16 01:40:47.000000000 +1200
+++ libjava/testsuite/libjava.lang/PR12350.out 2003-09-21 19:38:39.000000000 +1200
@@ -0,0 +1 @@
+Good string. More than 16 chars.