Пример #1
0
        public override void Visit(Model.Bytecode.LoadArrayElementInstruction instruction)
        {
            Mono.Cecil.Cil.Instruction res = null;

            if (instruction.Operation == AnalysisNet.Bytecode.LoadArrayElementOperation.Address)
            {
                if (!instruction.Array.IsVector)
                {
                    Cecil.MethodReference arrayAddress = ArrayHelper.ArrayAddress(referenceGenerator.TypeReference(instruction.Array) as Cecil.ArrayType);
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Call, arrayAddress);
                }
                else
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelema, referenceGenerator.TypeReference(instruction.Array.ElementsType));
                }
            }
            else if (instruction.Operation == AnalysisNet.Bytecode.LoadArrayElementOperation.Content)
            {
                if (!instruction.Array.IsVector)
                {
                    Cecil.MethodReference arrayGet = ArrayHelper.ArrayGet(referenceGenerator.TypeReference(instruction.Array) as Cecil.ArrayType);

                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Call, arrayGet);
                }
                else if (instruction.Array.ElementsType.Equals(Model.Types.PlatformType.IntPtr))
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelem_I);
                }
                else if (instruction.Array.ElementsType.Equals(Model.Types.PlatformType.Int8))
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelem_I1);
                }
                else if (instruction.Array.ElementsType.Equals(Model.Types.PlatformType.Int16))
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelem_I2);
                }
                else if (instruction.Array.ElementsType.Equals(Model.Types.PlatformType.Int32))
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelem_I4);
                }
                else if (instruction.Array.ElementsType.Equals(Model.Types.PlatformType.Int64))
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelem_I8);
                }
                else if (instruction.Array.ElementsType.Equals(Model.Types.PlatformType.Float32))
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelem_R4);
                }
                else if (instruction.Array.ElementsType.Equals(Model.Types.PlatformType.Float64))
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelem_R8);
                }
                else if (instruction.Array.ElementsType.Equals(Model.Types.PlatformType.Float64))
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelem_R8);
                }
                else if (instruction.Array.ElementsType.TypeKind == Model.Types.TypeKind.ReferenceType)
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelem_Ref);
                }
                else
                {
                    res = processor.Create(Mono.Cecil.Cil.OpCodes.Ldelem_Any, referenceGenerator.TypeReference(instruction.Array.ElementsType));
                }
            }
            else
            {
                throw new NotImplementedException();
            }

            Result = new List <Mono.Cecil.Cil.Instruction>()
            {
                res
            };
        }