提交 829e72c0 编写于 作者: K ksrini

7026184: (launcher) Regression: class with unicode name can't be launched by java.

Reviewed-by: mchung, sherman
上级 06a16079
...@@ -61,6 +61,9 @@ ...@@ -61,6 +61,9 @@
* interfaces. * interfaces.
*/ */
/* we always print to stderr */
#define USE_STDERR JNI_TRUE
static jboolean printVersion = JNI_FALSE; /* print and exit */ static jboolean printVersion = JNI_FALSE; /* print and exit */
static jboolean showVersion = JNI_FALSE; /* print but continue */ static jboolean showVersion = JNI_FALSE; /* print but continue */
static jboolean printUsage = JNI_FALSE; /* print and exit*/ static jboolean printUsage = JNI_FALSE; /* print and exit*/
...@@ -1136,36 +1139,18 @@ InitializeJVM(JavaVM **pvm, JNIEnv **penv, InvocationFunctions *ifn) ...@@ -1136,36 +1139,18 @@ InitializeJVM(JavaVM **pvm, JNIEnv **penv, InvocationFunctions *ifn)
return; \ return; \
} }
static jstring platformEncoding = NULL; static jclass helperClass = 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);
}
}
return platformEncoding;
}
static jboolean isEncodingSupported(JNIEnv *env, jstring enc) { static jclass
jclass cls; GetLauncherHelperClass(JNIEnv *env) {
jmethodID mid; if (helperClass == NULL) {
NULL_CHECK0 (cls = FindBootStrapClass(env, "java/nio/charset/Charset")); NULL_CHECK0(helperClass = FindBootStrapClass(env,
NULL_CHECK0 (mid = (*env)->GetStaticMethodID( "sun/launcher/LauncherHelper"));
env, cls, }
"isSupported", return helperClass;
"(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. * Returns a new Java string object for the specified platform string.
*/ */
...@@ -1173,36 +1158,23 @@ static jstring ...@@ -1173,36 +1158,23 @@ static jstring
NewPlatformString(JNIEnv *env, char *s) NewPlatformString(JNIEnv *env, char *s)
{ {
int len = (int)JLI_StrLen(s); int len = (int)JLI_StrLen(s);
jclass cls;
jmethodID mid;
jbyteArray ary; jbyteArray ary;
jstring enc; jclass cls = GetLauncherHelperClass(env);
NULL_CHECK0(cls);
if (s == NULL) if (s == NULL)
return 0; return 0;
enc = getPlatformEncoding(env);
ary = (*env)->NewByteArray(env, len); ary = (*env)->NewByteArray(env, len);
if (ary != 0) { if (ary != 0) {
jstring str = 0; jstring str = 0;
(*env)->SetByteArrayRegion(env, ary, 0, len, (jbyte *)s); (*env)->SetByteArrayRegion(env, ary, 0, len, (jbyte *)s);
if (!(*env)->ExceptionOccurred(env)) { if (!(*env)->ExceptionOccurred(env)) {
NULL_CHECK0(cls = FindBootStrapClass(env, "java/lang/String")); if (makePlatformStringMID == NULL) {
if (isEncodingSupported(env, enc) == JNI_TRUE) { NULL_CHECK0(makePlatformStringMID = (*env)->GetStaticMethodID(env,
NULL_CHECK0(mid = (*env)->GetMethodID(env, cls, "<init>", cls, "makePlatformString", "(Z[B)Ljava/lang/String;"));
"([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, "<init>",
"([B)V"));
str = (*env)->NewObject(env, cls, mid, ary);
} }
str = (*env)->CallStaticObjectMethod(env, cls,
makePlatformStringMID, USE_STDERR, ary);
(*env)->DeleteLocalRef(env, ary); (*env)->DeleteLocalRef(env, ary);
return str; return str;
} }
...@@ -1239,20 +1211,28 @@ NewPlatformStringArray(JNIEnv *env, char **strv, int strc) ...@@ -1239,20 +1211,28 @@ NewPlatformStringArray(JNIEnv *env, char **strv, int strc)
static jclass static jclass
LoadMainClass(JNIEnv *env, int mode, char *name) LoadMainClass(JNIEnv *env, int mode, char *name)
{ {
jclass cls;
jmethodID mid; jmethodID mid;
jstring str; jstring str;
jobject result; jobject result;
jlong start, end; jlong start, end;
jclass cls = GetLauncherHelperClass(env);
NULL_CHECK0(cls);
if (JLI_IsTraceLauncher()) { if (JLI_IsTraceLauncher()) {
start = CounterGet(); start = CounterGet();
} }
NULL_CHECK0(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper")); NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls,
NULL_CHECK0(mid = (*env)->GetStaticMethodID(env, cls, "checkAndLoadMain", "checkAndLoadMain",
"(ZILjava/lang/String;)Ljava/lang/Class;")); "(ZILjava/lang/String;)Ljava/lang/Class;"));
str = (*env)->NewStringUTF(env, name);
result = (*env)->CallStaticObjectMethod(env, cls, mid, JNI_TRUE, mode, str); 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()) { if (JLI_IsTraceLauncher()) {
end = CounterGet(); end = CounterGet();
...@@ -1478,15 +1458,15 @@ PrintJavaVersion(JNIEnv *env, jboolean extraLF) ...@@ -1478,15 +1458,15 @@ PrintJavaVersion(JNIEnv *env, jboolean extraLF)
static void static void
ShowSettings(JNIEnv *env, char *optString) ShowSettings(JNIEnv *env, char *optString)
{ {
jclass cls;
jmethodID showSettingsID; jmethodID showSettingsID;
jstring joptString; jstring joptString;
NULL_CHECK(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper")); jclass cls = GetLauncherHelperClass(env);
NULL_CHECK(cls);
NULL_CHECK(showSettingsID = (*env)->GetStaticMethodID(env, cls, NULL_CHECK(showSettingsID = (*env)->GetStaticMethodID(env, cls,
"showSettings", "(ZLjava/lang/String;JJJZ)V")); "showSettings", "(ZLjava/lang/String;JJJZ)V"));
joptString = (*env)->NewStringUTF(env, optString); joptString = (*env)->NewStringUTF(env, optString);
(*env)->CallStaticVoidMethod(env, cls, showSettingsID, (*env)->CallStaticVoidMethod(env, cls, showSettingsID,
JNI_TRUE, USE_STDERR,
joptString, joptString,
(jlong)initialHeapSize, (jlong)initialHeapSize,
(jlong)maxHeapSize, (jlong)maxHeapSize,
...@@ -1500,18 +1480,15 @@ ShowSettings(JNIEnv *env, char *optString) ...@@ -1500,18 +1480,15 @@ ShowSettings(JNIEnv *env, char *optString)
static void static void
PrintUsage(JNIEnv* env, jboolean doXUsage) PrintUsage(JNIEnv* env, jboolean doXUsage)
{ {
jclass cls;
jmethodID initHelp, vmSelect, vmSynonym, vmErgo, printHelp, printXUsageMessage; jmethodID initHelp, vmSelect, vmSynonym, vmErgo, printHelp, printXUsageMessage;
jstring jprogname, vm1, vm2; jstring jprogname, vm1, vm2;
int i; int i;
jclass cls = GetLauncherHelperClass(env);
NULL_CHECK(cls = FindBootStrapClass(env, "sun/launcher/LauncherHelper")); NULL_CHECK(cls);
if (doXUsage) { if (doXUsage) {
NULL_CHECK(printXUsageMessage = (*env)->GetStaticMethodID(env, cls, NULL_CHECK(printXUsageMessage = (*env)->GetStaticMethodID(env, cls,
"printXUsageMessage", "(Z)V")); "printXUsageMessage", "(Z)V"));
(*env)->CallStaticVoidMethod(env, cls, printXUsageMessage, JNI_TRUE); (*env)->CallStaticVoidMethod(env, cls, printXUsageMessage, USE_STDERR);
} else { } else {
NULL_CHECK(initHelp = (*env)->GetStaticMethodID(env, cls, NULL_CHECK(initHelp = (*env)->GetStaticMethodID(env, cls,
"initHelpMessage", "(Ljava/lang/String;)V")); "initHelpMessage", "(Ljava/lang/String;)V"));
...@@ -1570,7 +1547,7 @@ PrintUsage(JNIEnv* env, jboolean doXUsage) ...@@ -1570,7 +1547,7 @@ PrintUsage(JNIEnv* env, jboolean doXUsage)
} }
/* Complete the usage message and print to stderr*/ /* Complete the usage message and print to stderr*/
(*env)->CallStaticVoidMethod(env, cls, printHelp, JNI_TRUE); (*env)->CallStaticVoidMethod(env, cls, printHelp, USE_STDERR);
} }
return; return;
} }
......
...@@ -42,10 +42,12 @@ package sun.launcher; ...@@ -42,10 +42,12 @@ package sun.launcher;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.PrintStream; import java.io.PrintStream;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.nio.charset.Charset;
import java.util.ResourceBundle; import java.util.ResourceBundle;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.util.ArrayList; import java.util.ArrayList;
...@@ -471,11 +473,11 @@ public enum LauncherHelper { ...@@ -471,11 +473,11 @@ public enum LauncherHelper {
} catch (ClassNotFoundException cnfe) { } catch (ClassNotFoundException cnfe) {
abort(ostream, cnfe, "java.launcher.cls.error1", cn); abort(ostream, cnfe, "java.launcher.cls.error1", cn);
} }
signatureDiagnostic(ostream, c); getMainMethod(ostream, c);
return c; return c;
} }
static void signatureDiagnostic(PrintStream ostream, Class<?> clazz) { static Method getMainMethod(PrintStream ostream, Class<?> clazz) {
String classname = clazz.getName(); String classname = clazz.getName();
Method method = null; Method method = null;
try { try {
...@@ -495,6 +497,31 @@ public enum LauncherHelper { ...@@ -495,6 +497,31 @@ public enum LauncherHelper {
if (method.getReturnType() != java.lang.Void.TYPE) { if (method.getReturnType() != java.lang.Void.TYPE) {
abort(ostream, null, "java.launcher.cls.error3", classname); abort(ostream, null, "java.launcher.cls.error3", classname);
} }
return; return method;
}
private static final String encprop = "sun.jnu.encoding";
private static String encoding = null;
private static boolean isCharsetSupported = false;
/*
* converts a c or a byte array to a platform specific string,
* previously implemented as a native method in the launcher.
*/
static String makePlatformString(boolean printToStderr, byte[] inArray) {
final PrintStream ostream = (printToStderr) ? System.err : System.out;
if (encoding == null) {
encoding = System.getProperty(encprop);
isCharsetSupported = Charset.isSupported(encoding);
}
try {
String out = isCharsetSupported
? new String(inArray, encoding)
: new String(inArray);
return out;
} catch (UnsupportedEncodingException uee) {
abort(ostream, uee, null);
}
return null; // keep the compiler happy
} }
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册