/// <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); }
/// <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(); } }
/// <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)); }
/// <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() });