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