Beispiel #1
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);
        }
Beispiel #2
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();
            }
        }
Beispiel #3
0
        /// <inheritdoc />
        protected override ICliValue GetElementValue(ExecutionContext context, CilInstruction instruction, IDotNetArrayValue array, int index)
        {
            var environment = context.GetService <ICilRuntimeEnvironment>();

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

            return(array.LoadElement(index, typeLayout, environment.CliMarshaller));
        }
Beispiel #4
0
        /// <inheritdoc />
        protected override ICliValue GetElementValue(CilExecutionContext context, CilInstruction instruction, IDotNetArrayValue array,
                                                     int index)
        {
            var marshaller = context.GetService <ICilRuntimeEnvironment>().CliMarshaller;

            return(instruction.OpCode.Code switch
            {
                CilCode.Ldelem_I => array.LoadElementI(index, marshaller),
                CilCode.Ldelem_I1 => array.LoadElementI1(index, marshaller),
                CilCode.Ldelem_I2 => array.LoadElementI2(index, marshaller),
                CilCode.Ldelem_I4 => array.LoadElementI4(index, marshaller),
                CilCode.Ldelem_I8 => array.LoadElementI8(index, marshaller),
                CilCode.Ldelem_U1 => array.LoadElementU1(index, marshaller),
                CilCode.Ldelem_U2 => array.LoadElementU2(index, marshaller),
                CilCode.Ldelem_U4 => array.LoadElementU4(index, marshaller),
                CilCode.Ldelem_R4 => array.LoadElementR4(index, marshaller),
                CilCode.Ldelem_R8 => array.LoadElementR8(index, marshaller),
                CilCode.Ldelem_Ref => array.LoadElementRef(index, marshaller),
                _ => throw new ArgumentOutOfRangeException()
            });