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