This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[Fwd: Re: Patch: remove redundant loop in StringBuffer]
- From: Anthony Green <green at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Wed, 25 Feb 2004 11:55:25 -0800
- Subject: [Fwd: Re: Patch: remove redundant loop in StringBuffer]
- Organization: Red Hat, Inc.
FYI, I've committed this patch to HEAD in libgcj...
AG
-----Forwarded Message-----
From: Anthony Green <green@redhat.com>
To: Tom Tromey <tromey@redhat.com>
Cc: classpath@gnu.org
Subject: Re: Patch: remove redundant loop in StringBuffer
Date: Tue, 24 Feb 2004 09:26:06 -0800
On Tue, 2004-02-24 at 08:25, Tom Tromey wrote:
> Suppose you do:
Oh, right - because we're growing the string, and not just the
underlying array.
Ok - here's a revised patch that eliminates the redundant loop in the
most common case.
2004-02-24 Anthony Green <green@redhat.com>
* java/lang/StringBuffer.java: No need to NULL out remainder of
buffer since ensureCapacity_unsynchronized will have done this for
us.
Index: java/lang/StringBuffer.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/lang/StringBuffer.java,v
retrieving revision 1.25
diff -c -p -r1.25 StringBuffer.java
*** java/lang/StringBuffer.java 18 Oct 2003 08:45:37 -0000 1.25
--- java/lang/StringBuffer.java 24 Feb 2004 17:20:43 -0000
***************
*** 1,5 ****
/* StringBuffer.java -- Growable strings
! Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
--- 1,6 ----
/* StringBuffer.java -- Growable strings
! Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004
! Free Software Foundation, Inc.
This file is part of GNU Classpath.
*************** public final class StringBuffer implemen
*** 205,214 ****
if (newLength < 0)
throw new StringIndexOutOfBoundsException(newLength);
ensureCapacity_unsynchronized(newLength);
! while (count < newLength)
! value[count++] = '\0';
! count = newLength;
}
/**
--- 206,231 ----
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);
!
! 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 didn't grow. However,
! we should clear out any cruft that may exist. */
! while (count < newLength)
! value[count++] = '\0';
! }
}
/**
--
Anthony Green <green@redhat.com>
Red Hat, Inc.