StringBuffer patch.

2000-04-01 Thread Mo DeJong


Hello.

Between revisions 1.11 and 1.12 of
libraries/javalib/java/lang/StringBuffer.java
the access of the StringBuffer.ensureCapacity(int)V method was changed
from public to private.

+private void ensureCapacity(int minCapacity) {
+   if (minCapacity = 0)
+   return;
+   synchronized (this) {
+   ensureCapacity(minCapacity, false);
+   }
 }
 
-public synchronized void ensureCapacity ( int minimumCapacity ) {
-   intn;
-   char[] oldBuffer;
+// This method assumes synchronization



This was an error, the method should be public. The change generated
errors like the following in my code.

l:/home/mo/project/kaffe/install/share/kaffe/Klasses.jar \
/home/mo/bin/jikes -g \
-d /home/mo/project/tcljava/unix/Kaffe/jacl \
tcl/lang/*.java sunlabs/brazil/util/regexp/*.java

Found 6 semantic errors compiling "tcl/lang/FileUtil.java":

89. absBuf.ensureCapacity(absBuf.length() + path.length());

*** Error: Method "void ensureCapacity(int $1);" in class
"java/lang/StringBuffer" has private access. Therefore, it is not
accessible in class "tcl/lang/FileUtil".




The following patch fixes the problem.


Sat Apr  1 08:00:00 PST 2000  Mo DeJong [EMAIL PROTECTED]

* libraries/javalib/java/lang/StringBuffer.java: fixed
problem with ensureCapacity() method, it was accidently
changed to private access when it should have been public.



Index: libraries/javalib/java/lang/StringBuffer.java
===
RCS file: /cvs/kaffe/kaffe/libraries/javalib/java/lang/StringBuffer.java,v
retrieving revision 1.12
diff -u -r1.12 StringBuffer.java
--- libraries/javalib/java/lang/StringBuffer.java   2000/03/31
23:29:591.12
+++ libraries/javalib/java/lang/StringBuffer.java   2000/04/01
12:43:13
@@ -104,7 +104,7 @@
}
 }
 
-private void ensureCapacity(int minCapacity) {
+public void ensureCapacity(int minCapacity) {
if (minCapacity = 0)
return;
synchronized (this) {



Mo Dejong
Red Hat Inc.




Re: StringBuffer patch.

2000-04-01 Thread Archie Cobbs


Mo DeJong writes:
 Between revisions 1.11 and 1.12 of
 libraries/javalib/java/lang/StringBuffer.java
 the access of the StringBuffer.ensureCapacity(int)V method was changed
 from public to private.

Oops, my fault -- should be fixed now.

-Archie

___
Archie Cobbs   *   Whistle Communications, Inc.  *   http://www.whistle.com



Re: Problem with StringBuffer

2000-04-01 Thread Archie Cobbs


Wolfgang Muees writes:
  I finally found out the reason for 'memory leak' on my Java program,
  and the culprit in this case was StringBuffer - implementation.
  
  I have a lexer (made with JFLex), that uses StringBuffer for
  constructing
  the strings for certain tokens. The StringBuffer is reused so that each
  time a new such token is getting creted, StringBuffer.setLength(0) is
  called. However, in Kaffe's implementation at least, the actual length
  of the buffer is not changed. This wouldn't be a big problem in itself,
  as there's just one StringBuffer instance... But, alas, as Strings 
  StringBuffers are optimized so that when new String(StringBuffer) is
  called, the character array is actually shared between the string
  and string buffer, until the StringBuffer needs to change the data
  (or length of the buffer via setLength()). The problem here is that
  as soon as I encounter a long token (~4000 chars in this case),
  _all_ tokens after that will use up the same 4k memory
 
 The right solution for this problem is IMO: don't reuse StringBuffer.
 It is designed primary as an input buffer for a single string.

Yesterday I checked in some changes which should alleviate this
problem nonetheless.. please give them a try and let us know if
they help.

-Archie

___
Archie Cobbs   *   Whistle Communications, Inc.  *   http://www.whistle.com