Esempio n. 1
0
        public void End(MethodBody methodBody)
        {
            var withInVariable = methodBody.AddVariable(typeSystem.Boolean);
            var processor      = methodBody.GetILProcessor();

            //loop end
            processor.Append(loopEnd);

            //i++
            processor.Append(IncrementIndex);
            processor.Emit(OpCodes.Ldc_I4_1);
            processor.Emit(OpCodes.Add);
            processor.Append(InstructionHelper.StLoc(indexDefinition));

            //i < arr.Length
            processor.Append(loopCheck);

            //arr.Length
            processor.Append(InstructionHelper.LdArg(1));
            processor.Emit(OpCodes.Ldlen);
            processor.Emit(OpCodes.Conv_I4);

            processor.Emit(OpCodes.Clt);
            processor.Append(InstructionHelper.StLoc(withInVariable));

            //check within range
            processor.Append(InstructionHelper.LdLoc(withInVariable));
            processor.Emit(OpCodes.Brtrue_S, loopStart);
        }
Esempio n. 2
0
        public void Define(MethodBody methodBody)
        {
            var boolean   = methodBody.AddVariable(typeSystem.Boolean);
            var processor = methodBody.GetILProcessor();
            var jumpLabel = Instruction.Create(OpCodes.Nop);

            //if(collection.Count < 0)
            processor.Emit(OpCodes.Ldarg_0);
            processor.Emit(OpCodes.Ldfld, list);

            //get_count()
            processor.Emit(OpCodes.Callvirt, getCount);
            processor.Emit(OpCodes.Ldc_I4_0);
            processor.Emit(OpCodes.Cgt);
            processor.Append(InstructionHelper.StLoc(boolean));
            processor.Append(InstructionHelper.LdLoc(boolean));
            processor.Emit(OpCodes.Brfalse_S, jumpLabel);

            //collection.Clear();
            processor.Emit(OpCodes.Ldarg_0);
            processor.Emit(OpCodes.Ldfld, list);

            //clear()
            processor.Emit(OpCodes.Callvirt, clear);

            processor.Emit(OpCodes.Nop);
            processor.Append(jumpLabel);
        }
Esempio n. 3
0
        public void DefineLocal(MethodBody methodBody, TypeReference argType)
        {
            LocalDefinition = methodBody.AddVariable(argType);
            var processor = methodBody.GetILProcessor();

            processor.Append(InstructionHelper.LdArg(1));
            processor.Append(InstructionHelper.LdLoc(indexDefinition));
            processor.Append(InstructionHelper.LdElem(argType));
            processor.Append(InstructionHelper.StLoc(LocalDefinition));
        }
Esempio n. 4
0
        public void ReturnValue(MethodBody methodBody)
        {
            var variable  = methodBody.AddVariable(iEnumerable);
            var processor = methodBody.GetILProcessor();

            processor.Emit(OpCodes.Ldarg_0);
            processor.Emit(OpCodes.Ldfld, list);
            processor.Append(InstructionHelper.StLoc(variable));

            var loadEnumerable = InstructionHelper.LdLoc(variable);

            processor.Emit(OpCodes.Br_S, loadEnumerable);
            processor.Append(loadEnumerable);
        }
Esempio n. 5
0
        public void Start(MethodBody methodBody, int initValue = 0)
        {
            indexDefinition = methodBody.AddVariable(typeSystem.Int32);
            loopCheck       = InstructionHelper.LdLoc(indexDefinition);
            IncrementIndex  = InstructionHelper.LdLoc(indexDefinition);
            var processor = methodBody.GetILProcessor();

            //i = n
            processor.Append(InstructionHelper.LdcI4(initValue));
            processor.Append(InstructionHelper.StLoc(indexDefinition));

            //i < n check
            processor.Emit(OpCodes.Br_S, loopCheck);

            //loop start
            processor.Append(loopStart);
        }
Esempio n. 6
0
        void ILinqOperator.Define(MethodBody method, Instruction jumpInstruction)
        {
            var processor  = method.GetILProcessor();
            var returnType = funcMethod.Method.ReturnType;

            converted = converted ?? InstructionHelper.ConvertFunction(funcMethod, forLoop);

            if (!TypeReferenceEquals(returnType, forLoop.LocalDefinition.VariableType))
            {
                forLoop.LocalDefinition = method.AddVariable(returnType);
            }

            foreach (var instruction in converted)
            {
                processor.Append(instruction);
            }

            processor.Append(InstructionHelper.StLoc(forLoop.LocalDefinition));
        }
Esempio n. 7
0
        void ILinqOperator.Define(MethodBody method, Instruction jumpInstruction)
        {
            var checkVariable = method.AddVariable(typeSystem.Boolean);
            var processor     = method.GetILProcessor();

            converted = converted ?? InstructionHelper.ConvertFunction(funcMethod, forLoop);

            foreach (var instruction in converted)
            {
                processor.Append(instruction);
            }

            processor.Append(InstructionHelper.StLoc(checkVariable));
            processor.Append(InstructionHelper.LdLoc(checkVariable));

            //true
            processor.Emit(OpCodes.Brfalse_S, jumpInstruction);
            //continue
            processor.Emit(OpCodes.Br_S, forLoop.IncrementIndex);
        }