func (self *multianewarray) Execute(frame *rtda.Frame) { cp := frame.ConstantPool() kClass := cp.GetConstant(uint(self.index)).(*rtc.ConstantClass) arrClass := kClass.Class() stack := frame.OperandStack() counts := stack.PopTops(uint(self.dimensions)) if !_checkCounts(counts) { frame.Thread().ThrowNegativeArraySizeException() } else { arr := _newMultiArray(counts, arrClass) stack.PushRef(arr) } }
func (self *ldc2_w) Execute(frame *rtda.Frame) { stack := frame.OperandStack() cp := frame.ConstantPool() c := cp.GetConstant(self.index) switch c.(type) { case int64: stack.PushLong(c.(int64)) case float64: stack.PushDouble(c.(float64)) default: jutil.Panicf("ldc2_w! %v", c) } }
func (self *instanceof) Execute(frame *rtda.Frame) { stack := frame.OperandStack() ref := stack.PopRef() cp := frame.ConstantPool() kClass := cp.GetConstant(self.index).(*rtc.ConstantClass) class := kClass.Class() if ref == nil { stack.PushInt(0) } else if ref.IsInstanceOf(class) { stack.PushInt(1) } else { stack.PushInt(0) } }
func (self *new_) Execute(frame *rtda.Frame) { if self.class == nil { cp := frame.ConstantPool() kClass := cp.GetConstant(self.index).(*rtc.ConstantClass) self.class = kClass.Class() } // init class if self.class.InitializationNotStarted() { frame.RevertNextPC() // undo new frame.Thread().InitClass(self.class) return } ref := self.class.NewObj() frame.OperandStack().PushRef(ref) }
func (self *anewarray) Execute(frame *rtda.Frame) { cp := frame.ConstantPool() kClass := cp.GetConstant(self.index).(*rtc.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 := rtc.NewRefArray(componentClass, uint(count)) stack.PushRef(arr) } }
func _ldc(frame *rtda.Frame, index uint) { stack := frame.OperandStack() cp := frame.ConstantPool() c := cp.GetConstant(index) switch c.(type) { case int32: stack.PushInt(c.(int32)) case float32: stack.PushFloat(c.(float32)) case string: internedStr := rtda.JString(c.(string)) stack.PushRef(internedStr) case *rtc.ConstantClass: kClass := c.(*rtc.ConstantClass) classObj := kClass.Class().JClass() stack.PushRef(classObj) default: // todo // ref to MethodType or MethodHandle jutil.Panicf("todo: ldc! %v", c) } }