# HG changeset patch # User redestad # Date 1495821381 -7200 # Fri May 26 19:56:21 2017 +0200 # Node ID 85a4f663c09156777ee272c9be82da837741f8fd # Parent 875fa66a13a242ec947ba309c99e2a88991dbf4f 8181147: JNI_GetStringPlatformChars should have a fast path for UTF-8 Reviewed-by: TBD diff --git a/src/java.base/share/native/libjava/jni_util.c b/src/java.base/share/native/libjava/jni_util.c --- a/src/java.base/share/native/libjava/jni_util.c +++ b/src/java.base/share/native/libjava/jni_util.c @@ -500,6 +500,24 @@ return result; } +static const char* +getStringUTF8(JNIEnv *env, jstring jstr) +{ + jsize len; + jsize unicode_len; + char *result; + len = (*env)->GetStringUTFLength(env, jstr); + unicode_len = (*env)->GetStringLength(env, jstr); + result = malloc(len + 1); + if (result == NULL) { + JNU_ThrowOutOfMemoryError(env, NULL); + return NULL; + } + (*env)->GetStringUTFRegion(env, jstr, 0, unicode_len, result); + + return result; +} + /* Optimized for char set ISO646-US (us-ascii) */ static jstring @@ -720,6 +738,8 @@ (strcmp(encname, "ISO8859_1") == 0) || (strcmp(encname, "ISO-8859-1") == 0)) fastEncoding = FAST_8859_1; + else if (strcmp(encname, "UTF-8") == 0) + fastEncoding = FAST_UTF_8; else if (strcmp(encname, "ISO646-US") == 0) fastEncoding = FAST_646_US; else if (strcmp(encname, "Cp1252") == 0 || @@ -792,6 +812,8 @@ return newString646_US(env, str); if (fastEncoding == FAST_CP1252) return newStringCp1252(env, str); + if (fastEncoding == FAST_UTF_8) + return (*env)->NewStringUTF(env, str); if ((*env)->EnsureLocalCapacity(env, 2) < 0) return NULL; @@ -850,6 +872,8 @@ return getString646_USChars(env, jstr); if (fastEncoding == FAST_CP1252) return getStringCp1252Chars(env, jstr); + if (fastEncoding == FAST_UTF_8) + return getStringUTF8(env, jstr); if ((*env)->EnsureLocalCapacity(env, 2) < 0) return 0; diff --git a/src/java.base/share/native/libjava/jni_util.h b/src/java.base/share/native/libjava/jni_util.h --- a/src/java.base/share/native/libjava/jni_util.h +++ b/src/java.base/share/native/libjava/jni_util.h @@ -382,7 +382,8 @@ NO_FAST_ENCODING, /* Platform encoding is not fast */ FAST_8859_1, /* ISO-8859-1 */ FAST_CP1252, /* MS-DOS Cp1252 */ - FAST_646_US /* US-ASCII : ISO646-US */ + FAST_646_US, /* US-ASCII : ISO646-US */ + FAST_UTF_8 }; int getFastEncoding();