Index: Makefile.in =================================================================== --- Makefile.in (revision 140114) +++ Makefile.in (working copy) @@ -352,12 +352,11 @@ java/lang/natConcreteProcess.cc java/lang/natVMDouble.cc \ java/lang/natVMFloat.cc java/lang/natMath.cc \ java/lang/natObject.cc java/lang/natRuntime.cc \ - java/lang/natString.cc java/lang/natStringBuffer.cc \ - java/lang/natStringBuilder.cc java/lang/natSystem.cc \ - java/lang/natThread.cc java/lang/natThreadLocal.cc \ - java/lang/natVMClassLoader.cc java/lang/natVMProcess.cc \ - java/lang/natVMThrowable.cc java/lang/ref/natReference.cc \ - java/lang/reflect/natArray.cc \ + java/lang/natString.cc java/lang/natAbstractStringBuffer.cc \ + java/lang/natSystem.cc java/lang/natThread.cc \ + java/lang/natThreadLocal.cc java/lang/natVMClassLoader.cc \ + java/lang/natVMProcess.cc java/lang/natVMThrowable.cc \ + java/lang/ref/natReference.cc java/lang/reflect/natArray.cc \ java/lang/reflect/natConstructor.cc \ java/lang/reflect/natField.cc java/lang/reflect/natMethod.cc \ java/lang/reflect/natVMProxy.cc java/net/natVMInetAddress.cc \ @@ -417,12 +416,11 @@ java/lang/natConcreteProcess.lo java/lang/natVMDouble.lo \ java/lang/natVMFloat.lo java/lang/natMath.lo \ java/lang/natObject.lo java/lang/natRuntime.lo \ - java/lang/natString.lo java/lang/natStringBuffer.lo \ - java/lang/natStringBuilder.lo java/lang/natSystem.lo \ - java/lang/natThread.lo java/lang/natThreadLocal.lo \ - java/lang/natVMClassLoader.lo java/lang/natVMProcess.lo \ - java/lang/natVMThrowable.lo java/lang/ref/natReference.lo \ - java/lang/reflect/natArray.lo \ + java/lang/natString.lo java/lang/natAbstractStringBuffer.lo \ + java/lang/natSystem.lo java/lang/natThread.lo \ + java/lang/natThreadLocal.lo java/lang/natVMClassLoader.lo \ + java/lang/natVMProcess.lo java/lang/natVMThrowable.lo \ + java/lang/ref/natReference.lo java/lang/reflect/natArray.lo \ java/lang/reflect/natConstructor.lo \ java/lang/reflect/natField.lo java/lang/reflect/natMethod.lo \ java/lang/reflect/natVMProxy.lo java/net/natVMInetAddress.lo \ @@ -8443,8 +8441,7 @@ java/lang/natObject.cc \ java/lang/natRuntime.cc \ java/lang/natString.cc \ -java/lang/natStringBuffer.cc \ -java/lang/natStringBuilder.cc \ +java/lang/natAbstractStringBuffer.cc \ java/lang/natSystem.cc \ java/lang/natThread.cc \ java/lang/natThreadLocal.cc \ @@ -8961,10 +8958,8 @@ java/lang/$(DEPDIR)/$(am__dirstamp) java/lang/natString.lo: java/lang/$(am__dirstamp) \ java/lang/$(DEPDIR)/$(am__dirstamp) -java/lang/natStringBuffer.lo: java/lang/$(am__dirstamp) \ +java/lang/natAbstractStringBuffer.lo: java/lang/$(am__dirstamp) \ java/lang/$(DEPDIR)/$(am__dirstamp) -java/lang/natStringBuilder.lo: java/lang/$(am__dirstamp) \ - java/lang/$(DEPDIR)/$(am__dirstamp) java/lang/natSystem.lo: java/lang/$(am__dirstamp) \ java/lang/$(DEPDIR)/$(am__dirstamp) java/lang/natThread.lo: java/lang/$(am__dirstamp) \ @@ -9395,6 +9390,8 @@ -rm -f java/io/natVMObjectStreamClass.lo -rm -f java/lang/Object.$(OBJEXT) -rm -f java/lang/Object.lo + -rm -f java/lang/natAbstractStringBuffer.$(OBJEXT) + -rm -f java/lang/natAbstractStringBuffer.lo -rm -f java/lang/natCharacter.$(OBJEXT) -rm -f java/lang/natCharacter.lo -rm -f java/lang/natClass.$(OBJEXT) @@ -9411,10 +9408,6 @@ -rm -f java/lang/natRuntime.lo -rm -f java/lang/natString.$(OBJEXT) -rm -f java/lang/natString.lo - -rm -f java/lang/natStringBuffer.$(OBJEXT) - -rm -f java/lang/natStringBuffer.lo - -rm -f java/lang/natStringBuilder.$(OBJEXT) - -rm -f java/lang/natStringBuilder.lo -rm -f java/lang/natSystem.$(OBJEXT) -rm -f java/lang/natSystem.lo -rm -f java/lang/natThread.$(OBJEXT) @@ -9566,6 +9559,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@java/io/$(DEPDIR)/natVMObjectInputStream.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/io/$(DEPDIR)/natVMObjectStreamClass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/Object.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natAbstractStringBuffer.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natCharacter.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natClass.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natClassLoader.Plo@am__quote@ @@ -9574,8 +9568,6 @@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natObject.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natRuntime.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natString.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natStringBuffer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natStringBuilder.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natSystem.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natThread.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@java/lang/$(DEPDIR)/natThreadLocal.Plo@am__quote@ Index: classpath/lib/java/lang/AbstractStringBuffer.class =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: classpath/lib/java/lang/StringBuffer.class =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: classpath/lib/java/lang/StringBuilder.class =================================================================== Cannot display: file marked as a binary type. svn:mime-type = application/octet-stream Index: java/lang/StringBuffer.java =================================================================== --- java/lang/StringBuffer.java (revision 140114) +++ java/lang/StringBuffer.java (working copy) @@ -1,5 +1,5 @@ /* StringBuffer.java -- Growable strings - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -360,6 +360,33 @@ } /** + * Append the String value of the argument to this + * StringBuffer. Uses String.valueOf() to convert + * to String. + * + * @param bool the boolean to convert and append + * @return this StringBuffer + * @see String#valueOf(boolean) + */ + public synchronized StringBuffer append(boolean bool) + { + super.append(bool); + return this; + } + + /** + * Append the char to this StringBuffer. + * + * @param ch the char to append + * @return this StringBuffer + */ + public synchronized StringBuffer append(char ch) + { + super.append(ch); + return this; + } + + /** * Append the characters in the CharSequence to this * buffer. * @@ -369,8 +396,6 @@ */ public synchronized StringBuffer append(CharSequence seq) { - if (seq == null) - seq = "null"; super.append(seq, 0, seq.length()); return this; } @@ -397,45 +422,22 @@ * StringBuffer. Uses String.valueOf() to convert * to String. * - * @param bool the boolean to convert and append + * @param inum the int to convert and append * @return this StringBuffer - * @see String#valueOf(boolean) + * @see String#valueOf(int) */ - public synchronized StringBuffer append(boolean bool) + // This is native in libgcj, for efficiency. + public synchronized StringBuffer append(int inum) { - super.append(bool); + super.append(inum); return this; } /** - * Append the char to this StringBuffer. - * - * @param ch the char to append - * @return this StringBuffer - */ - public synchronized StringBuffer append(char ch) - { - super.append(ch); - return this; - } - - /** * Append the String value of the argument to this * StringBuffer. Uses String.valueOf() to convert * to String. * - * @param inum the int to convert and append - * @return this StringBuffer - * @see String#valueOf(int) - */ - // GCJ LOCAL: this is native for efficiency. - public native StringBuffer append (int inum); - - /** - * Append the String value of the argument to this - * StringBuffer. Uses String.valueOf() to convert - * to String. - * * @param lnum the long to convert and append * @return this StringBuffer * @see String#valueOf(long) @@ -971,19 +973,4 @@ } } - /** - * Predicate which determines if a substring of this matches another String - * starting at a specified offset for each String and continuing for a - * specified length. This is more efficient than creating a String to call - * indexOf on. - * - * @param toffset index to start comparison at for this String - * @param other non-null String to compare to region of this - * @return true if regions match, false otherwise - * @see #indexOf(String, int) - * @see #lastIndexOf(String, int) - * @see String#regionMatches(boolean, int, String, int, int) - */ - // GCJ LOCAL: native for gcj. - private native boolean regionMatches(int toffset, String other); } Index: java/lang/StringBuilder.h =================================================================== --- java/lang/StringBuilder.h (revision 140114) +++ java/lang/StringBuilder.h (working copy) @@ -6,11 +6,11 @@ #pragma interface -#include +#include #include -class java::lang::StringBuilder : public ::java::lang::Object +class java::lang::StringBuilder : public ::java::lang::AbstractStringBuffer { public: @@ -20,66 +20,75 @@ StringBuilder(::java::lang::CharSequence *); jint length(); jint capacity(); - void ensureCapacity(jint); - void setLength(jint); - jchar charAt(jint); - void getChars(jint, jint, JArray< jchar > *, jint); - void setCharAt(jint, jchar); - ::java::lang::StringBuilder * append(::java::lang::Object *); - ::java::lang::StringBuilder * append(::java::lang::String *); - ::java::lang::StringBuilder * append(::java::lang::StringBuffer *); - ::java::lang::StringBuilder * append(JArray< jchar > *); - ::java::lang::StringBuilder * append(JArray< jchar > *, jint, jint); - ::java::lang::StringBuilder * append(jboolean); + ::java::lang::StringBuilder * StringBuilder$append(::java::lang::Object *); + ::java::lang::StringBuilder * StringBuilder$append(::java::lang::String *); + ::java::lang::StringBuilder * StringBuilder$append(::java::lang::StringBuffer *); + ::java::lang::StringBuilder * StringBuilder$append(JArray< jchar > *); + ::java::lang::StringBuilder * StringBuilder$append(JArray< jchar > *, jint, jint); + ::java::lang::StringBuilder * StringBuilder$append(jboolean); ::java::lang::StringBuilder * StringBuilder$append(jchar); ::java::lang::StringBuilder * StringBuilder$append(::java::lang::CharSequence *); ::java::lang::StringBuilder * StringBuilder$append(::java::lang::CharSequence *, jint, jint); - ::java::lang::StringBuilder * appendCodePoint(jint); - ::java::lang::StringBuilder * append(jint); - ::java::lang::StringBuilder * append(jlong); - ::java::lang::StringBuilder * append(jfloat); - ::java::lang::StringBuilder * append(jdouble); - ::java::lang::StringBuilder * delete$(jint, jint); - ::java::lang::StringBuilder * deleteCharAt(jint); - ::java::lang::StringBuilder * replace(jint, jint, ::java::lang::String *); + ::java::lang::StringBuilder * StringBuilder$append(jint); + ::java::lang::StringBuilder * StringBuilder$append(jlong); + ::java::lang::StringBuilder * StringBuilder$append(jfloat); + ::java::lang::StringBuilder * StringBuilder$append(jdouble); + ::java::lang::StringBuilder * StringBuilder$appendCodePoint(jint); + ::java::lang::StringBuilder * StringBuilder$delete(jint, jint); + ::java::lang::StringBuilder * StringBuilder$deleteCharAt(jint); + ::java::lang::StringBuilder * StringBuilder$replace(jint, jint, ::java::lang::String *); ::java::lang::String * substring(jint); ::java::lang::CharSequence * subSequence(jint, jint); ::java::lang::String * substring(jint, jint); - ::java::lang::StringBuilder * insert(jint, JArray< jchar > *, jint, jint); - ::java::lang::StringBuilder * insert(jint, ::java::lang::Object *); - ::java::lang::StringBuilder * insert(jint, ::java::lang::String *); - ::java::lang::StringBuilder * insert(jint, ::java::lang::CharSequence *); - ::java::lang::StringBuilder * insert(jint, ::java::lang::CharSequence *, jint, jint); - ::java::lang::StringBuilder * insert(jint, JArray< jchar > *); - ::java::lang::StringBuilder * insert(jint, jboolean); - ::java::lang::StringBuilder * insert(jint, jchar); - ::java::lang::StringBuilder * insert(jint, jint); - ::java::lang::StringBuilder * insert(jint, jlong); - ::java::lang::StringBuilder * insert(jint, jfloat); - ::java::lang::StringBuilder * insert(jint, jdouble); - jint indexOf(::java::lang::String *); - jint indexOf(::java::lang::String *, jint); - jint lastIndexOf(::java::lang::String *); - jint lastIndexOf(::java::lang::String *, jint); - ::java::lang::StringBuilder * reverse(); + ::java::lang::StringBuilder * StringBuilder$insert(jint, JArray< jchar > *, jint, jint); + ::java::lang::StringBuilder * StringBuilder$insert(jint, ::java::lang::Object *); + ::java::lang::StringBuilder * StringBuilder$insert(jint, ::java::lang::String *); + ::java::lang::StringBuilder * StringBuilder$insert(jint, ::java::lang::CharSequence *); + ::java::lang::StringBuilder * StringBuilder$insert(jint, ::java::lang::CharSequence *, jint, jint); + ::java::lang::StringBuilder * StringBuilder$insert(jint, JArray< jchar > *); + ::java::lang::StringBuilder * StringBuilder$insert(jint, jboolean); + ::java::lang::StringBuilder * StringBuilder$insert(jint, jchar); + ::java::lang::StringBuilder * StringBuilder$insert(jint, jint); + ::java::lang::StringBuilder * StringBuilder$insert(jint, jlong); + ::java::lang::StringBuilder * StringBuilder$insert(jint, jfloat); + ::java::lang::StringBuilder * StringBuilder$insert(jint, jdouble); + ::java::lang::StringBuilder * StringBuilder$reverse(); ::java::lang::String * toString(); -private: - jboolean regionMatches(jint, ::java::lang::String *); -public: - jint codePointAt(jint); - jint codePointBefore(jint); - jint codePointCount(jint, jint); - void trimToSize(); + ::java::lang::AbstractStringBuffer * reverse(); + ::java::lang::AbstractStringBuffer * deleteCharAt(jint); + ::java::lang::AbstractStringBuffer * replace(jint, jint, ::java::lang::String *); + ::java::lang::AbstractStringBuffer * delete$(jint, jint); + ::java::lang::AbstractStringBuffer * insert(jint, jdouble); + ::java::lang::AbstractStringBuffer * insert(jint, jfloat); + ::java::lang::AbstractStringBuffer * insert(jint, jlong); + ::java::lang::AbstractStringBuffer * insert(jint, jint); + ::java::lang::AbstractStringBuffer * insert(jint, jchar); + ::java::lang::AbstractStringBuffer * insert(jint, jboolean); + ::java::lang::AbstractStringBuffer * insert(jint, JArray< jchar > *); + ::java::lang::AbstractStringBuffer * insert(jint, ::java::lang::CharSequence *, jint, jint); + ::java::lang::AbstractStringBuffer * insert(jint, ::java::lang::CharSequence *); + ::java::lang::AbstractStringBuffer * insert(jint, ::java::lang::String *); + ::java::lang::AbstractStringBuffer * insert(jint, ::java::lang::Object *); + ::java::lang::AbstractStringBuffer * insert(jint, JArray< jchar > *, jint, jint); + ::java::lang::AbstractStringBuffer * append(jdouble); + ::java::lang::AbstractStringBuffer * append(jfloat); + ::java::lang::AbstractStringBuffer * append(jlong); + ::java::lang::AbstractStringBuffer * append(jint); ::java::lang::Appendable * append(::java::lang::CharSequence *, jint, jint); + ::java::lang::AbstractStringBuffer * AbstractStringBuffer$append(::java::lang::CharSequence *, jint, jint); ::java::lang::Appendable * append(::java::lang::CharSequence *); + ::java::lang::AbstractStringBuffer * AbstractStringBuffer$append(::java::lang::CharSequence *); ::java::lang::Appendable * append(jchar); + ::java::lang::AbstractStringBuffer * AbstractStringBuffer$append(jchar); + ::java::lang::AbstractStringBuffer * append(jboolean); + ::java::lang::AbstractStringBuffer * append(JArray< jchar > *, jint, jint); + ::java::lang::AbstractStringBuffer * append(JArray< jchar > *); + ::java::lang::AbstractStringBuffer * append(::java::lang::StringBuffer *); + ::java::lang::AbstractStringBuffer * append(::java::lang::String *); + ::java::lang::AbstractStringBuffer * append(::java::lang::Object *); + ::java::lang::AbstractStringBuffer * appendCodePoint(jint); private: static const jlong serialVersionUID = 4383685877147921099LL; -public: // actually package-private - jint __attribute__((aligned(__alignof__( ::java::lang::Object)))) count; - JArray< jchar > * value; -private: - static const jint DEFAULT_CAPACITY = 16; public: static ::java::lang::Class class$; }; Index: java/lang/natStringBuilder.cc =================================================================== --- java/lang/natStringBuilder.cc (revision 140114) +++ java/lang/natStringBuilder.cc (working copy) @@ -1,29 +0,0 @@ -// Native methods for StringBuilder. - -/* Copyright (C) 2005 Free Software Foundation - - This file is part of libgcj. - -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ - -#include -#include -#include -#include - -jboolean -java::lang::StringBuilder::regionMatches(jint offset, jstring other) -{ - int len = other->count; - int index = 0; - jchar *sc = elements (value); - jchar *oc = _Jv_GetStringChars (other); - while (--len >= 0) - { - if (sc[offset++] != oc[index++]) - return false; - } - return true; -} Index: java/lang/AbstractStringBuffer.java =================================================================== --- java/lang/AbstractStringBuffer.java (revision 140114) +++ java/lang/AbstractStringBuffer.java (working copy) @@ -436,11 +436,8 @@ * @return this StringBuffer * @see String#valueOf(int) */ - // This is native in libgcj, for efficiency. - public AbstractStringBuffer append(int inum) - { - return append(String.valueOf(inum)); - } + // GCJ LOCAL: this is native for efficiency. + public native AbstractStringBuffer append (int inum); /** * Append the String value of the argument to this @@ -1024,17 +1021,7 @@ * @see #lastIndexOf(String, int) * @see String#regionMatches(boolean, int, String, int, int) */ - private boolean regionMatches(int toffset, String other) - { - /* - int len = other.count; - int index = other.offset; - while (--len >= 0) - if (value[toffset++] != other.value[index++]) - return false; - return true; - */ - throw new UnsupportedOperationException(); - } + // GCJ LOCAL: native for gcj. + private native boolean regionMatches(int toffset, String other); } Index: java/lang/StringBuffer.h =================================================================== --- java/lang/StringBuffer.h (revision 140114) +++ java/lang/StringBuffer.h (working copy) @@ -32,10 +32,10 @@ ::java::lang::StringBuffer * StringBuffer$append(::java::lang::StringBuffer *); ::java::lang::StringBuffer * StringBuffer$append(JArray< jchar > *); ::java::lang::StringBuffer * StringBuffer$append(JArray< jchar > *, jint, jint); - ::java::lang::StringBuffer * StringBuffer$append(::java::lang::CharSequence *); - ::java::lang::StringBuffer * StringBuffer$append(::java::lang::CharSequence *, jint, jint); ::java::lang::StringBuffer * StringBuffer$append(jboolean); ::java::lang::StringBuffer * StringBuffer$append(jchar); + ::java::lang::StringBuffer * StringBuffer$append(::java::lang::CharSequence *); + ::java::lang::StringBuffer * StringBuffer$append(::java::lang::CharSequence *, jint, jint); ::java::lang::StringBuffer * StringBuffer$append(jint); ::java::lang::StringBuffer * StringBuffer$append(jlong); ::java::lang::StringBuffer * StringBuffer$append(jfloat); @@ -70,8 +70,6 @@ jint offsetByCodePoints(jint, jint); public: // actually package-private void ensureCapacity_unsynchronized(jint); -private: - jboolean regionMatches(jint, ::java::lang::String *); public: ::java::lang::AbstractStringBuffer * reverse(); ::java::lang::AbstractStringBuffer * deleteCharAt(jint); @@ -93,13 +91,13 @@ ::java::lang::AbstractStringBuffer * append(jfloat); ::java::lang::AbstractStringBuffer * append(jlong); ::java::lang::AbstractStringBuffer * append(jint); - ::java::lang::Appendable * append(jchar); - ::java::lang::AbstractStringBuffer * AbstractStringBuffer$append(jchar); - ::java::lang::AbstractStringBuffer * append(jboolean); ::java::lang::Appendable * append(::java::lang::CharSequence *, jint, jint); ::java::lang::AbstractStringBuffer * AbstractStringBuffer$append(::java::lang::CharSequence *, jint, jint); ::java::lang::Appendable * append(::java::lang::CharSequence *); ::java::lang::AbstractStringBuffer * AbstractStringBuffer$append(::java::lang::CharSequence *); + ::java::lang::Appendable * append(jchar); + ::java::lang::AbstractStringBuffer * AbstractStringBuffer$append(jchar); + ::java::lang::AbstractStringBuffer * append(jboolean); ::java::lang::AbstractStringBuffer * append(JArray< jchar > *, jint, jint); ::java::lang::AbstractStringBuffer * append(JArray< jchar > *); ::java::lang::AbstractStringBuffer * append(::java::lang::StringBuffer *); Index: java/lang/natStringBuffer.cc =================================================================== --- java/lang/natStringBuffer.cc (revision 140114) +++ java/lang/natStringBuffer.cc (working copy) @@ -1,42 +0,0 @@ -// natStringBuffer.cc - Implementation of java.lang.StringBuffer native methods. - -/* Copyright (C) 2001, 2003 Free Software Foundation - - This file is part of libgcj. - -This software is copyrighted work licensed under the terms of the -Libgcj License. Please consult the file "LIBGCJ_LICENSE" for -details. */ - -#include -#include -#include - -java::lang::StringBuffer* -java::lang::StringBuffer::StringBuffer$append (jint num) -{ - // Use an array large enough for "-2147483648"; i.e. 11 chars. - jchar buffer[11]; - int i = _Jv_FormatInt (buffer+11, num); - JvSynchronize dummy (this); - jint needed = count + i; - ensureCapacity_unsynchronized (needed); - jchar* dst = elements (value) + count; - jchar* src = buffer+11-i; - while (--i >= 0) - *dst++ = *src++; - count = needed; - return this; -} - -jboolean -java::lang::StringBuffer::regionMatches(jint toffset, jstring other) -{ - jint len = other->count; - jchar *tptr = elements(value) + toffset; - jchar *optr = JvGetStringChars(other); - while (--len >= 0) - if (*tptr++ != *optr++) - return false; - return true; -} Index: java/lang/StringBuilder.java =================================================================== --- java/lang/StringBuilder.java (revision 140114) +++ java/lang/StringBuilder.java (working copy) @@ -1,5 +1,5 @@ /* StringBuilder.java -- Unsynchronized growable strings - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -75,6 +75,7 @@ * @since 1.5 */ public final class StringBuilder + extends AbstractStringBuffer implements Serializable, CharSequence, Appendable { // Implementation note: if you change this class, you usually will @@ -86,33 +87,11 @@ private static final long serialVersionUID = 4383685877147921099L; /** - * Index of next available character (and thus the size of the current - * string contents). Note that this has permissions set this way so that - * String can get the value. - * - * @serial the number of characters in the buffer - */ - int count; - - /** - * The buffer. Note that this has permissions set this way so that String - * can get the value. - * - * @serial the buffer - */ - char[] value; - - /** - * The default capacity of a buffer. - */ - private static final int DEFAULT_CAPACITY = 16; - - /** * Create a new StringBuilder with default capacity 16. */ public StringBuilder() { - this(DEFAULT_CAPACITY); + super(); } /** @@ -124,7 +103,7 @@ */ public StringBuilder(int capacity) { - value = new char[capacity]; + super(capacity); } /** @@ -137,10 +116,7 @@ */ public StringBuilder(String str) { - // Unfortunately, because the size is 16 larger, we cannot share. - count = str.count; - value = new char[count + DEFAULT_CAPACITY]; - str.getChars(0, count, value, 0); + super(str); } /** @@ -154,11 +130,7 @@ */ public StringBuilder(CharSequence seq) { - int len = seq.length(); - count = len <= 0 ? 0 : len; - value = new char[count + DEFAULT_CAPACITY]; - for (int i = 0; i < len; ++i) - value[i] = seq.charAt(i); + super(seq); } /** @@ -189,122 +161,6 @@ } /** - * Increase the capacity of this StringBuilder. This will - * ensure that an expensive growing operation will not occur until - * minimumCapacity is reached. The buffer is grown to the - * larger of minimumCapacity and - * capacity() * 2 + 2, if it is not already large enough. - * - * @param minimumCapacity the new capacity - * @see #capacity() - */ - public void ensureCapacity(int minimumCapacity) - { - if (minimumCapacity > value.length) - { - int max = value.length * 2 + 2; - minimumCapacity = (minimumCapacity < max ? max : minimumCapacity); - char[] nb = new char[minimumCapacity]; - System.arraycopy(value, 0, nb, 0, count); - value = nb; - } - } - - /** - * Set the length of this StringBuilder. If the new length is greater than - * the current length, all the new characters are set to '\0'. If the new - * length is less than the current length, the first newLength - * characters of the old array will be preserved, and the remaining - * characters are truncated. - * - * @param newLength the new length - * @throws IndexOutOfBoundsException if the new length is negative - * (while unspecified, this is a StringIndexOutOfBoundsException) - * @see #length() - */ - public void setLength(int newLength) - { - if (newLength < 0) - throw new StringIndexOutOfBoundsException(newLength); - - int valueLength = value.length; - - /* Always call ensureCapacity in order to preserve copy-on-write - semantics. */ - ensureCapacity(newLength); - - if (newLength < valueLength) - { - /* If the StringBuilder'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 StringBuilder's value doesn't need to grow. However, - we should clear out any cruft that may exist. */ - while (count < newLength) - value[count++] = '\0'; - } - } - - /** - * Get the character at the specified index. - * - * @param index the index of the character to get, starting at 0 - * @return the character at the specified index - * @throws IndexOutOfBoundsException if index is negative or >= length() - * (while unspecified, this is a StringIndexOutOfBoundsException) - */ - public char charAt(int index) - { - if (index < 0 || index >= count) - throw new StringIndexOutOfBoundsException(index); - return value[index]; - } - - /** - * Get the specified array of characters. srcOffset - srcEnd - * characters will be copied into the array you pass in. - * - * @param srcOffset the index to start copying from (inclusive) - * @param srcEnd the index to stop copying from (exclusive) - * @param dst the array to copy into - * @param dstOffset the index to start copying into - * @throws NullPointerException if dst is null - * @throws IndexOutOfBoundsException if any source or target indices are - * out of range (while unspecified, source problems cause a - * StringIndexOutOfBoundsException, and dest problems cause an - * ArrayIndexOutOfBoundsException) - * @see System#arraycopy(Object, int, Object, int, int) - */ - public void getChars(int srcOffset, int srcEnd, - char[] dst, int dstOffset) - { - if (srcOffset < 0 || srcEnd > count || srcEnd < srcOffset) - throw new StringIndexOutOfBoundsException(); - System.arraycopy(value, srcOffset, dst, dstOffset, srcEnd - srcOffset); - } - - /** - * Set the character at the specified index. - * - * @param index the index of the character to set starting at 0 - * @param ch the value to set that character to - * @throws IndexOutOfBoundsException if index is negative or >= length() - * (while unspecified, this is a StringIndexOutOfBoundsException) - */ - public void setCharAt(int index, char ch) - { - if (index < 0 || index >= count) - throw new StringIndexOutOfBoundsException(index); - // Call ensureCapacity to enforce copy-on-write. - ensureCapacity(count); - value[index] = ch; - } - - /** * Append the String value of the argument to this * StringBuilder. Uses String.valueOf() to convert * to String. @@ -316,7 +172,8 @@ */ public StringBuilder append(Object obj) { - return append(obj == null ? "null" : obj.toString()); + super.append(obj); + return this; } /** @@ -328,12 +185,7 @@ */ public StringBuilder append(String str) { - if (str == null) - str = "null"; - int len = str.count; - ensureCapacity(count + len); - str.getChars(0, len, value, count); - count += len; + super.append(str); return this; } @@ -348,15 +200,7 @@ */ public StringBuilder append(StringBuffer stringBuffer) { - if (stringBuffer == null) - return append("null"); - synchronized (stringBuffer) - { - int len = stringBuffer.count; - ensureCapacity(count + len); - System.arraycopy(stringBuffer.value, 0, value, count, len); - count += len; - } + super.append(stringBuffer); return this; } @@ -372,7 +216,8 @@ */ public StringBuilder append(char[] data) { - return append(data, 0, data.length); + super.append(data, 0, data.length); + return this; } /** @@ -391,11 +236,7 @@ */ public StringBuilder append(char[] data, int offset, int count) { - if (offset < 0 || count < 0 || offset > data.length - count) - throw new StringIndexOutOfBoundsException(); - ensureCapacity(this.count + count); - System.arraycopy(data, offset, value, this.count, count); - this.count += count; + super.append(data, offset, count); return this; } @@ -410,7 +251,8 @@ */ public StringBuilder append(boolean bool) { - return append(bool ? "true" : "false"); + super.append(bool); + return this; } /** @@ -421,8 +263,7 @@ */ public StringBuilder append(char ch) { - ensureCapacity(count + 1); - value[count++] = ch; + super.append(ch); return this; } @@ -435,7 +276,8 @@ */ public StringBuilder append(CharSequence seq) { - return append(seq, 0, seq.length()); + super.append(seq, 0, seq.length()); + return this; } /** @@ -451,37 +293,11 @@ public StringBuilder append(CharSequence seq, int start, int end) { - if (seq == null) - return append("null"); - if (end - start > 0) - { - ensureCapacity(count + end - start); - for (; start < end; ++start) - value[count++] = seq.charAt(start); - } + super.append(seq, start, end); return this; } /** - * Append the code point to this StringBuilder. - * This is like #append(char), but will append two characters - * if a supplementary code point is given. - * - * @param code the code point to append - * @return this StringBuilder - * @see Character#toChars(int, char[], int) - * @since 1.5 - */ - public synchronized StringBuilder appendCodePoint(int code) - { - int len = Character.charCount(code); - ensureCapacity(count + len); - Character.toChars(code, value, count); - count += len; - return this; - } - - /** * Append the String value of the argument to this * StringBuilder. Uses String.valueOf() to convert * to String. @@ -490,10 +306,11 @@ * @return this StringBuilder * @see String#valueOf(int) */ - // FIXME: this is native in libgcj in StringBuffer. + // This is native in libgcj, for efficiency. public StringBuilder append(int inum) { - return append(String.valueOf(inum)); + super.append(inum); + return this; } /** @@ -507,7 +324,8 @@ */ public StringBuilder append(long lnum) { - return append(Long.toString(lnum, 10)); + super.append(lnum); + return this; } /** @@ -521,7 +339,8 @@ */ public StringBuilder append(float fnum) { - return append(Float.toString(fnum)); + super.append(fnum); + return this; } /** @@ -535,10 +354,27 @@ */ public StringBuilder append(double dnum) { - return append(Double.toString(dnum)); + super.append(dnum); + return this; } /** + * Append the code point to this StringBuilder. + * This is like #append(char), but will append two characters + * if a supplementary code point is given. + * + * @param code the code point to append + * @return this StringBuilder + * @see Character#toChars(int, char[], int) + * @since 1.5 + */ + public StringBuilder appendCodePoint(int code) + { + super.appendCodePoint(code); + return this; + } + + /** * Delete characters from this StringBuilder. * delete(10, 12) will delete 10 and 11, but not 12. It is * harmless for end to be larger than length(). @@ -550,15 +386,7 @@ */ public StringBuilder delete(int start, int end) { - if (start < 0 || start > count || start > end) - throw new StringIndexOutOfBoundsException(start); - if (end > count) - end = count; - // This will unshare if required. - ensureCapacity(count); - if (count - end != 0) - System.arraycopy(value, end, value, start, count - end); - count -= end - start; + super.delete(start, end); return this; } @@ -571,7 +399,8 @@ */ public StringBuilder deleteCharAt(int index) { - return delete(index, index + 1); + super.deleteCharAt(index); + return this; } /** @@ -589,19 +418,7 @@ */ public StringBuilder replace(int start, int end, String str) { - if (start < 0 || start > count || start > end) - throw new StringIndexOutOfBoundsException(start); - - int len = str.count; - // Calculate the difference in 'count' after the replace. - int delta = len - (end > count ? count : end) + start; - ensureCapacity(count + delta); - - if (delta != 0 && end < count) - System.arraycopy(value, end, value, end + delta, count - end); - - str.getChars(0, len, value, start); - count += delta; + super.replace(start, end, str); return this; } @@ -672,13 +489,7 @@ public StringBuilder insert(int offset, char[] str, int str_offset, int len) { - if (offset < 0 || offset > count || len < 0 - || str_offset < 0 || str_offset > str.length - len) - throw new StringIndexOutOfBoundsException(); - ensureCapacity(count + len); - System.arraycopy(value, offset, value, offset + len, count - offset); - System.arraycopy(str, str_offset, value, offset, len); - count += len; + super.insert(offset, str, str_offset, len); return this; } @@ -695,7 +506,8 @@ */ public StringBuilder insert(int offset, Object obj) { - return insert(offset, obj == null ? "null" : obj.toString()); + super.insert(offset, obj); + return this; } /** @@ -710,15 +522,7 @@ */ public StringBuilder insert(int offset, String str) { - if (offset < 0 || offset > count) - throw new StringIndexOutOfBoundsException(offset); - if (str == null) - str = "null"; - int len = str.count; - ensureCapacity(count + len); - System.arraycopy(value, offset, value, offset + len, count - offset); - str.getChars(0, len, value, offset); - count += len; + super.insert(offset, str); return this; } @@ -732,11 +536,10 @@ * @return this StringBuilder * @throws IndexOutOfBoundsException if offset is out of bounds */ - public synchronized StringBuilder insert(int offset, CharSequence sequence) + public StringBuilder insert(int offset, CharSequence sequence) { - if (sequence == null) - sequence = "null"; - return insert(offset, sequence, 0, sequence.length()); + super.insert(offset, sequence); + return this; } /** @@ -752,19 +555,10 @@ * @throws IndexOutOfBoundsException if offset, start, * or end are out of bounds */ - public synchronized StringBuilder insert(int offset, CharSequence sequence, - int start, int end) + public StringBuilder insert(int offset, CharSequence sequence, + int start, int end) { - if (sequence == null) - sequence = "null"; - if (start < 0 || end < 0 || start > end || end > sequence.length()) - throw new IndexOutOfBoundsException(); - int len = end - start; - ensureCapacity(count + len); - System.arraycopy(value, offset, value, offset + len, count - offset); - for (int i = start; i < end; ++i) - value[offset++] = sequence.charAt(i); - count += len; + super.insert(offset, sequence, start, end); return this; } @@ -781,7 +575,8 @@ */ public StringBuilder insert(int offset, char[] data) { - return insert(offset, data, 0, data.length); + super.insert(offset, data); + return this; } /** @@ -797,7 +592,8 @@ */ public StringBuilder insert(int offset, boolean bool) { - return insert(offset, bool ? "true" : "false"); + super.insert(offset, bool); + return this; } /** @@ -810,12 +606,7 @@ */ public StringBuilder insert(int offset, char ch) { - if (offset < 0 || offset > count) - throw new StringIndexOutOfBoundsException(offset); - ensureCapacity(count + 1); - System.arraycopy(value, offset, value, offset + 1, count - offset); - value[offset] = ch; - count++; + super.insert(offset, ch); return this; } @@ -832,7 +623,8 @@ */ public StringBuilder insert(int offset, int inum) { - return insert(offset, String.valueOf(inum)); + super.insert(offset, inum); + return this; } /** @@ -848,7 +640,8 @@ */ public StringBuilder insert(int offset, long lnum) { - return insert(offset, Long.toString(lnum, 10)); + super.insert(offset, lnum); + return this; } /** @@ -864,7 +657,8 @@ */ public StringBuilder insert(int offset, float fnum) { - return insert(offset, Float.toString(fnum)); + super.insert(offset, fnum); + return this; } /** @@ -880,78 +674,11 @@ */ public StringBuilder insert(int offset, double dnum) { - return insert(offset, Double.toString(dnum)); + super.insert(offset, dnum); + return this; } /** - * Finds the first instance of a substring in this StringBuilder. - * - * @param str String to find - * @return location (base 0) of the String, or -1 if not found - * @throws NullPointerException if str is null - * @see #indexOf(String, int) - */ - public int indexOf(String str) - { - return indexOf(str, 0); - } - - /** - * Finds the first instance of a String in this StringBuilder, starting at - * a given index. If starting index is less than 0, the search starts at - * the beginning of this String. If the starting index is greater than the - * length of this String, or the substring is not found, -1 is returned. - * - * @param str String to find - * @param fromIndex index to start the search - * @return location (base 0) of the String, or -1 if not found - * @throws NullPointerException if str is null - */ - public int indexOf(String str, int fromIndex) - { - if (fromIndex < 0) - fromIndex = 0; - int limit = count - str.count; - for ( ; fromIndex <= limit; fromIndex++) - if (regionMatches(fromIndex, str)) - return fromIndex; - return -1; - } - - /** - * Finds the last instance of a substring in this StringBuilder. - * - * @param str String to find - * @return location (base 0) of the String, or -1 if not found - * @throws NullPointerException if str is null - * @see #lastIndexOf(String, int) - */ - public int lastIndexOf(String str) - { - return lastIndexOf(str, count - str.count); - } - - /** - * Finds the last instance of a String in this StringBuilder, starting at a - * given index. If starting index is greater than the maximum valid index, - * then the search begins at the end of this String. If the starting index - * is less than zero, or the substring is not found, -1 is returned. - * - * @param str String to find - * @param fromIndex index to start the search - * @return location (base 0) of the String, or -1 if not found - * @throws NullPointerException if str is null - */ - public int lastIndexOf(String str, int fromIndex) - { - fromIndex = Math.min(fromIndex, count - str.count); - for ( ; fromIndex >= 0; fromIndex--) - if (regionMatches(fromIndex, str)) - return fromIndex; - return -1; - } - - /** * Reverse the characters in this StringBuilder. The same sequence of * characters exists, but in the reverse index ordering. * @@ -959,14 +686,7 @@ */ public StringBuilder reverse() { - // Call ensureCapacity to enforce copy-on-write. - ensureCapacity(count); - for (int i = count >> 1, j = count - i; --i >= 0; ++j) - { - char c = value[i]; - value[i] = value[j]; - value[j] = c; - } + super.reverse(); return this; } @@ -983,80 +703,4 @@ return new String(this); } - /** - * Predicate which determines if a substring of this matches another String - * starting at a specified offset for each String and continuing for a - * specified length. This is more efficient than creating a String to call - * indexOf on. - * - * @param toffset index to start comparison at for this String - * @param other non-null String to compare to region of this - * @return true if regions match, false otherwise - * @see #indexOf(String, int) - * @see #lastIndexOf(String, int) - * @see String#regionMatches(boolean, int, String, int, int) - */ - // GCJ LOCAL: Native to access String internals properly. - private native boolean regionMatches(int toffset, String other); - - /** - * Get the code point at the specified index. This is like #charAt(int), - * but if the character is the start of a surrogate pair, and the - * following character completes the pair, then the corresponding - * supplementary code point is returned. - * @param index the index of the codepoint to get, starting at 0 - * @return the codepoint at the specified index - * @throws IndexOutOfBoundsException if index is negative or >= length() - * @since 1.5 - */ - public int codePointAt(int index) - { - return Character.codePointAt(value, index, count); - } - - /** - * Get the code point before the specified index. This is like - * #codePointAt(int), but checks the characters at index-1 and - * index-2 to see if they form a supplementary code point. - * @param index the index just past the codepoint to get, starting at 0 - * @return the codepoint at the specified index - * @throws IndexOutOfBoundsException if index is negative or >= length() - * @since 1.5 - */ - public int codePointBefore(int index) - { - // Character.codePointBefore() doesn't perform this check. We - // could use the CharSequence overload, but this is just as easy. - if (index >= count) - throw new IndexOutOfBoundsException(); - return Character.codePointBefore(value, index, 1); - } - - /** - * Returns the number of Unicode code points in the specified sub sequence. - * Surrogate pairs count as one code point. - * @param beginIndex the start of the subarray - * @param endIndex the index after the last char in the subarray - * @return the number of code points - * @throws IndexOutOfBoundsException if beginIndex is less than zero or - * greater than endIndex or if endIndex is greater than the length of this - * StringBuilder - */ - public int codePointCount(int beginIndex,int endIndex) - { - if (beginIndex < 0 || beginIndex > endIndex || endIndex > count) - throw new IndexOutOfBoundsException("invalid indices: " + beginIndex - + ", " + endIndex); - return Character.codePointCount(value, beginIndex, endIndex - beginIndex); - } - - public void trimToSize() - { - if (count < value.length) - { - char[] newValue = new char[count]; - System.arraycopy(value, 0, newValue, 0, count); - value = newValue; - } - } } Index: java/lang/natAbstractStringBuffer.cc =================================================================== --- java/lang/natAbstractStringBuffer.cc (revision 139925) +++ java/lang/natAbstractStringBuffer.cc (working copy) @@ -10,15 +10,14 @@ #include #include -#include +#include -java::lang::StringBuffer* -java::lang::StringBuffer::StringBuffer$append (jint num) +java::lang::AbstractStringBuffer* +java::lang::AbstractStringBuffer::append (jint num) { // Use an array large enough for "-2147483648"; i.e. 11 chars. jchar buffer[11]; int i = _Jv_FormatInt (buffer+11, num); - JvSynchronize dummy (this); jint needed = count + i; ensureCapacity_unsynchronized (needed); jchar* dst = elements (value) + count; @@ -30,7 +29,7 @@ } jboolean -java::lang::StringBuffer::regionMatches(jint toffset, jstring other) +java::lang::AbstractStringBuffer::regionMatches(jint toffset, jstring other) { jint len = other->count; jchar *tptr = elements(value) + toffset; Index: Makefile.am =================================================================== --- Makefile.am (revision 140114) +++ Makefile.am (working copy) @@ -1071,8 +1071,7 @@ java/lang/natObject.cc \ java/lang/natRuntime.cc \ java/lang/natString.cc \ -java/lang/natStringBuffer.cc \ -java/lang/natStringBuilder.cc \ +java/lang/natAbstractStringBuffer.cc \ java/lang/natSystem.cc \ java/lang/natThread.cc \ java/lang/natThreadLocal.cc \