func startJVM(cmd *cmdline.Command) { Xcpuprofile := cmd.Options().Xcpuprofile if Xcpuprofile != "" { f, err := os.Create(Xcpuprofile) if err != nil { panic(err) } pprof.StartCPUProfile(f) defer pprof.StopCPUProfile() } options.InitOptions(cmd.Options()) cp := classpath.Parse(cmd.Options().Classpath()) rtc.InitBootLoader(cp) mainClassName := jutil.ReplaceAll(cmd.Class(), ".", "/") mainThread := createMainThread(mainClassName, cmd.Args()) interpreter.Loop(mainThread) interpreter.KeepAlive() }
// private static native Class<?> forName0(String name, boolean initialize, // ClassLoader loader, // Class<?> caller) // throws ClassNotFoundException; // (Ljava/lang/String;ZLjava/lang/ClassLoader;Ljava/lang/Class;)Ljava/lang/Class; func forName0(frame *rtda.Frame) { vars := frame.LocalVars() jName := vars.GetRef(0) initialize := vars.GetBoolean(1) //jLoader := vars.GetRef(2) goName := rtda.GoString(jName) goName = jutil.ReplaceAll(goName, ".", "/") goClass := frame.ClassLoader().LoadClass(goName) jClass := goClass.JClass() if initialize && goClass.InitializationNotStarted() { // undo forName0 thread := frame.Thread() frame.SetNextPC(thread.PC()) // init class thread.InitClass(goClass) } else { stack := frame.OperandStack() stack.PushRef(jClass) } }
func SlashToDot(name string) string { return jutil.ReplaceAll(name, "/", ".") }
func DotToSlash(name string) string { return jutil.ReplaceAll(name, ".", "/") }