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