func (self *ATHROW) Execute(frame *rtda.Frame) { ex := frame.OperandStack().PopRef() if ex == nil { frame.Thread().ThrowNPE() return } thread := frame.Thread() for { frame := thread.CurrentFrame() pc := frame.NextPC() - 1 handler := frame.Method().FindExceptionHandler(ex.Class(), pc) if handler != nil { stack := frame.OperandStack() stack.Clear() stack.PushRef(ex) frame.SetNextPC(handler.HandlerPc()) return } thread.PopFrame() if thread.IsStackEmpty() { break } } thread.HandleUncaughtException(ex) }
// public static native FileSystem getFileSystem() // ()Ljava/io/FileSystem; func getFileSystem(frame *rtda.Frame) { thread := frame.Thread() unixFsClass := frame.ClassLoader().LoadClass("java/io/UnixFileSystem") if unixFsClass.InitializationNotStarted() { frame.SetNextPC(thread.PC()) // undo getFileSystem thread.InitClass(unixFsClass) return } stack := frame.OperandStack() unixFsObj := unixFsClass.NewObj() stack.PushRef(unixFsObj) // call <init> stack.PushRef(unixFsObj) // this constructor := unixFsClass.GetDefaultConstructor() thread.InvokeMethod(constructor) }
func (self *ANEW_ARRAY) Execute(frame *rtda.Frame) { cp := frame.ConstantPool() kClass := cp.GetConstant(self.Index).(*heap.ConstantClass) componentClass := kClass.Class() if componentClass.InitializationNotStarted() { thread := frame.Thread() frame.SetNextPC(thread.PC()) // undo anewarray thread.InitClass(componentClass) return } stack := frame.OperandStack() count := stack.PopInt() if count < 0 { frame.Thread().ThrowNegativeArraySizeException() } else { arr := heap.NewRefArray(componentClass, uint(count)) stack.PushRef(arr) } }
// 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 Branch(frame *rtda.Frame, offset int) { pc := frame.Thread().PC() nextPC := pc + offset frame.SetNextPC(nextPC) }