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

View file

@ -260,7 +260,6 @@ Java_java_lang_System_initProperties(JNIEnv *env, jclass cla, jobject props)
PUTPROP(props, "user.variant", sprops->variant); PUTPROP(props, "user.variant", sprops->variant);
} }
PUTPROP(props, "file.encoding", sprops->encoding); PUTPROP(props, "file.encoding", sprops->encoding);
PUTPROP(props, "sun.jnu.encoding", sprops->sun_jnu_encoding);
if (sprops->sun_stdout_encoding != NULL) { if (sprops->sun_stdout_encoding != NULL) {
PUTPROP(props, "sun.stdout.encoding", sprops->sun_stdout_encoding); 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 !!! /* !!! DO NOT call PUTPROP_ForPlatformNString before this line !!!
* !!! I18n properties have not been set up yet !!! * !!! I18n properties have not been set up yet !!!
*/ */
InitializeEncoding(env, sprops->sun_jnu_encoding);
/* Printing properties */ /* Printing properties */
/* Note: java.awt.printerjob is an implementation private property which /* 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); (*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; return ret;
} }

View file

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

View file

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