< prev index next >

src/java.base/share/native/libjava/jni_util.c

Print this page
rev 17266 : 8181147: JNI_GetStringPlatformChars should have a fast path for UTF-8
Reviewed-by: TBD

*** 498,507 **** --- 498,525 ---- result[len] = 0; (*env)->ReleaseStringCritical(env, jstr, str); 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 newString646_US(JNIEnv *env, const char *str) {
*** 718,727 **** --- 736,747 ---- if ((strcmp(encname, "8859_1") == 0) || (strcmp(encname, "ISO8859-1") == 0) || (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 || /* This is a temporary fix until we move */ /* to wide character versions of all Windows */
*** 790,799 **** --- 810,821 ---- return newString8859_1(env, str); if (fastEncoding == FAST_646_US) 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; len = (int)strlen(str);
*** 848,857 **** --- 870,881 ---- return getString8859_1Chars(env, jstr); if (fastEncoding == FAST_646_US) 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; if (jnuEncodingSupported(env)) {
< prev index next >