func (self *Thread) InvokeMethod(method *heap.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 *heap.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 (self *Thread) _logInvoke(stackSize uint, method *heap.Method) { space := strings.Repeat(" ", int(stackSize)) className := method.Class().Name() methodName := method.Name() if method.IsStatic() { fmt.Printf("[method]%v thread:%p %v.%v()\n", space, self, className, methodName) } else { fmt.Printf("[method]%v thread:%p %v#%v()\n", space, self, className, methodName) } }