aboutsummaryrefslogtreecommitdiff
path: root/libjava/java/lang/StringBuffer.java
diff options
context:
space:
mode:
authorAnthony Green <green@redhat.com>2004-02-25 19:52:58 +0000
committerAnthony Green <green@gcc.gnu.org>2004-02-25 19:52:58 +0000
commitb29610b3cfc461e3cd119c6892c31a0832d9daaf (patch)
tree03f26a2528069bc59ece0611b1e7167fc4700f47 /libjava/java/lang/StringBuffer.java
parent7b79fe713d8a89ca30fbabbae2366abfbf0a29eb (diff)
downloadgcc-b29610b3cfc461e3cd119c6892c31a0832d9daaf.zip
gcc-b29610b3cfc461e3cd119c6892c31a0832d9daaf.tar.gz
gcc-b29610b3cfc461e3cd119c6892c31a0832d9daaf.tar.bz2
de-pessimization
From-SVN: r78447
Diffstat (limited to 'libjava/java/lang/StringBuffer.java')
-rw-r--r--libjava/java/lang/StringBuffer.java25
1 files changed, 21 insertions, 4 deletions
diff --git a/libjava/java/lang/StringBuffer.java b/libjava/java/lang/StringBuffer.java
index 92f9615..293b97d 100644
--- a/libjava/java/lang/StringBuffer.java
+++ b/libjava/java/lang/StringBuffer.java
@@ -1,5 +1,6 @@
/* StringBuffer.java -- Growable strings
- Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
+ Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004
+ Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -205,10 +206,26 @@ public final class StringBuffer implements Serializable, CharSequence
if (newLength < 0)
throw new StringIndexOutOfBoundsException(newLength);
+ int valueLength = value.length;
+
+ /* Always call ensureCapacity_unsynchronized in order to preserve
+ copy-on-write semantics. */
ensureCapacity_unsynchronized(newLength);
- while (count < newLength)
- value[count++] = '\0';
- count = newLength;
+
+ if (newLength < valueLength)
+ {
+ /* If the StringBuffer's value just grew, then we know that
+ value is newly allocated and the region between count and
+ newLength is filled with '\0'. */
+ count = newLength;
+ }
+ else
+ {
+ /* The StringBuffer's value doesn't need to grow. However,
+ we should clear out any cruft that may exist. */
+ while (count < newLength)
+ value[count++] = '\0';
+ }
}
/**