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,19 +786,6 @@ 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 (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) { if (encname) {
/* /*
* On Solaris with nl_langinfo() called in GetJavaProperties(): * On Solaris with nl_langinfo() called in GetJavaProperties():
@ -821,7 +804,11 @@ initializeEncoding(JNIEnv *env)
fastEncoding = FAST_8859_1; fastEncoding = FAST_8859_1;
} else if (strcmp(encname, "UTF-8") == 0) { } else if (strcmp(encname, "UTF-8") == 0) {
fastEncoding = FAST_UTF_8; fastEncoding = FAST_UTF_8;
jstring enc = (*env)->NewStringUTF(env, encname);
if (enc == NULL)
return;
jnuEncoding = (jstring)(*env)->NewGlobalRef(env, enc); jnuEncoding = (jstring)(*env)->NewGlobalRef(env, enc);
(*env)->DeleteLocalRef(env, enc);
} else if (strcmp(encname, "ISO646-US") == 0) { } else if (strcmp(encname, "ISO646-US") == 0) {
fastEncoding = FAST_646_US; fastEncoding = FAST_646_US;
} else if (strcmp(encname, "Cp1252") == 0 || } else if (strcmp(encname, "Cp1252") == 0 ||
@ -832,19 +819,16 @@ initializeEncoding(JNIEnv *env)
fastEncoding = FAST_CP1252; fastEncoding = FAST_CP1252;
} else { } else {
fastEncoding = NO_FAST_ENCODING; fastEncoding = NO_FAST_ENCODING;
jstring enc = (*env)->NewStringUTF(env, encname);
if (enc == NULL)
return;
jnuEncoding = (jstring)(*env)->NewGlobalRef(env, enc); jnuEncoding = (jstring)(*env)->NewGlobalRef(env, enc);
}
(*env)->ReleaseStringUTFChars(env, enc, encname);
}
}
} else {
(*env)->ExceptionClear(env);
}
} else {
(*env)->ExceptionClear(env);
}
(*env)->DeleteLocalRef(env, propname);
(*env)->DeleteLocalRef(env, enc); (*env)->DeleteLocalRef(env, enc);
}
} else {
JNU_ThrowInternalError(env, "platform encoding undefined");
return;
}
/* 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();