From b29610b3cfc461e3cd119c6892c31a0832d9daaf Mon Sep 17 00:00:00 2001 From: Anthony Green Date: Wed, 25 Feb 2004 19:52:58 +0000 Subject: de-pessimization From-SVN: r78447 --- libjava/java/lang/StringBuffer.java | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'libjava/java/lang/StringBuffer.java') 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'; + } } /** -- cgit v1.1