def Execute(self, frame:rtda.Frame): cp = frame.Method().Class().ConstantPool() fieldRef = cp.GetConstant(self.Index) field = fieldRef.ResolvedField() _class = field.Class() if not _class.InitStarted(): frame.RevertNextPC() instructions.base.InitClass(frame.Thread(), _class) return if not field.IsStatic(): raise ValueError("java.lang.IncompatibleClassChangeError") descriptor = field.Descriptor() slotId = field.SlotId() slots = _class.StaticVars() stack = frame.OperandStack() if descriptor[0] in ['Z','B','C','S','I']: stack.PushInt(slots.GetInt(slotId)) elif descriptor[0] == 'F': stack.PushFloat(slots.GetFloat(slotId)) elif descriptor[0] == 'J': stack.PushLong(slots.GetLong(slotId)) elif descriptor[0] == 'D': stack.PushDouble(slots.GetDouble(slotId)) elif descriptor[0] in ['L', '[']: stack.PushRef(slots.GetRef(slotId))
def Execute(self, frame:rtda.Frame): currentMethod = frame.Method() currentClass = currentMethod.Class() cp = currentClass.ConstantPool() fieldRef = cp.GetConstant(self.Index) field = fieldRef.ResolvedField() _class = field.Class() if not _class.InitStarted(): frame.RevertNextPC() instructions.base.InitClass(frame.Thread(), _class) return if not field.IsStatic(): raise ValueError("java.lang.IncompatibleClassChangeError") if field.IsFinal(): if currentClass != _class or currentMethod.Name() != "<clinit>": raise ValueError("java.lang.IllegalAccessError") descriptor = field.Descriptor() slotId = field.SlotId() slots = _class.StaticVars() stack = frame.OperandStack() if descriptor[0] in ['Z','B','C','S','I']: slots.SetInt(slotId, stack.PopInt()) elif descriptor[0] == 'F': slots.SetFloat(slotId, stack.PopFloat()) elif descriptor[0] == 'J': slots.SetLong(slotId, stack.PopLong()) elif descriptor[0] == 'D': slots.SetDouble(slotId, stack.PopDouble()) elif descriptor[0] in ['L', '[']: slots.SetRef(slotId, stack.PopRef())
def Execute(self, frame:rtda.Frame): cp = frame.Method().Class().ConstantPool() methodRef = cp.GetConstant(self.Index) resolvedMethod = methodRef.ResolvedMethod() if not resolvedMethod.IsStatic(): raise ValueError(f"java.lang.IncompativleClassChangeError") _class = resolvedMethod.Class() if not _class.InitStarted(): frame.RevertNextPC() instructions.base.InitClass(frame.Thread(), _class) return instructions.base.InvokeMethod(frame, resolvedMethod)
def Execute(self, frame:rtda.Frame): cp = frame.Method().Class().ConstantPool() classRef = cp.GetConstant(self.Index) _class = classRef.ResolvedClass() if not _class.InitStarted(): frame.RevertNextPC() instructions.base.InitClass(frame.Thread(), _class) return if _class.IsInterface() or _class.IsAbstract(): raise ValueError("java.lang.InstantiationError") ref = _class.NewObject() frame.OperandStack().PushRef(ref)