diff -r 1a56a0bf5840 -r c81d4e10ffb7 jdk/src/share/bin/java.c --- a/jdk/src/share/bin/java.c Fri Mar 18 10:59:12 2011 -0700 +++ b/jdk/src/share/bin/java.c Sun Mar 20 08:41:33 2011 -0700 @@ -61,6 +61,9 @@ * interfaces. */ +/* we always print to stderr */ +#define USE_STDERR JNI_TRUE + static jboolean printVersion = JNI_FALSE; /* print and exit */ static jboolean showVersion = JNI_FALSE; /* print but continue */ static jboolean printUsage = JNI_FALSE; /* print and exit*/ @@ -1136,36 +1139,18 @@ return; \ } -static jstring platformEncoding = NULL; -static jstring getPlatformEncoding(JNIEnv *env) { - if (platformEncoding == NULL) { - jstring propname = (*env)->NewStringUTF(env, "sun.jnu.encoding"); - if (propname) { - jclass cls; - jmethodID mid; - NULL_CHECK0 (cls = FindBootStrapClass(env, "java/lang/System")); - NULL_CHECK0 (mid = (*env)->GetStaticMethodID( - env, cls, - "getProperty", - "(Ljava/lang/String;)Ljava/lang/String;")); - platformEncoding = (*env)->CallStaticObjectMethod ( - env, cls, mid, propname); - } +static jclass helperClass = NULL; + +static jclass +GetLauncherHelperClass(JNIEnv *env) { + if (helperClass == NULL) { + NULL_CHECK0(helperClass = FindBootStrapClass(env, + "sun/launcher/LauncherHelper")); } - return platformEncoding; + return helperClass; } -static jboolean isEncodingSupported(JNIEnv *env, jstring enc) { - jclass cls; - jmethodID mid; - NULL_CHECK0 (cls = FindBootStrapClass(env, "java/nio/charset/Charset")); - NULL_CHECK0 (mid = (*env)->GetStaticMethodID( - env, cls, - "isSupported", - "(Ljava/lang/String;)Z")); - return (*env)->CallStaticBooleanMethod(env, cls, mid, enc); -} - +static jmethodID makePlatformStringMID = NULL; /* * Returns a new Java string object for the specified platform string. */ @@ -1173,36 +1158,23 @@ NewPlatformString(JNIEnv *env, char *s) { int len = (int)JLI_StrLen(s); - jclass cls; - jmethodID mid; jbyteArray ary; - jstring enc; - + jclass cls = GetLauncherHelperClass(env); + NULL_CHECK0(cls); if (s == NULL) return 0; - enc = getPlatformEncoding(env); ary = (*env)->NewByteArray(env, len); if (ary != 0) { jstring str = 0; (*env)->SetByteArrayRegion(env, ary, 0, len, (jbyte *)s); if (!(*env)->ExceptionOccurred(env)) { - NULL_CHECK0(cls = FindBootStrapClass(env, "java/lang/String")); - if (isEncodingSupported(env, enc) == JNI_TRUE) { - NULL_CHECK0(mid = (*env)->GetMethodID(env, cls, "", - "([BLjava/lang/String;)V")); - str = (*env)->NewObject(env, cls, mid, ary, enc); - } else { - /*If the encoding specified in sun.jnu.encoding is not - endorsed by "Charset.isSupported" we have to fall back - to use String(byte[]) explicitly here without specifying - the encoding name, in which the StringCoding class will - pickup the iso-8859-1 as the fallback converter for us. - */ - NULL_CHECK0(mid = (*env)->GetMethodID(env, cls, "", - "([B)V")); - str = (*env)->NewObject(env, cls, mid, ary); + if (makePlatformStringMID == NULL) { + NULL_CHECK0(makePlatformStringMID = (*env)->GetStaticMethodID(env, + cls, "makePlatformString", "(Z[B)Ljava/lang/String;")); } + str = (*env)->CallStaticObjectMethod(env, cls, + makePlatformStringMID, USE_STDERR, ary); (*env)->DeleteLocalRef(env, ary); return str; } @@ -1239,20 +1211,28 @@ static jclass LoadMainClass(JNIEnv *env, int mode, char *name) { - jclass cls; jmethodID mid; jstring str; jobject result; jlong start, end; - + jclass cls = GetLauncherHelperClass(env); + NULL_CHECK0(cls); if (JLI_IsTraceLauncher()) { start = CounterGet(); } - NULL_CHECK0(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper")); - NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls, "checkAndLoadMain", - "(ZILjava/lang/String;)Ljava/lang/Class;")); - str = (*env)->NewStringUTF(env, name); - result = (*env)->CallStaticObjectMethod(env, cls, mid, JNI_TRUE, mode, str); + NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls, + "checkAndLoadMain", + "(ZILjava/lang/String;)Ljava/lang/Class;")); + + switch (mode) { + case LM_CLASS: + str = NewPlatformString(env, name); + break; + default: + str = (*env)->NewStringUTF(env, name); + break; + } + result = (*env)->CallStaticObjectMethod(env, cls, mid, USE_STDERR, mode, str); if (JLI_IsTraceLauncher()) { end = CounterGet(); @@ -1478,15 +1458,15 @@ static void ShowSettings(JNIEnv *env, char *optString) { - jclass cls; jmethodID showSettingsID; jstring joptString; - NULL_CHECK(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper")); + jclass cls = GetLauncherHelperClass(env); + NULL_CHECK(cls); NULL_CHECK(showSettingsID = (*env)->GetStaticMethodID(env, cls, "showSettings", "(ZLjava/lang/String;JJJZ)V")); joptString = (*env)->NewStringUTF(env, optString); (*env)->CallStaticVoidMethod(env, cls, showSettingsID, - JNI_TRUE, + USE_STDERR, joptString, (jlong)initialHeapSize, (jlong)maxHeapSize, @@ -1500,18 +1480,15 @@ static void PrintUsage(JNIEnv* env, jboolean doXUsage) { - jclass cls; jmethodID initHelp, vmSelect, vmSynonym, vmErgo, printHelp, printXUsageMessage; jstring jprogname, vm1, vm2; int i; - - NULL_CHECK(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper")); - - + jclass cls = GetLauncherHelperClass(env); + NULL_CHECK(cls); if (doXUsage) { NULL_CHECK(printXUsageMessage = (*env)->GetStaticMethodID(env, cls, "printXUsageMessage", "(Z)V")); - (*env)->CallStaticVoidMethod(env, cls, printXUsageMessage, JNI_TRUE); + (*env)->CallStaticVoidMethod(env, cls, printXUsageMessage, USE_STDERR); } else { NULL_CHECK(initHelp = (*env)->GetStaticMethodID(env, cls, "initHelpMessage", "(Ljava/lang/String;)V")); @@ -1570,7 +1547,7 @@ } /* Complete the usage message and print to stderr*/ - (*env)->CallStaticVoidMethod(env, cls, printHelp, JNI_TRUE); + (*env)->CallStaticVoidMethod(env, cls, printHelp, USE_STDERR); } return; }