Пример #1
0
        /// <inheritdoc />
        public void StoreElement(int index, TypeMemoryLayout typeLayout, ICliValue value, ICliMarshaller marshaller)
        {
            AssertIndexValidity(index);
            var elementValue = marshaller.ToCtsValue(value, typeLayout.Type.ToTypeSignature());

            this.WriteStruct(index * (int)typeLayout.Size, _memoryAllocator, typeLayout, elementValue);
        }
Пример #2
0
        private void Verify(IFieldDescriptor field, ICliValue expectedValue)
        {
            var result = Dispatcher.Execute(ExecutionContext, new CilInstruction(CilOpCodes.Ldsfld, field));

            Assert.True(result.IsSuccess);
            Assert.Equal(expectedValue, ExecutionContext.ProgramState.Stack.Top);
        }
Пример #3
0
        private void SetAndVerify(IFieldDescriptor field, IConcreteValue fieldValue, ICliValue expectedValue)
        {
            var environment = ExecutionContext.GetService <ICilRuntimeEnvironment>();

            environment.StaticFieldFactory.Get(field).Value = fieldValue;
            Verify(field, expectedValue);
        }
Пример #4
0
        private void SetAndVerify(string fieldName, IConcreteValue fieldValue, ICliValue expectedValue)
        {
            var module = ModuleDefinition.FromFile(typeof(SimpleClass).Assembly.Location);
            var type   = (TypeDefinition)module.LookupMember(typeof(SimpleClass).MetadataToken);
            var field  = type.Fields.First(f => f.Name == fieldName);

            SetAndVerify(field, fieldValue, expectedValue);
        }
Пример #5
0
        /// <inheritdoc />
        public override DispatchResult Execute(CilExecutionContext context, CilInstruction instruction)
        {
            var environment = context.GetService <ICilRuntimeEnvironment>();
            var stack       = context.ProgramState.Stack;

            var value = (ICliValue)stack.Pop();

            bool      overflowed = false;
            ICliValue newValue   = instruction.OpCode.Code switch
            {
                CilCode.Conv_I1 => value.ConvertToI1(false, out _),
                CilCode.Conv_Ovf_I1 => value.ConvertToI1(false, out overflowed),
                CilCode.Conv_Ovf_I1_Un => value.ConvertToI1(true, out overflowed),
                CilCode.Conv_U1 => value.ConvertToU1(false, out _),
                CilCode.Conv_Ovf_U1 => value.ConvertToU1(false, out overflowed),
                CilCode.Conv_Ovf_U1_Un => value.ConvertToU1(true, out overflowed),
                CilCode.Conv_I2 => value.ConvertToI2(false, out _),
                CilCode.Conv_Ovf_I2 => value.ConvertToI2(false, out overflowed),
                CilCode.Conv_Ovf_I2_Un => value.ConvertToI2(true, out overflowed),
                CilCode.Conv_U2 => value.ConvertToU2(false, out _),
                CilCode.Conv_Ovf_U2 => value.ConvertToU2(false, out overflowed),
                CilCode.Conv_Ovf_U2_Un => value.ConvertToU2(true, out overflowed),
                CilCode.Conv_I4 => value.ConvertToI4(false, out _),
                CilCode.Conv_Ovf_I4 => value.ConvertToI4(false, out overflowed),
                CilCode.Conv_Ovf_I4_Un => value.ConvertToI4(true, out overflowed),
                CilCode.Conv_U4 => value.ConvertToU4(false, out _),
                CilCode.Conv_Ovf_U4 => value.ConvertToU4(false, out overflowed),
                CilCode.Conv_Ovf_U4_Un => value.ConvertToU4(true, out overflowed),
                CilCode.Conv_I8 => value.ConvertToI8(false, out _),
                CilCode.Conv_Ovf_I8 => value.ConvertToI8(false, out overflowed),
                CilCode.Conv_Ovf_I8_Un => value.ConvertToI8(true, out overflowed),
                CilCode.Conv_U8 => value.ConvertToU8(false, out _),
                CilCode.Conv_Ovf_U8 => value.ConvertToU8(false, out overflowed),
                CilCode.Conv_Ovf_U8_Un => value.ConvertToU8(true, out overflowed),
                CilCode.Conv_I => value.ConvertToI(environment.Is32Bit, false, out _),
                CilCode.Conv_Ovf_I => value.ConvertToI(environment.Is32Bit, false, out overflowed),
                CilCode.Conv_Ovf_I_Un => value.ConvertToI(environment.Is32Bit, true, out overflowed),
                CilCode.Conv_U => value.ConvertToU(environment.Is32Bit, false, out _),
                CilCode.Conv_Ovf_U => value.ConvertToU(environment.Is32Bit, false, out overflowed),
                CilCode.Conv_Ovf_U_Un => value.ConvertToU(environment.Is32Bit, true, out overflowed),
                CilCode.Conv_R4 => value.ConvertToR4(),
                CilCode.Conv_R8 => value.ConvertToR8(),
                CilCode.Conv_R_Un => value.ConvertToR(),
                _ => throw new ArgumentOutOfRangeException()
            };

            if (overflowed)
            {
                return(new DispatchResult(new OverflowException()));
            }

            context.ProgramState.Stack.Push(newValue);
            return(base.Execute(context, instruction));
        }
    }
Пример #6
0
        /// <inheritdoc />
        protected override void StoreElement(
            ExecutionContext context,
            CilInstruction instruction,
            IDotNetArrayValue array,
            int index,
            ICliValue value)
        {
            var environment = context.GetService <ICilRuntimeEnvironment>();

            var type       = (ITypeDescriptor)instruction.Operand;
            var typeLayout = environment.ValueFactory.GetTypeMemoryLayout(type);

            array.StoreElement(index, typeLayout, value, environment.CliMarshaller);
        }
Пример #7
0
        private void Verify(string fieldName, ICliValue newValue, IConcreteValue expectedValue)
        {
            var module = ModuleDefinition.FromFile(typeof(SimpleClass).Assembly.Location);
            var type   = (TypeDefinition)module.LookupMember(typeof(SimpleClass).MetadataToken);
            var field  = type.Fields.First(f => f.Name == fieldName);

            var environment = ExecutionContext.GetService <ICilRuntimeEnvironment>();
            var staticField = environment.StaticFieldFactory.Get(field);

            ExecutionContext.ProgramState.Stack.Push(newValue);
            var result = Dispatcher.Execute(ExecutionContext, new CilInstruction(CilOpCodes.Stsfld, field));

            Assert.True(result.IsSuccess);
            Assert.Equal(expectedValue, staticField.Value);
        }
Пример #8
0
        private void VerifyUndocumentedWriteStatic(IConcreteValue instanceObject, ICliValue stackValue, IConcreteValue expectedValue)
        {
            var environment = ExecutionContext.GetService <ICilRuntimeEnvironment>();
            var stack       = ExecutionContext.ProgramState.Stack;

            // Set initial field value.
            var simpleClassType = LookupTestType(typeof(SimpleClass));
            var field           = simpleClassType.Fields.First(f => f.Name == nameof(SimpleClass.StaticIntField));

            // Push random object.
            stack.Push(instanceObject);
            stack.Push(stackValue);

            // Test.
            var result = Dispatcher.Execute(ExecutionContext, new CilInstruction(CilOpCodes.Stfld, field));

            Assert.True(result.IsSuccess);
            Assert.Equal(expectedValue, environment.StaticFieldFactory.Get(field).Value);
        }
Пример #9
0
        private void Verify(string fieldName, ICliValue stackValue, IConcreteValue expectedValue)
        {
            var environment = ExecutionContext.GetService <ICilRuntimeEnvironment>();
            var stack       = ExecutionContext.ProgramState.Stack;

            // Look up relevant metadata.
            var simpleClassType = LookupTestType(typeof(SimpleClass));
            var field           = simpleClassType.Fields.First(f => f.Name == fieldName);

            // Create new virtual instance and push on stack.
            var value = new HleObjectValue(simpleClassType.ToTypeSignature(), environment.Is32Bit);

            stack.Push(environment.CliMarshaller.ToCliValue(value, simpleClassType.ToTypeSignature()));
            stack.Push(stackValue);

            // Test stfld.
            var result = Dispatcher.Execute(ExecutionContext, new CilInstruction(CilOpCodes.Stfld, field));

            Assert.True(result.IsSuccess);
            Assert.Equal(expectedValue, value.GetFieldValue(field));
        }
Пример #10
0
        private void Verify(string fieldName, IConcreteValue fieldValue, ICliValue expectedValue)
        {
            var environment = ExecutionContext.GetService <ICilRuntimeEnvironment>();
            var stack       = ExecutionContext.ProgramState.Stack;

            // Look up relevant metadata.
            var simpleClassType = LookupTestType(typeof(SimpleClass));
            var field           = simpleClassType.Fields.First(f => f.Name == fieldName);

            // Create new virtual instance and push on stack.
            var objectRef = environment.ValueFactory.CreateObject(simpleClassType.ToTypeSignature(), true);
            var contents  = (IDotNetStructValue)objectRef.ReferencedObject;

            contents.SetFieldValue(field, fieldValue);
            stack.Push(environment.CliMarshaller.ToCliValue(objectRef, simpleClassType.ToTypeSignature()));

            // Test ldfld.
            var result = Dispatcher.Execute(ExecutionContext, new CilInstruction(CilOpCodes.Ldfld, field));

            Assert.True(result.IsSuccess);
            Assert.Equal(expectedValue, stack.Top);
        }
Пример #11
0
        /// <inheritdoc />
        protected override void StoreElement(ExecutionContext context, CilInstruction instruction,
                                             IDotNetArrayValue dotNetArray, int index, ICliValue value)
        {
            var marshaller = context.GetService <ICilRuntimeEnvironment>().CliMarshaller;

            switch (instruction.OpCode.Code)
            {
            case CilCode.Stelem_I:
                dotNetArray.StoreElementI(index, value.InterpretAsI(marshaller.Is32Bit), marshaller);
                break;

            case CilCode.Stelem_I1:
                dotNetArray.StoreElementI1(index, value.InterpretAsI1(), marshaller);
                break;

            case CilCode.Stelem_I2:
                dotNetArray.StoreElementI2(index, value.InterpretAsI2(), marshaller);
                break;

            case CilCode.Stelem_I4:
                dotNetArray.StoreElementI4(index, value.InterpretAsI4(), marshaller);
                break;

            case CilCode.Stelem_I8:
                dotNetArray.StoreElementI8(index, value.InterpretAsI8(), marshaller);
                break;

            case CilCode.Stelem_R4:
                dotNetArray.StoreElementR4(index, value.InterpretAsR4(), marshaller);
                break;

            case CilCode.Stelem_R8:
                dotNetArray.StoreElementR8(index, value.InterpretAsR8(), marshaller);
                break;

            case CilCode.Stelem_Ref:
                dotNetArray.StoreElementRef(index, value.InterpretAsRef(marshaller.Is32Bit), marshaller);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
Пример #12
0
 /// <inheritdoc />
 public void StoreElement(int index, TypeMemoryLayout typeLayout, ICliValue value, ICliMarshaller marshaller) =>
     _values[index] = marshaller.ToCtsValue(value, typeLayout.Type.ToTypeSignature());
Пример #13
0
 /// <inheritdoc />
 public ICliValue InvokeIndirect(ICliValue address, MethodSignature methodSig, IEnumerable <ICliValue> arguments)
 {
     return(CreateReturnValue(methodSig));
 }
Пример #14
0
 public ICliValue InvokeIndirect(ICliValue address, MethodSignature methodSig, IEnumerable <ICliValue> arguments)
 {
     return(_original.InvokeIndirect(address, methodSig, arguments));
 }