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)
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)
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)
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)
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
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