func (self *Thread) InvokeMethod(method *rtc.Method) { //self._logInvoke(self.stack.size, method) currentFrame := self.CurrentFrame() newFrame := self.NewFrame(method) self.PushFrame(newFrame) argSlotsCount := method.ArgSlotCount() if argSlotsCount > 0 { _passArgs(currentFrame.operandStack, newFrame.localVars, argSlotsCount) } if method.IsSynchronized() { var monitor *rtc.Monitor if method.IsStatic() { classObj := method.Class().JClass() monitor = classObj.Monitor() } else { thisObj := newFrame.LocalVars().GetThis() monitor = thisObj.Monitor() } monitor.Enter(self) newFrame.SetOnPopAction(func() { monitor.Exit(self) }) } }
func newNativeFrame(thread *Thread, method *rtc.Method) *Frame { frame := &Frame{} frame.thread = thread frame.method = method frame.localVars = newLocalVars(method.ArgSlotCount()) // todo frame.operandStack = newOperandStack(4) // todo code := method.Code() if code == nil { code = getHackCode(method.Descriptor()) method.HackSetCode(code) } return frame }
// Object[] -> []interface{} func convertArgs(this, argArr *rtc.Obj, method *rtc.Method) []interface{} { if method.ArgSlotCount() == 0 { return nil } if method.ArgSlotCount() == 1 && !method.IsStatic() { return []interface{}{this} } argObjs := argArr.Refs() argTypes := method.ParsedDescriptor().ParameterTypes() args := make([]interface{}, method.ArgSlotCount()) j := 0 if !method.IsStatic() { args[0] = this j = 1 } for i, argType := range argTypes { argObj := argObjs[i] if argType.IsBaseType() { // todo unboxed := box.Unbox(argObj, argType.Descriptor()) args[i+j] = unboxed if argType.IsLongOrDouble() { j++ } } else { args[i+j] = argObj } } return args }