Ejemplo n.º 1
0
    def Execute(self, frame:rtda.Frame):
        currentClass = frame.Method().Class()
        cp = frame.Method().Class().ConstantPool()
        methodRef = cp.GetConstant(self.Index)
        resolvedMethod = methodRef.ResolvedMethod()
        if resolvedMethod.IsStatic():
            raise ValueError("java.lang.IncompatibleClassChangeError")

        ref = frame.OperandStack().GetRefFromTop(resolvedMethod.ArgSlotCount() - 1)
        if ref == None:
            # hack System.out.println()
            if methodRef.Name() == "println":
                _println(frame.OperandStack(), methodRef.Descriptor())
                return
            raise ValueError("java.lang.NullPointerException")

        if resolvedMethod.IsProtected() and \
           resolvedMethod.Class().IsSuperClassOf(currentClass) and \
           resolvedMethod.Class().GetPackageName() != currentClass.GetPackageName() and \
           ref.Class() != currentClass and \
           not ref.Class().IsSubClassOf(currentClass):
            raise ValueError("java.lang.IllegalAccessError")

        methodToBeInvoked = rtda.heap.lookupMethodInClass(ref.Class(), \
                                methodRef.Name(), methodRef.Descriptor())
        if methodToBeInvoked == None or methodToBeInvoked.IsAbstract():
            raise ValueError("java.lang.AbstractMethodError")

        instructions.base.InvokeMethod(frame, methodToBeInvoked)
Ejemplo n.º 2
0
    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))
Ejemplo n.º 3
0
    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())
Ejemplo n.º 4
0
    def Execute(self, frame:rtda.Frame):
        cp = frame.Method().Class().ConstantPool()
        fieldRef = cp.GetConstant(self.Index)
        field = fieldRef.ResolvedField()

        if field.IsStatic():
            raise ValueError("java.lang.IncompatibleClassChangeError")
        
        stack = frame.OperandStack()
        ref = stack.PopRef()
        if ref == None:
            raise ValueError("java.lang.NullPointerException")

        descriptor = field.Descriptor()
        slotId = field.SlotId()
        slots = ref.Fields()

        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))
Ejemplo n.º 5
0
Archivo: ldc.py Proyecto: kimi641/pyJVM
def _ldc(frame: rtda.Frame, index: int):
    stack = frame.OperandStack()
    cp = frame.Method().Class().ConstantPool()
    c = cp.GetConstant(index)

    if isinstance(c, int):
        stack.PushInt(c)
    elif isinstance(c, float):
        stack.PushFloat(c)
    else:
        raise ValueError("todo: ldc!")
Ejemplo n.º 6
0
Archivo: ldc.py Proyecto: kimi641/pyJVM
    def Execute(self, frame: rtda.Frame):
        stack = frame.OperandStack()
        cp = frame.Method().Class().ConstantPool()
        c = cp.GetConstant(self.Index)

        if isinstance(c, int):
            stack.PushLong(c)
        elif isinstance(c, float):
            stack.PushDouble(c)
        else:
            raise ValueError("java.lang.ClassFormatError")
Ejemplo n.º 7
0
    def Execute(self, frame:rtda.Frame):
        stack = frame.OperandStack()
        ref = stack.PopRef()
        stack.PushRef(ref)
        if ref == None:
            return

        cp = frame.Method().Class().ConstantPool()
        classRef = cp.GetConstant(self.Index)
        _class = classRef.ResolvedClass()
        if not ref.IsInstanceOf(_class):
            raise ValueError("java.lang.ClassCastException")
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
    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)
Ejemplo n.º 10
0
    def Execute(self, frame:rtda.Frame):
        stack = frame.OperandStack()
        ref = stack.PopRef()
        if ref == None:
            stack.PushInt(0)
            return

        cp = frame.Method().Class().ConstantPool()
        classRef = cp.GetConstant(self.Index)
        _class = classRef.ResolvedClass()

        if ref.IsInstanceOf(_class):
            stack.PushInt(1)
        else:
            stack.PushInt(0)
Ejemplo n.º 11
0
    def Execute(self, frame:rtda.Frame):
        currentMethod = frame.Method()
        currentClass = currentMethod.Class()
        cp = currentClass.ConstantPool()
        fieldRef = cp.GetConstant(self.Index)
        field = fieldRef.ResolvedField()

        if field.IsStatic():
            raise ValueError("java.lang.IncompatibleClassChangeError")

        if field.IsFinal():
            if currentClass != field.Class() or currentMethod.Nmae() != "<init>":
                raise ValueError("java.lang.IllegalAccessError")

        descriptor = field.Descriptor()
        slotId = field.SlotId()
        stack = frame.OperandStack()

        if descriptor[0] in ['Z','B','C','S','I']:
            val = stack.PopInt()
            ref = stack.PopRef()
            if ref == None:
                raise ValueError("java.lang.NullPointerException")
            ref.Fields().SetInt(slotId, val)
        elif descriptor[0] == 'F':
            val = stack.PopFloat()
            ref = stack.PopFloat()
            if ref == None:
                raise ValueError("java.lang.NullPointerException")
            ref.Fields().SetFloat(slotId, val)
        elif descriptor[0] == 'J':
            val = stack.PopLong()
            ref = stack.PopLong()
            if ref == None:
                raise ValueError("java.lang.NullPointerException")
            ref.Fields().SetLong(slotId, val)
        elif descriptor[0] == 'D':
            val = stack.PopDouble()
            ref = stack.PopDouble()
            if ref == None:
                raise ValueError("java.lang.NullPointerException")
            ref.Fields().SetDouble(slotId, val)
        elif descriptor[0] in ['L', '[']:
            val = stack.PopRef()
            ref = stack.PopRef()
            if ref == None:
                raise ValueError("java.lang.NullPointerException")
            ref.Fields().SetRef(slotId, val)
Ejemplo n.º 12
0
    def Execute(self, frame:rtda.Frame):
        cp = frame.Method().Class().ConstantPool()
        methodRef = cp.GetConstant(self.index)
        resolvedMethod = methodRef.ResolvedInterfaceMethod()
        if resolvedMethod.IsStatic() or resolvedMethod.IsPrivate():
            raise ValueError(f"java.lang.IncompativleClassChangeError")

        ref = frame.OperandStack().GetRefFromTop(resolvedMethod.ArgSlotCount() - 1)
        if ref == None:
            raise ValueError("java.lang.NullPointerException")
        if not ref.Class().IsImplements(methodRef.ResolvedClass()):
            raise ValueError(f"java.lang.IncompativleClassChangeError")

        methodToBeInvoked = rtda.heap.lookupMethodInClass(ref.Class(), \
                                methodRef.Name(), methodRef.Descriptor())
        if methodToBeInvoked == None or methodToBeInvoked.IsAbstract():
            raise ValueError("java.lang.AbstractMethodError")
        if not methodToBeInvoked.IsPublic():
            raise ValueError("java.lang.IllegalAccessError")

        instructions.base.InvokeMethod(frame, methodToBeInvoked)
Ejemplo n.º 13
0
def logInstruction(frame: rtda.Frame, inst: instructions.base.Instruction):
    method = frame.Method()
    className = method.Class().Name()
    methodName = method.Name()
    pc = frame.Thread().PC()
    print(f"{className}.{methodName} #{pc} {inst} {inst}")