< 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 >