< 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,10 +498,28 @@
     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,10 +736,12 @@
                     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,10 +810,12 @@
         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,10 +870,12 @@
         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 >