8198697: Simplify initialization of platform encoding

Reviewed-by: redestad, sherman
This commit is contained in:
Roger Riggs 2018-03-02 14:17:04 -05:00
parent b64d0ef66d
commit c43cebb5cf
3 changed files with 61 additions and 77 deletions
src/java.base/share/native/libjava

@ -260,7 +260,6 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
PUTPROP(props, "user.variant", sprops->variant);
}
PUTPROP(props, "file.encoding", sprops->encoding);
PUTPROP(props, "sun.jnu.encoding", sprops->sun_jnu_encoding);
if (sprops->sun_stdout_encoding != NULL) {
PUTPROP(props, "sun.stdout.encoding", sprops->sun_stdout_encoding);
}
@ -319,6 +318,7 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
/* !!! DO NOT call PUTPROP_ForPlatformNString before this line !!!
* !!! I18n properties have not been set up yet !!!
*/
InitializeEncoding(env, sprops->sun_jnu_encoding);
/* Printing properties */
/* Note: java.awt.printerjob is an implementation private property which
@ -418,6 +418,9 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
(*env)->DeleteLocalRef(env, jVMVal);
}
// Platform defined encoding properties override any on the command line
PUTPROP(props, "sun.jnu.encoding", sprops->sun_jnu_encoding);
return ret;
}

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -774,14 +774,10 @@ newStringUTF8(JNIEnv *env, const char *str)
return newSizedStringJava(env, str, len);
}
/* Initialize the fast encoding. If the "sun.jnu.encoding" property
* has not yet been set, we leave fastEncoding == NO_ENCODING_YET.
*/
/* Initialize the fast encoding from the encoding name. */
void
initializeEncoding(JNIEnv *env)
InitializeEncoding(JNIEnv *env, const char *encname)
{
jstring propname = 0;
jstring enc = 0;
jclass strClazz = NULL;
if ((*env)->EnsureLocalCapacity(env, 3) < 0)
@ -790,61 +786,49 @@ initializeEncoding(JNIEnv *env)
strClazz = JNU_ClassString(env);
CHECK_NULL(strClazz);
propname = (*env)->NewStringUTF(env, "sun.jnu.encoding");
if (propname) {
jboolean exc;
enc = JNU_CallStaticMethodByName
(env,
&exc,
"java/lang/System",
"getProperty",
"(Ljava/lang/String;)Ljava/lang/String;",
propname).l;
if (!exc) {
if (enc) {
const char* encname = (*env)->GetStringUTFChars(env, enc, 0);
if (encname) {
/*
* On Solaris with nl_langinfo() called in GetJavaProperties():
*
* locale undefined -> NULL -> hardcoded default
* "C" locale -> "" -> hardcoded default (on 2.6)
* "C" locale -> "ISO646-US" (on Sol 7/8)
* "en_US" locale -> "ISO8859-1"
* "en_GB" locale -> "ISO8859-1" (on Sol 7/8)
* "en_UK" locale -> "ISO8859-1" (on 2.6)
*/
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;
jnuEncoding = (jstring)(*env)->NewGlobalRef(env, enc);
} 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 */
/* calls. */
strcmp(encname, "utf-16le") == 0) {
fastEncoding = FAST_CP1252;
} else {
fastEncoding = NO_FAST_ENCODING;
jnuEncoding = (jstring)(*env)->NewGlobalRef(env, enc);
}
(*env)->ReleaseStringUTFChars(env, enc, encname);
}
}
if (encname) {
/*
* On Solaris with nl_langinfo() called in GetJavaProperties():
*
* locale undefined -> NULL -> hardcoded default
* "C" locale -> "" -> hardcoded default (on 2.6)
* "C" locale -> "ISO646-US" (on Sol 7/8)
* "en_US" locale -> "ISO8859-1"
* "en_GB" locale -> "ISO8859-1" (on Sol 7/8)
* "en_UK" locale -> "ISO8859-1" (on 2.6)
*/
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;
jstring enc = (*env)->NewStringUTF(env, encname);
if (enc == NULL)
return;
jnuEncoding = (jstring)(*env)->NewGlobalRef(env, enc);
(*env)->DeleteLocalRef(env, enc);
} 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 */
/* calls. */
strcmp(encname, "utf-16le") == 0) {
fastEncoding = FAST_CP1252;
} else {
(*env)->ExceptionClear(env);
fastEncoding = NO_FAST_ENCODING;
jstring enc = (*env)->NewStringUTF(env, encname);
if (enc == NULL)
return;
jnuEncoding = (jstring)(*env)->NewGlobalRef(env, enc);
(*env)->DeleteLocalRef(env, enc);
}
} else {
(*env)->ExceptionClear(env);
JNU_ThrowInternalError(env, "platform encoding undefined");
return;
}
(*env)->DeleteLocalRef(env, propname);
(*env)->DeleteLocalRef(env, enc);
/* Initialize method-id cache */
String_getBytes_ID = (*env)->GetMethodID(env, strClazz,
@ -865,19 +849,18 @@ NewStringPlatform(JNIEnv *env, const char *str)
JNIEXPORT jstring JNICALL
JNU_NewStringPlatform(JNIEnv *env, const char *str)
{
if (fastEncoding == NO_ENCODING_YET) {
initializeEncoding(env);
JNU_CHECK_EXCEPTION_RETURN(env, NULL);
}
if ((fastEncoding == FAST_8859_1) || (fastEncoding == NO_ENCODING_YET))
if (fastEncoding == FAST_UTF_8)
return newStringUTF8(env, str);
if (fastEncoding == FAST_8859_1)
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 newStringUTF8(env, str);
if (fastEncoding == NO_ENCODING_YET) {
JNU_ThrowInternalError(env, "platform encoding not initialized");
return NULL;
}
return newStringJava(env, str);
}
@ -985,20 +968,18 @@ JNU_GetStringPlatformChars(JNIEnv *env, jstring jstr, jboolean *isCopy)
if (isCopy)
*isCopy = JNI_TRUE;
if (fastEncoding == NO_ENCODING_YET) {
initializeEncoding(env);
JNU_CHECK_EXCEPTION_RETURN(env, 0);
}
if ((fastEncoding == FAST_8859_1) || (fastEncoding == NO_ENCODING_YET))
if (fastEncoding == FAST_UTF_8)
return getStringUTF8(env, jstr);
if (fastEncoding == FAST_8859_1)
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);
else
if (fastEncoding == NO_ENCODING_YET) {
JNU_ThrowInternalError(env, "platform encoding not initialized");
return 0;
} else
return getStringBytes(env, jstr);
}

@ -388,7 +388,7 @@ enum {
int getFastEncoding();
void initializeEncoding();
void InitializeEncoding(JNIEnv *env, const char *name);
void* getProcessHandle();