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]

[Fwd: Re: Patch: remove redundant loop in StringBuffer]


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.


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