Commit 0ade2ddf by Tom Tromey Committed by Tom Tromey

re PR libgcj/23495 (java.lang.String.equals is suboptimal)

	PR libgcj/23495:
	* java/lang/natString.cc (_Jv_NewString): Use memcpy.
	(equals): Use memcmp.
	(contentEquals): Likewise.
	(getChars): Use memcpy.
	(toCharArray): Likewise.
	(regionMatches): Use memcmp.
	(regionMatches): Likewise.
	(startsWith): Likewise.
	(concat): Use memcpy.
	(valueOf): Likewise.

From-SVN: r111919
parent 1e65f958
2006-03-09 Tom Tromey <tromey@redhat.com> 2006-03-09 Tom Tromey <tromey@redhat.com>
PR libgcj/23495:
* java/lang/natString.cc (_Jv_NewString): Use memcpy.
(equals): Use memcmp.
(contentEquals): Likewise.
(getChars): Use memcpy.
(toCharArray): Likewise.
(regionMatches): Use memcmp.
(regionMatches): Likewise.
(startsWith): Likewise.
(concat): Use memcpy.
(valueOf): Likewise.
2006-03-09 Tom Tromey <tromey@redhat.com>
* configure: Rebuilt. * configure: Rebuilt.
* configure.ac (HAVE_CLOCK_GETTIME): Put -lrt in THREADLIBS as * configure.ac (HAVE_CLOCK_GETTIME): Put -lrt in THREADLIBS as
well. well.
......
...@@ -409,8 +409,7 @@ _Jv_NewString(const jchar *chars, jsize len) ...@@ -409,8 +409,7 @@ _Jv_NewString(const jchar *chars, jsize len)
{ {
jstring str = _Jv_AllocString(len); jstring str = _Jv_AllocString(len);
jchar* data = JvGetStringChars (str); jchar* data = JvGetStringChars (str);
while (--len >= 0) memcpy (data, chars, len * sizeof (jchar));
*data++ = *chars++;
return str; return str;
} }
...@@ -534,16 +533,20 @@ java::lang::String::equals(jobject anObject) ...@@ -534,16 +533,20 @@ java::lang::String::equals(jobject anObject)
jstring other = (jstring) anObject; jstring other = (jstring) anObject;
if (count != other->count) if (count != other->count)
return false; return false;
/* if both are interned, return false. */
jint i = count; // If both have cached hash codes, check that. If the cached hash
// codes are zero, don't bother trying to compute them.
int myHash = cachedHashCode;
int otherHash = other->cachedHashCode;
if (myHash && otherHash && myHash != otherHash)
return false;
// We could see if both are interned, and return false. But that
// seems too expensive.
jchar *xptr = JvGetStringChars (this); jchar *xptr = JvGetStringChars (this);
jchar *yptr = JvGetStringChars (other); jchar *yptr = JvGetStringChars (other);
while (--i >= 0) return ! memcmp (xptr, yptr, count * sizeof (jchar));
{
if (*xptr++ != *yptr++)
return false;
}
return true;
} }
jboolean jboolean
...@@ -556,13 +559,9 @@ java::lang::String::contentEquals(java::lang::StringBuffer* buffer) ...@@ -556,13 +559,9 @@ java::lang::String::contentEquals(java::lang::StringBuffer* buffer)
return false; return false;
if (data == buffer->value) if (data == buffer->value)
return true; // Possible if shared. return true; // Possible if shared.
jint i = count;
jchar *xptr = JvGetStringChars(this); jchar *xptr = JvGetStringChars(this);
jchar *yptr = elements(buffer->value); jchar *yptr = elements(buffer->value);
while (--i >= 0) return ! memcmp (xptr, yptr, count * sizeof (jchar));
if (*xptr++ != *yptr++)
return false;
return true;
} }
jboolean jboolean
...@@ -599,9 +598,8 @@ java::lang::String::getChars(jint srcBegin, jint srcEnd, ...@@ -599,9 +598,8 @@ java::lang::String::getChars(jint srcBegin, jint srcEnd,
throw new ArrayIndexOutOfBoundsException; throw new ArrayIndexOutOfBoundsException;
jchar *dPtr = elements (dst) + dstBegin; jchar *dPtr = elements (dst) + dstBegin;
jchar *sPtr = JvGetStringChars (this) + srcBegin; jchar *sPtr = JvGetStringChars (this) + srcBegin;
jint i = srcEnd-srcBegin; jint i = srcEnd - srcBegin;
while (--i >= 0) memcpy (dPtr, sPtr, i * sizeof (jchar));
*dPtr++ = *sPtr++;
} }
jbyteArray jbyteArray
...@@ -666,8 +664,7 @@ java::lang::String::toCharArray() ...@@ -666,8 +664,7 @@ java::lang::String::toCharArray()
jchar *dPtr = elements (array); jchar *dPtr = elements (array);
jchar *sPtr = JvGetStringChars (this); jchar *sPtr = JvGetStringChars (this);
jint i = count; jint i = count;
while (--i >= 0) memcpy (dPtr, sPtr, i * sizeof (jchar));
*dPtr++ = *sPtr++;
return array; return array;
} }
...@@ -704,12 +701,7 @@ java::lang::String::regionMatches (jint toffset, ...@@ -704,12 +701,7 @@ java::lang::String::regionMatches (jint toffset,
jchar *tptr = JvGetStringChars (this) + toffset; jchar *tptr = JvGetStringChars (this) + toffset;
jchar *optr = JvGetStringChars (other) + ooffset; jchar *optr = JvGetStringChars (other) + ooffset;
jint i = len; jint i = len;
while (--i >= 0) return ! memcmp (tptr, optr, i * sizeof (jchar));
{
if (*tptr++ != *optr++)
return false;
}
return true;
} }
jint jint
...@@ -742,25 +734,20 @@ java::lang::String::regionMatches (jboolean ignoreCase, jint toffset, ...@@ -742,25 +734,20 @@ java::lang::String::regionMatches (jboolean ignoreCase, jint toffset,
jchar *optr = JvGetStringChars (other) + ooffset; jchar *optr = JvGetStringChars (other) + ooffset;
jint i = len; jint i = len;
if (ignoreCase) if (ignoreCase)
while (--i >= 0) {
{ while (--i >= 0)
jchar tch = *tptr++; {
jchar och = *optr++; jchar tch = *tptr++;
if ((java::lang::Character::toLowerCase (tch) jchar och = *optr++;
!= java::lang::Character::toLowerCase (och)) if ((java::lang::Character::toLowerCase (tch)
&& (java::lang::Character::toUpperCase (tch) != java::lang::Character::toLowerCase (och))
!= java::lang::Character::toUpperCase (och))) && (java::lang::Character::toUpperCase (tch)
return false; != java::lang::Character::toUpperCase (och)))
} return false;
else }
while (--i >= 0) return true;
{ }
jchar tch = *tptr++; return ! memcmp (tptr, optr, i * sizeof (jchar));
jchar och = *optr++;
if (tch != och)
return false;
}
return true;
} }
jboolean jboolean
...@@ -771,12 +758,7 @@ java::lang::String::startsWith (jstring prefix, jint toffset) ...@@ -771,12 +758,7 @@ java::lang::String::startsWith (jstring prefix, jint toffset)
return false; return false;
jchar *xptr = JvGetStringChars (this) + toffset; jchar *xptr = JvGetStringChars (this) + toffset;
jchar *yptr = JvGetStringChars (prefix); jchar *yptr = JvGetStringChars (prefix);
while (--i >= 0) return ! memcmp (xptr, yptr, i * sizeof (jchar));
{
if (*xptr++ != *yptr++)
return false;
}
return true;
} }
jint jint
...@@ -868,12 +850,11 @@ java::lang::String::concat(jstring str) ...@@ -868,12 +850,11 @@ java::lang::String::concat(jstring str)
jchar *dstPtr = JvGetStringChars(result); jchar *dstPtr = JvGetStringChars(result);
jchar *srcPtr = JvGetStringChars(this); jchar *srcPtr = JvGetStringChars(this);
jint i = count; jint i = count;
while (--i >= 0) memcpy (dstPtr, srcPtr, i * sizeof (jchar));
*dstPtr++ = *srcPtr++; dstPtr += i;
srcPtr = JvGetStringChars(str); srcPtr = JvGetStringChars(str);
i = str->count; i = str->count;
while (--i >= 0) memcpy (dstPtr, srcPtr, i * sizeof (jchar));
*dstPtr++ = *srcPtr++;
return result; return result;
} }
...@@ -1048,8 +1029,7 @@ java::lang::String::valueOf(jcharArray data, jint offset, jint count) ...@@ -1048,8 +1029,7 @@ java::lang::String::valueOf(jcharArray data, jint offset, jint count)
jstring result = JvAllocString(count); jstring result = JvAllocString(count);
jchar *sPtr = elements (data) + offset; jchar *sPtr = elements (data) + offset;
jchar *dPtr = JvGetStringChars(result); jchar *dPtr = JvGetStringChars(result);
while (--count >= 0) memcpy (dPtr, sPtr, count * sizeof (jchar));
*dPtr++ = *sPtr++;
return result; return result;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment