// private static native void setOut0(PrintStream out); // (Ljava/io/PrintStream;)V func setOut0(frame *rtda.Frame) { vars := frame.LocalVars() out := vars.GetRef(0) sysClass := frame.Method().Class() sysClass.SetStaticValue("out", "Ljava/io/PrintStream;", out) }
// private static native void setIn0(InputStream in); // (Ljava/io/InputStream;)V func setIn0(frame *rtda.Frame) { vars := frame.LocalVars() in := vars.GetRef(0) sysClass := frame.Method().Class() sysClass.SetStaticValue("in", "Ljava/io/InputStream;", in) }
// private static native void setErr0(PrintStream err); // (Ljava/io/PrintStream;)V func setErr0(frame *rtda.Frame) { vars := frame.LocalVars() err := vars.GetRef(0) sysClass := frame.Method().Class() sysClass.SetStaticValue("err", "Ljava/io/PrintStream;", err) }
func (self *invokespecial) Execute(frame *rtda.Frame) { cp := frame.Method().Class().ConstantPool() k := cp.GetConstant(self.index) if kMethodRef, ok := k.(*rtc.ConstantMethodref); ok { method := kMethodRef.SpecialMethod() frame.Thread().InvokeMethod(method) } else { method := k.(*rtc.ConstantInterfaceMethodref).SpecialMethod() frame.Thread().InvokeMethod(method) } }
func _logInstruction(frame *rtda.Frame, inst instructions.Instruction) { thread := frame.Thread() method := frame.Method() className := method.Class().Name() methodName := method.Name() pc := thread.PC() if method.IsStatic() { fmt.Printf("[instruction] thread:%p %v.%v() #%v %T %v\n", thread, className, methodName, pc, inst, inst) } else { fmt.Printf("[instruction] thread:%p %v#%v() #%v %T %v\n", thread, className, methodName, pc, inst, inst) } }
func (self *invokeinterface) Execute(frame *rtda.Frame) { if self.kMethodRef == nil { cp := frame.Method().ConstantPool() self.kMethodRef = cp.GetConstant(self.index).(*rtc.ConstantInterfaceMethodref) self.argSlotCount = self.kMethodRef.ArgSlotCount() } stack := frame.OperandStack() ref := stack.TopRef(self.argSlotCount) if ref == nil { panic("NPE") // todo } method := self.kMethodRef.FindInterfaceMethod(ref) frame.Thread().InvokeMethod(method) }
func (self *invokevirtual) Execute(frame *rtda.Frame) { if self.kMethodRef == nil { cp := frame.Method().ConstantPool() self.kMethodRef = cp.GetConstant(self.index).(*rtc.ConstantMethodref) self.argSlotCount = self.kMethodRef.ArgSlotCount() } stack := frame.OperandStack() ref := stack.TopRef(self.argSlotCount) if ref == nil { frame.Thread().ThrowNPE() return } method := self.kMethodRef.GetVirtualMethod(ref) frame.Thread().InvokeMethod(method) }
func (self *putfield) Execute(frame *rtda.Frame) { if self.field == nil { cp := frame.Method().Class().ConstantPool() kFieldRef := cp.GetConstant(self.index).(*rtc.ConstantFieldref) self.field = kFieldRef.InstanceField() } stack := frame.OperandStack() val := stack.PopField(self.field.IsLongOrDouble) ref := stack.PopRef() if ref == nil { frame.Thread().ThrowNPE() return } self.field.PutValue(ref, val) }
func (self *putstatic) Execute(frame *rtda.Frame) { if self.field == nil { cp := frame.Method().Class().ConstantPool() kFieldRef := cp.GetConstant(self.index).(*rtc.ConstantFieldref) self.field = kFieldRef.StaticField() } class := self.field.Class() if class.InitializationNotStarted() { frame.RevertNextPC() frame.Thread().InitClass(class) return } val := frame.OperandStack().PopField(self.field.IsLongOrDouble) self.field.PutStaticValue(val) }
func (self *checkcast) Execute(frame *rtda.Frame) { if self.class == nil { cp := frame.Method().Class().ConstantPool() kClass := cp.GetConstant(self.index).(*rtc.ConstantClass) self.class = kClass.Class() } stack := frame.OperandStack() ref := stack.PopRef() stack.PushRef(ref) if ref == nil { return } if !ref.IsInstanceOf(self.class) { frame.Thread().ThrowClassCastException(ref.Class(), self.class) } }
func (self *invokestatic) Execute(frame *rtda.Frame) { if self.method == nil { cp := frame.Method().Class().ConstantPool() k := cp.GetConstant(self.index) if kMethodRef, ok := k.(*rtc.ConstantMethodref); ok { self.method = kMethodRef.StaticMethod() } else { self.method = k.(*rtc.ConstantInterfaceMethodref).StaticMethod() } } // init class class := self.method.Class() if class.InitializationNotStarted() { frame.RevertNextPC() frame.Thread().InitClass(class) return } frame.Thread().InvokeMethod(self.method) }
func (self *invoke_native) Execute(frame *rtda.Frame) { nativeMethod := frame.Method().NativeMethod().(func(*rtda.Frame)) nativeMethod(frame) }