Esempio n. 1
0
File: VM.py Progetto: memsom/PyCIL
 def add_builtins(self):
     m = MethodDefinition()
     m.instructions.append(Ret())
     m.name = 'ctor'
     m.namespace = '[mscorlib]System.Object'
     m.returnType = Types.Void
     self.methods.append(m)
Esempio n. 2
0
 def add_builtins(self):
     m = MethodDefinition()
     m.instructions.append(Ret())
     m.name = "ctor"
     m.namespace = "[mscorlib]System.Object"
     m.returnType = Types.Void
     self.methods.append(m)
Esempio n. 3
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)
Esempio n. 4
0
    def test_newobj_no_parameters_initializes_int_field_to_zero(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)

        v = Variable()
        v.name = 'xyz'
        v.type = Types.Int32

        c.fieldDefinitions.append(v)

        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.assertEqual(len(o.fields), 1)
        self.assertEqual(o.fields[0].value, 0)

        self.assertEqual(len(o.fieldNames), 1)
        self.assertEqual(o.fieldNames[0], 'xyz')
Esempio n. 5
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)
Esempio n. 6
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)
Esempio n. 7
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)
Esempio n. 8
0
    def parse(self, parserContext):
        self.context = parserContext
        method = MethodDefinition()

        token = self.context.get_next_token()

        while token != BlockStart:
            if token == '(':
                self.parse_parameters(method)
            elif token in MethodDefinition.AttributeTypes.keys():
                method.attributes.append(token)
            elif token in Types.BuiltInTypes:
                method.returnType = Types.BuiltInTypes[token]
            elif token == '.method':
                pass
            else:
                try:
                    type = Types.resolve_type(token)
                    method.returnType = type
                except:
                    # If the type isn't found it must be the name of the method
                    parts = token.rpartition('.')
                    method.namespace = parts[0]
                    method.name = parts[2]
                    self.parse_parameters(method)

            token = self.context.get_next_token()

        token = self.context.get_next_token()
        while token != BlockEnd or len(self.end_block_instructions) > 0:
            if token == '.maxstack':
                method.maxStack = int(self.context.get_next_token())
            elif token == '.entrypoint':
                method.attributes.append(token)
            elif token == '.locals':
                method.locals = self.parse_locals(self.context)
            elif token == '.try':
                self.parse_try_block(method)
            elif token == 'catch':
                self.parse_catch_block(method)
            elif token == BlockEnd:
                self.parse_end_block(method)
            else:
                from InstructionParser import InstructionParser
                instruction = InstructionParser().parse_instruction(
                    token, self.context)
                method.instructions.append(instruction)

                if token == 'ret':
                    break

            token = self.context.get_next_token()

        return method
Esempio n. 9
0
    def parse(self, parserContext):
        self.context = parserContext
        method = MethodDefinition()

        token = self.context.get_next_token()

        while token != BlockStart:
            if token == '(':
                self.parse_parameters(method)
            elif token in MethodDefinition.AttributeTypes.keys():
                method.attributes.append(token)
            elif token in Types.BuiltInTypes:
                method.returnType = Types.BuiltInTypes[token]
            elif token == '.method':
                pass
            else:
                try:
                    type = Types.resolve_type(token)
                    method.returnType = type
                except:
                    # If the type isn't found it must be the name of the method
                    parts = token.rpartition('.')
                    method.namespace = parts[0]
                    method.name = parts[2]
                    self.parse_parameters(method)
                    
            token = self.context.get_next_token()

        token = self.context.get_next_token()
        while token != BlockEnd or len(self.end_block_instructions) > 0:
            if token == '.maxstack':
                method.maxStack = int(self.context.get_next_token())
            elif token == '.entrypoint':
                method.attributes.append(token)
            elif token == '.locals':
                method.locals = self.parse_locals(self.context)
            elif token == '.try':
                self.parse_try_block(method)
            elif token == 'catch':
                self.parse_catch_block(method)
            elif token == BlockEnd:
                self.parse_end_block(method)
            else:
                from InstructionParser import InstructionParser
                instruction = InstructionParser().parse_instruction(token, self.context)
                method.instructions.append(instruction)

                if token == 'ret':
                    break
                
            token = self.context.get_next_token()

        return method
Esempio n. 10
0
    def test_callvirt_constructor_strips_period(self):
        from VM import VM
        from MethodDefinition import MethodDefinition
        vm = VM()

        m = MethodDefinition()
        m.name = 'ctor()'
        m.namespace = 'A.B'
        m.returnType = Types.Int32
        m.parameters = []
        m.names = 'A.B'
        vm.methods.append(m)

        self.assertEqual(vm.currentMethod, None)

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

        self.assertEqual(vm.currentMethod.methodDefinition, m)
        self.assertEqual(vm.stack.get_number_of_frames(), 2)
Esempio n. 11
0
    def test_call_constructor_strips_period(self):
        from VM import VM
        from MethodDefinition import MethodDefinition
        vm = VM()

        m = MethodDefinition()
        m.name = 'ctor()'
        m.namespace = 'A.B'
        m.returnType = Types.Int32
        m.parameters = []
        m.names = 'A.B'
        vm.methods.append(m)

        self.assertEqual(vm.currentMethod, None)

        c = call('int32 A.B::.ctor()')
        c.execute(vm)

        self.assertEqual(vm.currentMethod.methodDefinition, m)
        self.assertEqual(vm.stack.get_number_of_frames(), 2)
Esempio n. 12
0
    def test_call_no_parameters_int(self):
        from VM import VM
        from MethodDefinition import MethodDefinition
        vm = VM()

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

        self.assertEqual(vm.currentMethod, None)

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

        self.assertEqual(vm.currentMethod.methodDefinition, m)
        self.assertEqual(vm.stack.get_number_of_frames(), 2)
Esempio n. 13
0
    def test_callvirt_no_parameters_int(self):
        from VM import VM
        from MethodDefinition import MethodDefinition

        vm = VM()

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

        self.assertEqual(vm.currentMethod, None)

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

        self.assertEqual(vm.currentMethod.methodDefinition, m)
        self.assertEqual(vm.stack.get_number_of_frames(), 2)
Esempio n. 14
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)
Esempio n. 15
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)