Esempio n. 1
0
    def test_parse_method_ret(self):
        s = (
            ".method public void main() {\n "
            ".locals init (int32 first,\n"
            "int32 second,\n"
            "int32 result)\n"
            "ret\n"
            " }"
        )

        vm = VM()
        p = ParserContext(s)
        mp = MethodParser()
        m = mp.parse(p)

        locals = m.locals
        self.assertEqual(len(locals), 3)
        self.assertEqual(locals[0].name, "first")
        self.assertEqual(locals[0].alias, None)
        self.assertEqual(locals[0].type, Types.Int32)
        self.assertEqual(locals[1].name, "second")
        self.assertEqual(locals[1].alias, None)
        self.assertEqual(locals[1].type, Types.Int32)
        self.assertEqual(locals[2].name, "result")
        self.assertEqual(locals[2].alias, None)
        self.assertEqual(locals[2].type, Types.Int32)

        self.assertEqual(len(m.instructions), 1)
        self.assertEqual("ret", m.instructions[0].name)
Esempio n. 2
0
File: VM.py Progetto: memsom/PyCIL
    def test_parse_method_ret(self):
        s = ('.method public void main() {\n '
            '.locals init (int32 first,\n'
             'int32 second,\n'
             'int32 result)\n'
             'ret\n'
             ' }')
        
        vm = VM()
        p = ParserContext(s)
        mp = MethodParser()
        m = mp.parse(p)
        
        locals = m.locals
        self.assertEqual(len(locals), 3)
        self.assertEqual(locals[0].name, 'first')
        self.assertEqual(locals[0].alias, None)
        self.assertEqual(locals[0].type, Types.Int32)
        self.assertEqual(locals[1].name, 'second')
        self.assertEqual(locals[1].alias, None)
        self.assertEqual(locals[1].type, Types.Int32)   
        self.assertEqual(locals[2].name, 'result')
        self.assertEqual(locals[2].alias, None)
        self.assertEqual(locals[2].type, Types.Int32)       

        self.assertEqual(len(m.instructions), 1)
        self.assertEqual('ret', m.instructions[0].name)
Esempio n. 3
0
    def test_execute_method_add(self):
        s = ".method public int main() {\n " ".maxstack 10\n" "ldc.i4.1\n" "ldc.i4.5\n" "add\n" "ret\n" "}"

        vm = VM()
        p = ParserContext(s)
        mp = MethodParser()
        m = mp.parse(p)
        vm.execute_method(m.get_method())
        self.assertEqual(vm.stack.count(), 1)
        self.assertEqual(vm.stack.pop().value, 6)
Esempio n. 4
0
File: VM.py Progetto: memsom/PyCIL
 def test_execute_method_add(self):
     s = ('.method public int main() {\n '
          '.maxstack 10\n'
          'ldc.i4.1\n'
          'ldc.i4.5\n'
          'add\n'
          'ret\n'
          '}')
     
     vm = VM()
     p = ParserContext(s)
     mp = MethodParser()
     m = mp.parse(p)       
     vm.execute_method(m.get_method())
     self.assertEqual(vm.stack.count(), 1)
     self.assertEqual(vm.stack.pop().value, 6)
Esempio n. 5
0
    def parse(self, parserContext):
        c = ClassDefinition()

        while True:
            token = parserContext.get_next_token()
            if token in ClassFlags:
                c.flags.append(token)
            elif token == 'extends':
                c.base = parserContext.get_next_token()
            elif token == '.method':
                m = MethodParser().parse(parserContext)
                m.namespace = c.namespace + '.' + c.name
                c.methods.append(m)
                parserContext.methods.append(m)
                # fixme - should i add to both?
            elif token == '.field':
                v = Variable()
                visibility = parserContext.get_next_token()
                type = parserContext.get_next_token(
                )  # fixme - type, visibility
                if type == 'class':
                    type = parserContext.get_next_token()

                if Types.BuiltInTypes.has_key(type):
                    v.type = Types.BuiltInTypes[type]
                else:
                    v.type = Types.resolve_type(type)

                name = parserContext.get_next_token()

                v.name = name
                c.fieldDefinitions.append(v)
            elif token == '}':
                break
            elif token != '{':
                fullyQualifiedName = token.split('.')
                c.name = fullyQualifiedName[-1]
                c.namespace = '.'.join(fullyQualifiedName[:-1])

        Types.register_custom_type(c)
        return c
Esempio n. 6
0
    def parse(self, parserContext):
        c = ClassDefinition()

        while True:
            token = parserContext.get_next_token()
            if token in ClassFlags:
                c.flags.append(token)
            elif token == 'extends':
                c.base = parserContext.get_next_token()
            elif token == '.method':
                m = MethodParser().parse(parserContext)
                m.namespace = c.namespace + '.' + c.name       
                c.methods.append(m)
                parserContext.methods.append(m)
                # fixme - should i add to both?
            elif token == '.field':
                v = Variable()
                visibility = parserContext.get_next_token()
                type = parserContext.get_next_token() # fixme - type, visibility
                if type == 'class':
                    type = parserContext.get_next_token()
                
                if Types.BuiltInTypes.has_key(type):
                    v.type = Types.BuiltInTypes[type]
                else:
                    v.type = Types.resolve_type(type)
                    
                name = parserContext.get_next_token()
               
                v.name = name
                c.fieldDefinitions.append(v)
            elif token == '}':
                break
            elif token != '{':
                fullyQualifiedName = token.split('.')
                c.name = fullyQualifiedName[-1]
                c.namespace = '.'.join(fullyQualifiedName[:-1])
                
        Types.register_custom_type(c)
        return c