--- a/jdk/src/share/bin/java.c Mon Jul 12 18:18:13 2010 +0100
+++ b/jdk/src/share/bin/java.c Fri Jul 09 11:04:34 2010 -0700
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1995, 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1995, 2010, 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
@@ -192,8 +192,8 @@
int ret;
InvocationFunctions ifn;
jlong start, end;
- char jrepath[MAXPATHLEN], jvmpath[MAXPATHLEN];
- char ** original_argv = argv;
+ char jvmpath[MAXPATHLEN];
+ char jrepath[MAXPATHLEN];
_fVersion = fullversion;
_dVersion = dotversion;
@@ -225,14 +225,17 @@
*/
SelectVersion(argc, argv, &main_class);
- /* copy original argv */
- JLI_TraceLauncher("Command line Args:\n");
- original_argv = (JLI_CopyArgs(argc, (const char**)argv));
+ if (JLI_IsTraceLauncher()) {
+ int i;
+ printf("Command line args:\n");
+ for (i = 0; i < argc ; i++) {
+ printf("argv[%d] = %s\n", i, argv[i]);
+ }
+ }
CreateExecutionEnvironment(&argc, &argv,
jrepath, sizeof(jrepath),
- jvmpath, sizeof(jvmpath),
- original_argv);
+ jvmpath, sizeof(jvmpath));
ifn.CreateJavaVM = 0;
ifn.GetDefaultJavaVMInitArgs = 0;
@@ -301,22 +304,43 @@
return ContinueInNewThread(&ifn, argc, argv, jarfile, classname, ret);
}
+/*
+ * Always detach the main thread so that it appears to have ended when
+ * the application's main method exits. This will invoke the
+ * uncaught exception handler machinery if main threw an
+ * exception. An uncaught exception handler cannot change the
+ * launcher's return code except by calling System.exit.
+ *
+ * Wait for all non-daemon threads to end, then destroy the VM.
+ * This will actually create a trivial new Java waiter thread
+ * named "DestroyJavaVM", but this will be seen as a different
+ * thread from the one that executed main, even though they are
+ * the same C thread. This allows mainThread.join() and
+ * mainThread.isAlive() to work as expected.
+ */
+#define LEAVE() \
+ if ((*vm)->DetachCurrentThread(vm) != 0) { \
+ JLI_ReportErrorMessage(JVM_ERROR2); \
+ ret = 1; \
+ } \
+ (*vm)->DestroyJavaVM(vm); \
+ return ret \
#define CHECK_EXCEPTION_NULL_LEAVE(e) \
if ((*env)->ExceptionOccurred(env)) { \
JLI_ReportExceptionDescription(env); \
- goto leave; \
+ LEAVE(); \
} \
if ((e) == NULL) { \
JLI_ReportErrorMessage(JNI_ERROR); \
- goto leave; \
+ LEAVE(); \
}
#define CHECK_EXCEPTION_LEAVE(rv) \
if ((*env)->ExceptionOccurred(env)) { \
JLI_ReportExceptionDescription(env); \
ret = (rv); \
- goto leave; \
+ LEAVE(); \
}
int JNICALL
@@ -349,8 +373,7 @@
PrintJavaVersion(env, showVersion);
CHECK_EXCEPTION_LEAVE(0);
if (printVersion) {
- ret = 0;
- goto leave;
+ LEAVE();
}
}
@@ -358,7 +381,7 @@
if (printXUsage || printUsage || (jarfile == 0 && classname == 0)) {
PrintUsage(env, printXUsage);
CHECK_EXCEPTION_LEAVE(1);
- goto leave;
+ LEAVE();
}
FreeKnownVMs(); /* after last possible PrintUsage() */
@@ -430,30 +453,7 @@
* System.exit) will be non-zero if main threw an exception.
*/
ret = (*env)->ExceptionOccurred(env) == NULL ? 0 : 1;
-
-leave:
- /*
- * Always detach the main thread so that it appears to have ended when
- * the application's main method exits. This will invoke the
- * uncaught exception handler machinery if main threw an
- * exception. An uncaught exception handler cannot change the
- * launcher's return code except by calling System.exit.
- */
- if ((*vm)->DetachCurrentThread(vm) != 0) {
- JLI_ReportErrorMessage(JVM_ERROR2);
- ret = 1;
- }
- /*
- * Wait for all non-daemon threads to end, then destroy the VM.
- * This will actually create a trivial new Java waiter thread
- * named "DestroyJavaVM", but this will be seen as a different
- * thread from the one that executed main, even though they are
- * the same C thread. This allows mainThread.join() and
- * mainThread.isAlive() to work as expected.
- */
- (*vm)->DestroyJavaVM(vm);
-
- return ret;
+ LEAVE();
}
/*
@@ -1076,15 +1076,17 @@
if (--argc >= 0) {
if (jarflag) {
*pjarfile = *argv++;
- *pclassname = 0;
+ *pclassname = NULL;
} else {
- *pjarfile = 0;
+ *pjarfile = NULL;
*pclassname = *argv++;
}
*pargc = argc;
*pargv = argv;
}
-
+ if (*pjarfile == NULL && *pclassname == NULL) {
+ *pret = 1;
+ }
return JNI_TRUE;
}