Пример #1
0
    def test_callvirt_one_parameter_instance_puts_this_pointer_and_parameter_on_stack(self):
        from VM import VM
        from MethodDefinition import MethodDefinition

        vm = VM()

        paramObject = Variable()
        paramObject.type = Types.Int32

        m = MethodDefinition()
        m.name = "TestMethod"
        m.namespace = "A.B"
        m.returnType = Types.Int32
        m.parameters = [paramObject]
        m.names = "A.B"
        m.attributes.append(MethodDefinition.AttributeTypes["instance"])
        vm.methods.append(m)

        r = ReferenceType()
        vm.stack.push(r)
        v = Variable(8888)
        vm.stack.push(v)
        self.assertEqual(vm.currentMethod, None)

        c = callvirt("instance int32 A.B::TestMethod ( int32 )")
        c.execute(vm)

        self.assertEqual(vm.currentMethod.methodDefinition, m)
        self.assertEqual(vm.stack.get_number_of_frames(), 2)
        self.assertEqual(len(vm.current_method().parameters), 2)
        self.assertEqual(vm.current_method().parameters[1], v)
        self.assertEqual(vm.current_method().parameters[0], r)
Пример #2
0
    def test_callvirt_one_parameter_instance_puts_this_pointer_and_parameter_on_stack(
            self):
        from VM import VM
        from MethodDefinition import MethodDefinition
        vm = VM()

        paramObject = Variable()
        paramObject.type = Types.Int32

        m = MethodDefinition()
        m.name = 'TestMethod'
        m.namespace = 'A.B'
        m.returnType = Types.Int32
        m.parameters = [paramObject]
        m.names = 'A.B'
        m.attributes.append(MethodDefinition.AttributeTypes['instance'])
        vm.methods.append(m)

        r = ReferenceType()
        vm.stack.push(r)
        v = Variable(8888)
        vm.stack.push(v)
        self.assertEqual(vm.currentMethod, None)

        c = callvirt('instance int32 A.B::TestMethod ( int32 )')
        c.execute(vm)

        self.assertEqual(vm.currentMethod.methodDefinition, m)
        self.assertEqual(vm.stack.get_number_of_frames(), 2)
        self.assertEqual(len(vm.current_method().parameters), 2)
        self.assertEqual(vm.current_method().parameters[1], v)
        self.assertEqual(vm.current_method().parameters[0], r)
Пример #3
0
    def test_callvirt_one_parameter_int(self):
        from VM import VM
        from MethodDefinition import MethodDefinition

        vm = VM()

        paramObject = Variable()
        paramObject.type = Types.Int32
        m = MethodDefinition()
        m.namespace = "A.B"
        m.name = "TestMethod"
        m.returnType = Types.Int32
        m.parameters = [paramObject]
        vm.methods.append(m)

        param = Variable()
        param.value = 123
        param.type = Types.Int32
        vm.stack.push(param)

        c = callvirt("int32 A.B::TestMethod ( int32 )")
        c.execute(vm)

        self.assertEqual(vm.currentMethod.methodDefinition, m)
        self.assertEqual(vm.stack.get_number_of_frames(), 2)
        self.assertEqual(vm.current_method().parameters[0], param)
Пример #4
0
    def test_callvirt_one_parameter_int(self):
        from VM import VM
        from MethodDefinition import MethodDefinition
        vm = VM()

        paramObject = Variable()
        paramObject.type = Types.Int32
        m = MethodDefinition()
        m.namespace = 'A.B'
        m.name = 'TestMethod'
        m.returnType = Types.Int32
        m.parameters = [paramObject]
        vm.methods.append(m)

        param = Variable()
        param.value = 123
        param.type = Types.Int32
        vm.stack.push(param)

        c = callvirt('int32 A.B::TestMethod ( int32 )')
        c.execute(vm)

        self.assertEqual(vm.currentMethod.methodDefinition, m)
        self.assertEqual(vm.stack.get_number_of_frames(), 2)
        self.assertEqual(vm.current_method().parameters[0], param)
Пример #5
0
    def test_execute_void_no_parameters(self):
        from VM import VM
        vm = VM()
        m = Method()
        m.name = 'TestMethod'
        m.returnType = Types.Void
        m.parameters = []
        vm.methods.append(m)

        self.assertEqual(vm.current_method(), None)

        vm.execute_method(m)
        self.assertEqual(vm.current_method(), m)

        r = Ret()
        r.execute(vm)
        self.assertEqual(vm.current_method(), None)
Пример #6
0
    def test_execute_void_no_parameters(self):
        from VM import VM
        vm = VM()
        m = Method()
        m.name = 'TestMethod'
        m.returnType = Types.Void
        m.parameters = []
        vm.methods.append(m)

        self.assertEqual(vm.current_method(), None)
        
        vm.execute_method(m)
        self.assertEqual(vm.current_method(), m)
        
        r = Ret()
        r.execute(vm)
        self.assertEqual(vm.current_method(), None)
Пример #7
0
    def test_execute_int_no_parameters_returns_value_on_stack(self):
        from VM import VM
        vm = VM()
        m = Method()
        m.name = 'TestMethod'
        m.returnType = Types.Int32
        m.parameters = []
        vm.methods.append(m)

        v = Variable(888)
        self.assertEqual(vm.current_method(), None)
        self.assertEqual(vm.stack.get_frame_count(), 0)
        vm.execute_method(m)
        vm.stack.push(v)
        self.assertEqual(vm.current_method(), m)
        # fixme - test return value too
        r = Ret()
        r.execute(vm)
        self.assertEqual(vm.current_method(), None)
        self.assertEqual(vm.stack.get_frame_count(), 1)
        self.assertEqual(vm.stack.pop(), v)
Пример #8
0
    def test_execute_int_no_parameters_returns_value_on_stack(self):
        from VM import VM
        vm = VM()
        m = Method()
        m.name = 'TestMethod'
        m.returnType = Types.Int32
        m.parameters = []
        vm.methods.append(m)

        v = Variable(888)
        self.assertEqual(vm.current_method(), None)
        self.assertEqual(vm.stack.get_frame_count(), 0)
        vm.execute_method(m)
        vm.stack.push(v)
        self.assertEqual(vm.current_method(), m)
        # fixme - test return value too
        r = Ret()
        r.execute(vm)
        self.assertEqual(vm.current_method(), None)
        self.assertEqual(vm.stack.get_frame_count(), 1)
        self.assertEqual(vm.stack.pop(), v)
Пример #9
0
    def test_execute_instance_clears_stack_with_void_return_type(self):
        from VM import VM
        vm = VM()
        m = Method()
        m.name = 'TestMethod'
        m.attributes.append(MethodDefinition.AttributeTypes['instance'])
        m.returnType = Types.Void
        m.maxStack = 99
        m.parameters = []
        vm.methods.append(m)
        vm.stack.push(111)
        vm.execute_method(m)
        vm.stack.push(124)
        vm.stack.push(987)

        r = Ret()
        r.execute(vm)
        self.assertEqual(vm.current_method(), None)
        self.assertEqual(vm.stack.count(), 1)
        self.assertEqual(vm.stack.pop(), 111)
Пример #10
0
 def test_execute_instance_clears_stack_with_void_return_type(self):
     from VM import VM
     vm = VM()
     m = Method()
     m.name = 'TestMethod'
     m.attributes.append(MethodDefinition.AttributeTypes['instance'])
     m.returnType = Types.Void
     m.maxStack = 99
     m.parameters = []
     vm.methods.append(m)
     vm.stack.push(111)
     vm.execute_method(m)
     vm.stack.push(124)
     vm.stack.push(987)
     
     r = Ret()
     r.execute(vm)
     self.assertEqual(vm.current_method(), None)
     self.assertEqual(vm.stack.count(), 1)
     self.assertEqual(vm.stack.pop(), 111)
Пример #11
0
    def test_newobj_no_parameters_adds_this_pointer_to_parameters(self):
        from VM import VM

        vm = VM()

        m = MethodDefinition()
        m.name = 'ctor'
        m.namespace = 'testnamespace.testclass'
        vm.methods.append(m)

        c = ClassDefinition()
        c.name = 'testclass'
        c.namespace = 'testnamespace'
        c.methods.append(m)

        t = Types.register_custom_type(c)

        n = newobj('instance void testnamespace.testclass::.ctor()')
        n.execute(vm)
        self.assertEqual(len(vm.current_method().parameters), 1)
        Types.unregister_custom_type(t)
Пример #12
0
    def test_newobj_no_parameters_calls_constructor(self):
        from VM import VM

        vm = VM()

        m = MethodDefinition()
        m.name = 'ctor'
        m.namespace = 'testnamespace.testclass'
        vm.methods.append(m)

        c = ClassDefinition()
        c.name = 'testclass'
        c.namespace = 'testnamespace'
        c.methods.append(m)

        t = Types.register_custom_type(c)

        n = newobj('instance void testnamespace.testclass::ctor()')
        n.execute(vm)
        Types.unregister_custom_type(t)

        o = vm.stack.pop()
        self.assertEqual(o.type, t)
        self.assertEquals(vm.current_method().methodDefinition, m)