コード例 #1
0
ファイル: reference.py プロジェクト: kimi641/pyJVM
    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))
コード例 #2
0
ファイル: reference.py プロジェクト: kimi641/pyJVM
    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())
コード例 #3
0
ファイル: reference.py プロジェクト: kimi641/pyJVM
    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)
コード例 #4
0
ファイル: reference.py プロジェクト: kimi641/pyJVM
    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)