This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]