diff options
author | Anthony Green <green@redhat.com> | 2004-02-25 19:52:58 +0000 |
---|---|---|
committer | Anthony Green <green@gcc.gnu.org> | 2004-02-25 19:52:58 +0000 |
commit | b29610b3cfc461e3cd119c6892c31a0832d9daaf (patch) | |
tree | 03f26a2528069bc59ece0611b1e7167fc4700f47 /libjava/java/lang/StringBuffer.java | |
parent | 7b79fe713d8a89ca30fbabbae2366abfbf0a29eb (diff) | |
download | gcc-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.java | 25 |
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'; + } } /** |