public static int StartMain(string[] args)
{
Tracer.EnableTraceConsoleListener();
Tracer.EnableTraceForDebug();
Hashtable hashtable = new Hashtable();
string text = Environment.GetEnvironmentVariable("CLASSPATH");
if (text == null || text == "")
{
text = ".";
}
hashtable["java.class.path"] = text;
bool flag = false;
bool flag2 = false;
bool flag3 = false;
bool flag4 = false;
bool flag5 = false;
string text2 = null;
int num = -1;
bool flag6 = false;
string arg = null;
bool flag7 = false;
int result;
for (int i = 0; i < args.Length; i++)
{
string text3 = args[i];
if (text3[0] != '-')
{
text2 = text3;
num = i + 1;
break;
}
if (text3 == "-help" || text3 == "-?")
{
break;
}
if (text3 == "-Xsave")
{
flag2 = true;
IKVM.Internal.Starter.PrepareForSaveDebugImage();
}
else if (text3 == "-XXsave")
{
flag3 = true;
IKVM.Internal.Starter.PrepareForSaveDebugImage();
}
else if (text3 == "-Xtime")
{
new IKVM.Helper.Starter.Timer();
}
else if (text3 == "-Xwait")
{
flag4 = true;
}
else if (text3 == "-Xbreak")
{
Debugger.Break();
}
else if (text3 == "-Xnoclassgc")
{
IKVM.Internal.Starter.ClassUnloading = false;
}
else if (text3 == "-jar")
{
flag = true;
}
else
{
if (text3 == "-version")
{
Console.WriteLine(Startup.getVersionAndCopyrightInfo());
Console.WriteLine();
Console.WriteLine("CLR version: {0} ({1} bit)", Environment.Version, IntPtr.Size * 8);
System.Type type = System.Type.GetType("Mono.Runtime");
if (type != null)
{
Console.WriteLine("Mono version: {0}", type.InvokeMember("GetDisplayName", BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod, null, null, new object[0]));
}
Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies();
for (int j = 0; j < assemblies.Length; j++)
{
Assembly assembly = assemblies[j];
Console.WriteLine("{0}: {1}", assembly.GetName().Name, assembly.GetName().Version);
}
string property = java.lang.System.getProperty("openjdk.version");
if (property != null)
{
Console.WriteLine("OpenJDK version: {0}", property);
}
result = 0;
return(result);
}
if (text3 == "-showversion")
{
flag5 = true;
}
else if (text3.StartsWith("-D"))
{
text3 = text3.Substring(2);
string[] array = text3.Split(new char[]
{
'='
});
string value;
if (array.Length == 2)
{
value = array[1];
}
else if (array.Length == 1)
{
value = "";
}
else
{
value = text3.Substring(array[0].Length + 1);
}
hashtable[array[0]] = value;
}
else if (text3 == "-ea" || text3 == "-enableassertions")
{
Assertions.EnableAssertions();
}
else if (text3 == "-da" || text3 == "-disableassertions")
{
Assertions.DisableAssertions();
}
else if (text3 == "-esa" || text3 == "-enablesystemassertions")
{
Assertions.EnableSystemAssertions();
}
else if (text3 == "-dsa" || text3 == "-disablesystemassertions")
{
Assertions.DisableSystemAssertions();
}
else if (text3.StartsWith("-ea:") || text3.StartsWith("-enableassertions:"))
{
Assertions.EnableAssertions(text3.Substring(text3.IndexOf(':') + 1));
}
else if (text3.StartsWith("-da:") || text3.StartsWith("-disableassertions:"))
{
Assertions.DisableAssertions(text3.Substring(text3.IndexOf(':') + 1));
}
else if (text3 == "-cp" || text3 == "-classpath")
{
hashtable["java.class.path"] = args[++i];
}
else if (text3.StartsWith("-Xtrace:"))
{
Tracer.SetTraceLevel(text3.Substring(8));
}
else if (text3.StartsWith("-Xmethodtrace:"))
{
Tracer.HandleMethodTrace(text3.Substring(14));
}
else if (text3 == "-Xdebug")
{
flag6 = true;
}
else if (!(text3 == "-Xnoagent"))
{
if (text3.StartsWith("-Xrunjdwp") || text3.StartsWith("-agentlib:jdwp"))
{
arg = text3;
flag6 = true;
}
else if (text3.StartsWith("-Xreference:"))
{
Startup.addBootClassPathAssemby(Assembly.LoadFrom(text3.Substring(12)));
}
else if (text3 == "-Xnoglobbing")
{
flag7 = true;
}
else
{
if (!text3.StartsWith("-Xms") && !text3.StartsWith("-Xmx") && !text3.StartsWith("-Xss") && !(text3 == "-Xmixed") && !(text3 == "-Xint") && !(text3 == "-Xnoclassgc") && !(text3 == "-Xincgc") && !(text3 == "-Xbatch") && !(text3 == "-Xfuture") && !(text3 == "-Xrs") && !(text3 == "-Xcheck:jni") && !(text3 == "-Xshare:off") && !(text3 == "-Xshare:auto") && !(text3 == "-Xshare:on"))
{
Console.Error.WriteLine("{0}: illegal argument", text3);
break;
}
Console.Error.WriteLine("Unsupported option ignored: {0}", text3);
}
}
}
}
if (text2 == null || flag5)
{
Console.Error.WriteLine(Startup.getVersionAndCopyrightInfo());
Console.Error.WriteLine();
}
if (text2 == null)
{
Console.Error.WriteLine("usage: ikvm [-options] <class> [args...]");
Console.Error.WriteLine(" (to execute a class)");
Console.Error.WriteLine(" or ikvm -jar [-options] <jarfile> [args...]");
Console.Error.WriteLine(" (to execute a jar file)");
Console.Error.WriteLine();
Console.Error.WriteLine("where options include:");
Console.Error.WriteLine(" -? -help Display this message");
Console.Error.WriteLine(" -version Display IKVM and runtime version");
Console.Error.WriteLine(" -showversion Display version and continue running");
Console.Error.WriteLine(" -cp -classpath <directories and zip/jar files separated by {0}>", Path.PathSeparator);
Console.Error.WriteLine(" Set search path for application classes and resources");
Console.Error.WriteLine(" -D<name>=<value> Set a system property");
Console.Error.WriteLine(" -ea[:<packagename>...|:<classname>]");
Console.Error.WriteLine(" -enableassertions[:<packagename>...|:<classname>]");
Console.Error.WriteLine(" Enable assertions.");
Console.Error.WriteLine(" -da[:<packagename>...|:<classname>]");
Console.Error.WriteLine(" -disableassertions[:<packagename>...|:<classname>]");
Console.Error.WriteLine(" Disable assertions");
Console.Error.WriteLine(" -Xsave Save the generated assembly (for debugging)");
Console.Error.WriteLine(" -Xtime Time the execution");
Console.Error.WriteLine(" -Xtrace:<string> Displays all tracepoints with the given name");
Console.Error.WriteLine(" -Xmethodtrace:<string>");
Console.Error.WriteLine(" Builds method trace into the specified output methods");
Console.Error.WriteLine(" -Xwait Keep process hanging around after exit");
Console.Error.WriteLine(" -Xbreak Trigger a user defined breakpoint at startup");
Console.Error.WriteLine(" -Xnoclassgc Disable class garbage collection");
Console.Error.WriteLine(" -Xnoglobbing Disable argument globbing");
result = 1;
return(result);
}
try
{
if (flag6)
{
Assembly assembly = Assembly.GetExecutingAssembly();
string text4 = arg + " -pid:" + System.Diagnostics.Process.GetCurrentProcess().Id;
string text5 = new FileInfo(assembly.Location).DirectoryName + "\\debugger.exe";
try
{
ProcessStartInfo processStartInfo = new ProcessStartInfo(text5, text4);
processStartInfo.UseShellExecute = false;
new System.Diagnostics.Process
{
StartInfo = processStartInfo
}.Start();
}
catch (System.Exception ex)
{
Console.Error.WriteLine(text5 + " " + text4);
throw ex;
}
}
if (flag)
{
hashtable["java.class.path"] = text2;
}
hashtable["sun.java.command"] = string.Join(" ", args, num - 1, args.Length - (num - 1));
hashtable["sun.java.launcher"] = "SUN_STANDARD";
Startup.setProperties(hashtable);
Startup.enterMainThread();
string[] array2;
if (flag7)
{
array2 = new string[args.Length - num];
System.Array.Copy(args, num, array2, 0, array2.Length);
}
else
{
array2 = Startup.glob(args, num);
}
if (flag)
{
text2 = IKVM.Helper.Starter.GetMainClassFromJarManifest(text2);
if (text2 == null)
{
result = 1;
return(result);
}
}
Class clazz = Class.forName(text2, true, ClassLoader.getSystemClassLoader());
try
{
Method method = IKVM.Internal.Starter.FindMainMethod(clazz);
if (method == null)
{
throw new NoSuchMethodError("main");
}
if (!Modifier.isPublic(method.getModifiers()))
{
Console.Error.WriteLine("Main method not public.");
}
else
{
method.setAccessible(true);
if (flag2)
{
java.lang.Runtime.getRuntime().addShutdownHook(new IKVM.Helper.Starter.SaveAssemblyShutdownHook(clazz));
}
if (flag4)
{
java.lang.Runtime.getRuntime().addShutdownHook(new IKVM.Helper.Starter.WaitShutdownHook());
}
try
{
method.invoke(null, new object[]
{
array2
});
result = 0;
return(result);
}
catch (InvocationTargetException ex2)
{
throw ex2.getCause();
}
}
}
finally
{
if (flag3)
{
IKVM.Internal.Starter.SaveDebugImage();
}
}
}
catch (System.Exception t)
{
java.lang.Thread thread = java.lang.Thread.currentThread();
thread.getThreadGroup().uncaughtException(thread, Util.mapException(t));
}
finally
{
Startup.exitMainThread();
}
result = 1;
return(result);
}